Главная  Терминология Хоора 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 [ 124 ] 125 126 127 128 129 130 131 132 133

Рис. 5.8. Формат команды.

ствуюгтгодготгера ции (/) и параметр, состоящий из одной или двух частей (а и либо только а)*). В случае команды OPR, выполняющей некоторое действие, параметр а задает это действие; в других случаях это либо число (LIT, INT), либо адрес в программе (JMP, JPC, CAL), либо адрес данных (LOD, STO).

Подробно работа мащины ПЛ/0 определяется процедурой, называемой interpret, которая является частью программы 5.6, объединяющей законченный транслятор с интерпретатором в систему, которая транслирует, а затем выполняет программы на ПЛ/0. Мы предлагаем в качестве упражнения модифицировать эту программу, чтобы она формировала рабочую программу для какого-либо существующего процессора. Необходимое для этого увеличение программы можно считать мерой того, насколько выбранная вычислительная машина подходит для поставленной задачи.

Безусловно, представленную вычислительную машину ПЛ/0 можно было бы организовать более искусно, с тем чтобы некоторые операции выполнялись эффективнее. Например, можно было бы улучшить механизм адресации. Принятая схема была выбрана из-за ее простоты, а также потому, что все усовершенствования должны фактически основываться на ней и из нее выводиться.

5.11. формирование команд

Чтобы транслятор мог сформировать команду, ему должны быть известны ее код операции и параметр, который представляет собой либо число (саму константу), либо адрес. Эти значения транслятор связывает с соответствующими иденти-

*) Поле 6 в команде (или параметре) используется для указания уровня (/еке/).- Прим. ред.

5. Выделение памяти для стека путем увеличения указател стека Т (INT).

6. Команды условной и безусловной передачи управления, используемые в условных операторах и циклах (JMP, JPC)

7. Команда, выполняющая арифметические действия и срав нения (OPR).

Так как в команду должны входить три компоненты, то она имеет следующий формат (см. рис. 5.8). Здесь присут-



5.11. Формирование команд 377

И|Икаторами при обработке описаний констант, переменных К процедур. Для этой цели таблица идентификаторов допол-Вена атрибутами, присущими каждому идентификатору. Если дентификатор обозначает константу, то его атрибутом яв-,яется значение этой константы, если идентификатор обозначает переменную, то его атрибутом является ее адрес, состояний из смещения и уровня, а если он обозначает процедуру, о его атрибутами являются адрес входа в эту процедуру и ее ровень. Расщиренное соответствующим образом описание пе-1еменной table ( таблица ) показано в программе 5.6. Это наглядный пример поэтапного уточнения (или дополнения) описания данных, происходящего одновременно с уточнением операторной части программы.

В то время как значения констант задаются в тексте программы, определять адреса транслятор должен самостоятельно. Язык ПЛ/О достаточно прост, поэтому переменные и команды размещаются в памяти последовательно. Следовательно, каждое описание переменной сопровождается увеличением индекса размещения данных на 1 (так как каждая переменная по определению мащины ПЛ/О занимает ровно одну ячейку памяти). Индекс размещения данных dx должен даициироваться в начале трансляции любой процедуры, поскольку ее сегмент данных первоначально пуст. [В действительности dx получает начальное значение 3, так как каждый сегмент данных содержит по крайней мере три внутренние переменные RA, DL, SL (см. предыдущий раздел).] Соответствующие вычисления, позволяющие определить атрибуты идентификатора, включены в процедуру enter, которая добав- .1яет в таблицу новые идентификаторы.

При наличии этой информации об операндах команды формируются довольно просто. Благодаря стековой органи-рции мащины ПЛ/О существует практически однозначное Ьоответствие между операндами и операциями исходного дазыка, с одной стороны, и командами рабочей программы, ,с другой стороны. Транслятор лишь должен выполнить необ- одимое преобразование в постфиксную форму. Постфиксная форма означает, что знаки операции всегда следуют за своими операндами, а не вставляются между ними, как в обычной инфиксной форме. Постфиксную форму иногда также называют польской записью (так как ее изобрел поляк Лукасе-Вич) или бесскобочной записью, так как она делает скобки Излишними. Примеры соответствия между инфиксной и постфиксной формами записи выражений приведены в табл. 5.4 (см. также разд. 4.4.2).

Очень простой способ выполнения такого преобразования Описан в процедурах expression и term из программы 5.6. Он fcocTOHT в том, что передача знака арифметической операции



Таблица 5.4. Выражения в инфиксной и постфиксной записях

Инфиксная запись

Постфиксная запись

х+У

х-{у + г) х*{у + z)*w

xy-z+ хугЛ- xyz + *w#

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

- Тран.сля1щя -усдовн-ьлх операторов и циклов несколько менее тривиальна. В этом случае нужно формировать команды перехода, для которых сам адрес перехода иногда еще неизвестен. Если обязательно, чтобы формируемые команды располагались строго последовательно в виде выходного файла, то необходима двупроходная схема транслятора. На втором проходе неполные команды перехода дополняются адресами. Другое решение, реализованное в данном трансляторе, - это помещение команды в массив, т. е. в память с непосредственным доступом, что позволяет вставлять недостающие адреса, как только они становятся известны. Такую операцию иногда называют фиксацией (fixup).

Единственное дополнительное действие, которое нужно выполнять при формировании такого перехода вперед, - это запоминание его местоположения, т. е. индекса в памяти для программы. Затем во время фиксации этот адрес используется для нахождения неполной команды. Детали опять можно видеть в программе 5.6 (см. процедуры, обрабатывающие операторы условия и цикла). Команды, соответствующие этим операторам, формируются по следующему шаблону (L1 и L2 означают адреса команд):

if С ttien S wtiile С do S

команды для условия С JPC L1

команды оператора S LI: ...

L1: команды для С JPC L2

команды для S JMP L1 L2: ...

Для удобства вводится вспомогательная процедура, назьь ваемая gen. Ей задаются три параметра, из которых она формирует команду. При этом автоматически увеличивается индекс сх, указывающий место, куда помещается очередная команда.




1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 [ 124 ] 125 126 127 128 129 130 131 132 133