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

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.10. Процессор ПЛ О 373

Ошибки, встречающиеся довольно часто и действительно являющиеся ошибками программиста (вызванными недо-Рсмотром или недопониманием), должны правильно диагно- стироваться и не вызывать каких-либо дальнейших отклонений в работе транслятора - сообщений о так называе-L мых наведенных ошибках.

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

i.lO. ПРОЦЕССОР ПЛ/0

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

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

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

В машину ПЛ/0 входят Две области памяти, регистр Команды и три регистра адресов. Память для программы, называемой рабочей программой, загружается транслятором



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

Каждая процедура в машине ПЛ/0 может содержать локальные переменные. Поскольку процедуры могут вызываться рекурсивно, память для этих переменных нельзя выделить до действительного обращения к процедуре. Следова--ельно, еетешъ! даНньгх-яя1г-отделБНвпг-процедур последовательно помещаются в стек 5. Так как вызовы процедур строго подчинены схеме первым вошел - последним вышел , стек является подходящим способом размещения. Каждая процедура обла дет своей собственной информацией: адресом команды ее вызова (так называемым адресом возврата), и адресом сегмента данных вызвавшей ее процедуры. Эти два адреса нужны для правильного возобновления работы программы после завершения работы процедуры. Их можно рассматривать как внутренние, или неявные локальные переменные, помещаемые в сегменте данных процедуры. Мы называем их адресом возврата RA и динамической связкой DL. Начало динамической цепочки, т. е. адрес размещенного последним сегмента данных, сохраняется в регистре базового адреса В.

Поскольку действительное выделение памяти происходит во время выполнения (интерпретации) программы, транслятор не может формировать рабочую программу с абсолютными адресами. Он может лишь задать расположение переменных внутри сегмента данных, поэтому способен выдавать только относительные адреса. Интерпретатор должен добавлять к этому так называемому смеш,ению базовый адрес соответствующего сегмента данных. Если переменная локальна в процедуре, интерпретируемой в данный момент, то этот базовый адрес задается регистром В. В противном случае его можно получить, спускаясь по цепочке сегментов данных. Однако транслятору может быть известна только статическая глубина пути доступа к переменной, тогда как динамическая цепочка (цепочка динамических связок) отражает динамическую историю обращений к процедурам. К сожалению, эти два пути доступа не обязательно одинаковы.

Например, пусть процедура А обращается к процедуре Bj описанной как локальная в А, процедура В вызывает С, опй-



Б.10. Процессор ПЛ/О

данную как локальная в В, а С вызывает В рекурсивно. Мы (говорим, что А описана на уровне 1, В - на уровне 2, С - на jfpoBHC 3 (см. рис. 5.7). Если в В имеется обращение к пере-jieHHOfl а, описанной как локальная в Л, то транслятору {{звестно, что между А и В существует разница уровней, равная 1. Однако один шаг по динамической цепочке приводит :переменной, локальной в С!

. ..... DL RA SL


Рис. 5.7. Стек машины для ПЛ/О.

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

Итак, адреса формируются в виде пар чисел, указывающих ;татическую разность уровней и относительное смещение знутри сегмента данных. Мы считаем, что каждая ячейка па-1ЯТИ может содержать адрес или целое число.

Множество команд машины ПЛ/О приспособлено к тре-юваниям языка ПЛ/О. Оно содержит такие команды:

. Засылки чисел (констант) в стек (LIT). i

Считывания переменных в вершину стека (LOD). i. Записи значения, находящегося в вершине стека (STO). ; (Соответствует оператору присваивания.) f- Команда активации подпрограммы, соответствующая об-I ращению к процедуре (CAL).




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