Cтраница 1
Фаза генерации кода компилятором заключается в переводе этих ( супер) - комбинаторов в чисто кодовые последовательности, как это было предложено в гл. [1]
Чем сложнее фаза генерации кода, тем проще становятся оставшиеся фазы компилятора. Так, например, если фаза генерации кода производит коды на языке ассемблера, в дальнейшем потребуется одно - или двупросмотровый ассемблер для получения объектного модуля на машинном языке. Если информация в таблице символов компилятора целиком и без изменений передается ассемблеру, может использоваться однопросмот-ровый ассемблер; если передаются только операторы DS и DC, необходим двупросмотровый ассемблер. [2]
Нужно ли изменить фазу генерации кода и ее макроопределения. Опишите все изменения, которые необходимо сделать в программах данной фазы. [3]
Опишите тот выход, который передается фазе генерации кода. [4]
После этого данная фаза компиляции должна поместить информацию, необходимую для фазы генерации кода, в таблицу идентификаторов, в таблицу литералов и в матрицу. [5]
Машинно-зависимая оптимизация тесно связана с типом генерируемых команд и поэтому включается в фазу генерации кодов. Машинно-независимая оптимизация представляет собой отдельную фазу оптимизации компилятора. В этом разделе мы обсудим фазу оптимизации и четыре наиболее общих типа машинно-независимой оптимизации, упомянутых в разд. [6]
Определение значений меток и разрешение всех ссылок, Мы разделяем ( 1) фазу генерации кодов и ( 2) фазу сборки, так как они логически различны и часто реализуются отдельно. Функционально фаза сборки похожа на второй просмотр ассемблера. [7]
Матрица - фаза распределения памяти заводит элементы в матрице, чтобы убедиться, что фаза генерации кодов отведет память, необходимую для идентификаторов, временной памяти н литералов. Она также проверяет, что величинам по соответствующим адресам памяти присвоено начальное значение. [8]
В данном разделе мы рассмотрели некоторые из проблем, которые могут встретиться при реализации фазы генерации кода. Для простоты был описан механизм в форме макропроцессора Системы 360 ( см. гл. Во многих отношениях генерация кода, возможно, является наиболее сложной фазой компилятора. [9]
Таблица литералов - фаза распределения памяти назначает всем литералам адреса и заводит в матрице элемент, указывающий, что фаза генерации кода должна выделить эту память. [10]
Задача, которую должна решать фаза сборки, во многом зависит от того, что было сделано при выполнении фазы генерации кода. В другом случае, если фаза генерации кода оставляет команды и метки в символическом виде, фаза сборки должна: 1) разрешить все символьные ссылки; 2) вычислить адреса; 3) сгенерировать двоичные машинные команды; 4) выделить память и преобразовать литералы. [11]
Матрица - каждый элемент содержит операцию, определенную в базе данных кодового образца. Фаза генерации кода проверяет каждый элемент матрицы и определяет коды, которые необходимо генерировать. Операция в каждом элементе матрицы может рассматриваться как макровызов с операндами, используемыми в качестве фактических параметров. [12]
Генерирует код и адреса. Фаза генерации кода должна либо выделить память и присвоить начальное значение, либо сгенерировать код, который будет выделять память во время выполнения программы. Использование структур данных еще больше усложняет генерацию реальных адресов. Он должен сгенерировать L 1 4 ( 8 9), где 4 ( 8 9) обозначает действительный адрес. [13]
Фаза распределения памяти для простых скаляров помещает их адрес относительно начала области в поле адреса элемента таблицы идентификаторов. Фаза генерации кода для простого оператора присваивания должна сформировать адрес для В и А. [14]
Указание о длине помещается во все элементы таблицы идентификаторов. Поле длины используется фазой генерации кода для создания соответствующего кода ( например, А. Таким образом, шаги с 1 по 3, примененные к нашему примеру, в результате дают таблицу идентификаторов, показанную на рис. 8.32. Читатель сам может определить длину и адрес. [15]