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