В конструкции компилятора, базовый блок представляет собой прямолинейную кодовую последовательность без ветвлений, кроме входа, и без ветвлений, кроме выхода. Эта ограниченная форма делает базовый блок легко поддающимся анализу. Компиляторы обычно разбивают программы на их базовые блоки в качестве первого шага в процессе анализа. Базовые блоки образуют вершины или узлы в графе потока управления.
Код в базовом блоке имеет:
В этих обстоятельствах, когда выполняется первая команда в базовом блоке, остальные инструкции обязательно выполняются ровно один раз по порядку.
Код может быть исходным кодом, ассемблерным кодом или какой-либо другой последовательностью инструкций.
Более формально последовательность инструкций образует базовый блок, если:
Это определение в некотором смысле более общее, чем интуитивное. Например, он позволяет безусловные переходы к меткам, не предназначенным для других переходов. Это определение воплощает свойства, которые упрощают работу с базовыми блоками при построении алгоритма.
Блоки, которым может передаваться управление после достижения конца блока, называются преемниками этого блока, в то время как блоки, из которых управление могло прийти при входе в блок, называются предшественниками этого блока. На начало базового блока можно перейти из более чем одного места.
Алгоритм для генерации базовых блоков из листинга кода прост: анализатор просматривает код, отмечая границы блоков, которые являются инструкциями, которые могут либо начинают, либо заканчивают блок, потому что они либо передают управление, либо принимают управление из другой точки. Затем листинг просто «разрезается» в каждой из этих точек, и основные блоки остаются.
Обратите внимание, что этот метод не всегда генерирует максимальные базовые блоки по формальному определению, но обычно их достаточно (максимальные базовые блоки - это базовые блоки, которые не могут быть расширены путем включения соседних блоков без нарушения определения базовых блоков). блок).
Вход : последовательность инструкций (в основном трехадресный код ).. Выход : список базовых блоков с каждым трехадресным оператором ровно в одном блоке.
Инструкции, завершающие базовый блок, включают следующее:
longjmp
и exit
Инструкции, которые начинают новый базовый блок, включают следующее:
Обратите внимание, что, поскольку управление никогда не может пройти через конец базового блока, некоторые границы блоков, возможно, придется изменить после нахождения базовых блоков. В частности, проходящие условные переходы должны быть заменены на двусторонние, а вызовы функций, генерирующие исключения, должны иметь безусловные переходы после них. Для этого может потребоваться добавление меток в начало других блоков.