Базовый блок


В конструкции компилятора базовый блок представляет собой прямолинейную последовательность кода без ответвлений внутрь, кроме входа, и без ответвлений наружу, кроме как на выходе. [1] [2] Эта ограниченная форма делает базовый блок легко поддающимся анализу. [3] Компиляторы обычно разлагают программы на их основные блоки в качестве первого шага в процессе анализа. Базовые блоки образуют вершины или узлы в графе потока управления .

При таких обстоятельствах всякий раз, когда выполняется первая инструкция в базовом блоке, остальные инструкции обязательно выполняются ровно один раз и по порядку. [4] [5]

Это определение в некотором смысле является более общим, чем интуитивное. Например, он допускает безусловный переход к меткам, не предназначенным для других переходов. Это определение воплощает в себе свойства, которые упрощают работу с базовыми блоками при построении алгоритма.

Блоки, на которые может перейти управление после достижения конца блока, называются преемниками этого блока , а блоки, от которых могло прийти управление при входе в блок, называются предшественниками этого блока . К началу базового блока можно перейти более чем из одного места.

Алгоритм генерации базовых блоков из листинга кода прост: анализатор просматривает код, отмечая границы блоков , которые являются инструкциями, которые могут либо начинать блок, либо заканчивать его, потому что они либо передают управление, либо принимают управление из другой точки . Затем листинг просто «обрезается» в каждой из этих точек, а базовые блоки остаются.

Обратите внимание, что этот метод не всегда генерирует максимальные базовые блоки по формальному определению, но их обычно достаточно (максимальные базовые блоки — это базовые блоки, которые не могут быть расширены за счет включения смежных блоков без нарушения определения базового блока [6] ).