![]() |
|
Главная Терминология Хоора 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. Выражения в инфиксной и постфиксной записях
просто задерживается. В этот момент читатель должен убе-диться, что взаимная связь процедур грамматического разбора учитывает соответствующую интерпретацию принятых правил приоритета различных операций. - Тран.сля1щя -усдовн-ьлх операторов и циклов несколько менее тривиальна. В этом случае нужно формировать команды перехода, для которых сам адрес перехода иногда еще неизвестен. Если обязательно, чтобы формируемые команды располагались строго последовательно в виде выходного файла, то необходима двупроходная схема транслятора. На втором проходе неполные команды перехода дополняются адресами. Другое решение, реализованное в данном трансляторе, - это помещение команды в массив, т. е. в память с непосредственным доступом, что позволяет вставлять недостающие адреса, как только они становятся известны. Такую операцию иногда называют фиксацией (fixup). Единственное дополнительное действие, которое нужно выполнять при формировании такого перехода вперед, - это запоминание его местоположения, т. е. индекса в памяти для программы. Затем во время фиксации этот адрес используется для нахождения неполной команды. Детали опять можно видеть в программе 5.6 (см. процедуры, обрабатывающие операторы условия и цикла). Команды, соответствующие этим операторам, формируются по следующему шаблону (L1 и L2 означают адреса команд): if С ttien S wtiile С do S команды для условия С JPC L1 команды оператора S LI: ... L1: команды для С JPC L2 команды для S JMP L1 L2: ... Для удобства вводится вспомогательная процедура, назьь ваемая gen. Ей задаются три параметра, из которых она формирует команду. При этом автоматически увеличивается индекс сх, указывающий место, куда помещается очередная команда. |