Файл: Килов Х.И. Фортран для БЭСМ-4 (МИФ) учеб. пособие.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.07.2024

Просмотров: 103

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

дит упомянутая проверка (метка считается описанной там,

где она помечает оператор).

В таблице меток также указывается, помечает ли

метка оператор

FORMAT

. Такая метка может встречаться

только в операторах

P R I N T

. И обратно, если метка

встретилась в операторе

PRINT , то она может помечать

только оператор

? { № А Т .

 

 

Кроме явно используемых в ФОРТРАН-программе меток,

компилятор создает и вспомогательные метки

( при програм­

мировании логического

 

Г?

, вычисляемого

М М - . неко­

торых видов pjj , при создании вкрапленных команд

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

простых переменных.

После завершения обработки программной единицы

таблица меток свертывается, т.к. при дальнейшей обработке

(третьем просмотре) не испильзуются идентификаторы этих

меток. Таким образом, из каждых двух строк (идентификатор

метки + информация о ней) остается только одна - информа­ ционная - строка.

5.2.3. Обработка арифметических выражений

Обработка арифметических выражений является одной из наиболее сложных и важных задач второго просмотра. Эта обработка осуществляется рекурсивно, с использованием стека С 83 , С 9 3 • Описываемый здесь способ обработки арифметических выражений принадлежит Б.Б.Леви и, по-ви­ димому, ранее подробно не описывался. Он использовался (в значительно упрощенном виде) авторами данного компиля­

тора в

[ 10 j .

5.2.3.1. Формирование команд, реализующих арифметическое выражение, осложняется тем', что ЗЭСМ-4 является трех- (а

' е одно)- адресной машиной. Поэтому при подъеме на новый уровень рекурсии (в результате появления знака операции

с более высоким приоритетом или открывающей круглой скоб­ ки) происходит запоминание в стеке целого ряда параметров


- 98 -

ужо частично сформированной команда. Кроме этих параметров,

запоминается содержимое ячеек возврата (выхода) из блока

обработки самого арифметического выражения и блока выбора

"второго адреса", а также некоторая щ1формация о знаке

предшествующей операции.

Дело в том, что к моменту обнаружения символа (зна­

ка операции ш скобки), требующего подъема на новый уро­ вень рекурсии, уже известны (сформированы) код, первый и третий адреса создаваемой команды КО, Однако такая команда пока еще не может быть включена в рабочую программу, так как величина, находящаяся'в ее втором адресе, должна быть вычислена в рабочей программе раньше, чей ука.чанна-i команда будет выполнена. В связи с этим происходит запоминание в стекенекоторой информации и выбор рабочей ячейки (см. 5,2,1.3.4.), которая и будет вторым адресом команды КО. Эта жэ рабочая ячейка будет третьим адресом новой команды, формируемой на новом уровне рекурсии,- т.е. именно в нее попадет вычисляемая теперь величина. Такую работу осущест­

вляет блок выбора "второго адреса". Только после того, как эта величина будет вычислена, в рабочую программу можно будет включить команду КО. Разумеется, вся описанная рабо­ та может осуществляться рекурсивно.

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

кого-либо знака операции (или одного из символов,завершаю­

щих арифметическое выражешгеточки, закрывающей круглой скобки, точки с запятой или запятой). В зависимости от ре­

зультата "разведки", а также знака текущей и предшествую­ щей операции, происходит:

- либо формирование текущей команды с•продолжением работы на том же уровне рекурсии (например, в случае a tb -с формируется команда ooi.a.b.P , где R, -

рабочая ячейка);

-99 -

-либо запоминание в стеке "полуфабриката" (частично сфор­

мированной) текущей команды ( и некоторой другой информа­ ции) и подъем, волед за этим, на новый, бпее высокий уро­

вень рекурсии (например, в случае а + ь * с запоминает­

ся 001. а. ?. н );

- либо спуок на более низкий уровень рекурсии с восстанов­ лением информации, которая запоминалась в стеке, после

формирования текущей команды (например, в случае а + ъ * с-

-d спуск происходит после формирования команда умножения, и тогда, в результате спуска, прежде всего формируется и

включается в рабочую программу команда 001. &. R. R }

полуфабрикат которой запоминался в стеке, а вслед за этим продолжается работа на том же уровне рекурсии).

Такая работа осуществляется с помощью трех "таблиц

решений", аналогичных таблице, используемой при распознава­ нии операторов. Первая из эпос таблиц соответствует знакам текущей операции + или -, вторая * или /, и третья х к .

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

При входе в арифметическое выражение всегда проис­ ходит подъем на новый уровень рекурсии, а при выходе из (завершении) арифметического выражения - спуск. Таким об­ разом, при завершении арифметического выражения формирует­ ся заключительная команда засылки результата в требуемую ячейку (указанную в левой части оператора присваивания или, в других случаях, в рабочую ячейку).

Информация о знаке предшествующей операции нужна при решении вопроса о необходимости спуска на более низкий У1 шень рекурсии. Например, в ситуации a + t > * , c * d - e после формирования команд возведения в степень спуск не произойдет, хотя старшинство операции умнржения, казалось

бы, требует этого. Дело в том, что, не считая начала ариф-

ч



-100 -

метического выражения, здесь произошел один подъем на но- •ьык уровень рекурсии, при возведении в степень, и, следо­ вательно, неосходим только один спуск - перед формирова­ нием команды вычитания. Поэтому команды возведения в сте­ пень к умножения здесь сформируются на одном и том же уров­ не рекурсии; состояние стека изменится лишь перед формиро- вакЕ-эм команд возведения в степень и после формирования команды умножения.

5.2.3.5. Обработка элементов массивов

По-видямому, обработка элементов массивов является одним из ОСНОЕКЫХ факторов, определяющих скорость выполнения рабочей программы. При разработке компилятора этому вопро­ су было уделено особое внимание.

Обработка элемента массива в рабочей программе реа­ лизуется с помощью одной или нескольких команд или путем непосредственного вычисления при кошншщии адреса этого элемента (если таксе вычисление возможно)'. В рабочей про­ грамме не используются какие бы то ни оыло стандартные и/или типовые подпрограммы обработки элементов массивов.

Если элемент массива имеет постоянные (числовые) индексы и если при этом массив не является формальным па­ раметром, динамическим массивом или массивом с переменной структурой, первый индекс которого не равен единице,- то ад­ рес требуемого элемента вычисляется при КОМПИЛЯЦИИ И непо­ средственно вставляется в нужное место формируемой команды

в рабочей программе.

,Если элемент массива (не формального параметра и

'ке находящегося в динамической памяти) имеет вид А(1) или А(1+с), где с .- число, а I - параметр внутреннего(текущего) цикла, то адрес требуемого элемента массива также непосред­ ственно помещается в нужное место формируемой команды в ра­ бочей программе. При этом его "постоянная" часть, соответ­ ствующая адресу "элемента массива" А( 0) или А(+с), попа­ дает в первый,второй или третий адрес формируемой команды,

-101 -

а"переменная" часть - переменный индекс - реализуется пу­

тем помещения единицы, соответственно, в 45-й, 44-й или 43-й разряд этой команды (см. также 5.2.4.).

Пример

Набор операторов:

D0 '1

I = 1,100 s

0(1) = А(1) + В ;

реализуется в виде:

a l t

4-.52. О. 0001. О

5.01. а.

Ъ. с

 

1.12.0144. а1. 0001

(а и с — адреса "нулевых" элементов массивов А и С), Если эти два оператора сами расположены в цикле, то

команда "52" осуществляет и запоминание регистра адреса, который восстанавливается после команды "12".

Во всех остальных случаях обращение к элементу мас­

сива реализуется в виде одной или нескольких команд в ра­

бочей программе. Эти команды вычисляют индекс данного эле­

мента (в виде нормализованного числа), а затем формируют

команду выборки значения этого элемента в рабочую ячейку

или же засылки (числового) значения в ячейку, соответству­ ющую указанному элементу массива. Такое" формирование проис­ ходит путем превращения индекса из числа в единицы соответ­ ствующего адреса и сложения этой величины с псевдокомандой (сформированной как "вкрапленная" команда - см.5.2.1,3.5.). Если же массив находится в динамической памяти, то форми­

руется команда "17" или "37" [ 4 ] (которая работает в

создаваемой административной системе - см. 5.5°.

один аз адресов которой является адресом константы, соот­

ветствующей "постоянной" части индекса (или "нулевому" элементу массива), а другой - адресом "переменной" его -.асти. При этом формируются нужные константы и переменные в единицах третьего адреса.

Перед созданием команд, реализующих обращение к эле­

менту массива, запоминается полуфабрикат текущей команды,


- 102 -

реализующей вычисление значения арифметического выражения.

Это -необходима, Так как при создании любой команда портит­ ся полуфабрикат предыдущей. Затем, после создания и вклю­

чения з рабочую программу указанных команд обработки эле­ мента массива, этот полуфабрикат восстанавливается, и

дальнейшая обработка арифметического выражения происходит

обычным путем.

При формировании команд, реализующих обращение к

элементу массива, существенно яопользуется вид переменных, составляющих индекс - учитывается то, что они могут яв­

ляться параметрами внешнего или внутреннего циклов. Во всех этих случаях осуществляется (возможная) оптимизация.

Кроме того, в конструкциях вида " А(2 * I + 2 ) - Б ;" не

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

Следует учесть также, что в тех случаях, когда в левой части оператора присваивания расположен элемент глас-

сива - формального параметра, или массива из динамической

памяти, или массива со сложным переменным индексом,-коман­

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

остальные команды запоминаются и формируются (восстанавли­

ваются) лишь после того, как созданы команда, вычисляющие • значение арифметического выражения.

-5.2.3,3. Обработка возведений в степень

Поскольку в ФОРТРАН-программах из всевозможных ви­ дов возведения в степень чаще всего встречается возведение в целую положительную степень, компилятор реализует возве­ дение в целую степень ^ 2 не ,.в раде обращения к стандарт-

- 103 -

ной программе, а в виде ряда умножений. Более того, соот­

ветствующая цепочка умножений составляется здесь наиболее

коротким образом. Для этого показатель степени представля­ ется в виде суммы степеней двоек ( в единицах третьего ад­ реса; степень двойки - единичный разряд, ее отсутствие-ну­

левой). В частности, возведение в целую отрицательную сте­

пень (-п.)

значительно выгоднее записать не в виде

X**(-W)

, а в виде 4/X**N

, т.к. при такой

замене вместо обращения к (сраваителько долго работающей)

стандартной программе (СП-С001) будет создан набор команд умножения.

Возведение в степень 0.5 (но не 1/2 !) реализуется

ввиде извлечения квадратного корня по команде "44".

5.2.4.Обработка циклов и их параметров

Для упрощения обработки массивов с переменными ин­ дексами (ом. 5.2.3.2.) и по ряду других причин циклы реа­

лизуются так, что параметр текущего цикла находится в ре­

гистре адреса. Следовательно, первой командой цикла воег-

да является команда "52" или "72", а последней - "12" или

"40", в зависимости от того, являются ли границы или шаг цикла постоянными или переменными. Когдашаг цикла являет­ ся переменной, команда "40" формируется рабочей программой (до входа в цикл) из псевдокоманды ("вкрапленной" команды) и значения этого шага в единицах третьего адреса. Если те­ кущий цикл является внутренним, то команда начала цикла ("52" или "72") осуществляет также запоминание -значения регистра адреса - параметра внешнего цикла, который восста-

• навливается сразу после завершения внутреннего цикла. Параметр внешнего цикла во внутреннем цикле хранит­

ся в единицах второго адреса в той же ячейке, в которой'

х* анится значение переменной с этим идентификатором. Если, однако, параметр цикла должен быть использо­

ван как число в некотором арифметическом выражении, то ме­

тоды превращения такого параметра цикла в нормализованное