Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги из ГПНТБ / Килов Х.И. Фортран для БЭСМ-4 (МИФ) учеб. пособие

.pdf
Скачиваний:
5
Добавлен:
23.10.2023
Размер:
5.14 Mб
Скачать

- 90 -

промежуточной программы записана в двух расположенных под­ ряд ячейках. В первой ячейке находятся код и относительные

адреса (смещения), во второй - номера баз, соответствующих

втим смещениям.

При втором просмотре в МОЗУ-0 и МОЗУ-I постоянно находится та часть компилятора, которая производит обра­

ботку наиболее часто встречающихся операторов и полную обработку арифметических выражений (включая обработку об­

ращений к подпрограммам - эта часть находится в МОЗУ-1). Обработка встречающихся реже операторов осуществляется

так называемыми вставными блоками (ВБ). Вставные блоки

постоянно расположены на магнитном барабане, и по мере надобности ас одному вызываются в МОЗУ-0 (с ячейки 7000).

При обнаружении ошибок во время второго просмотра

на АЦПУ печатается информация о них: номер ошибки, тексто­

вая информация и номер оператора ФОРГРАН-програмлы, в ко­ тором обнаружена ошибка (см.4^. Вслед за обнаружением ка­

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

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

этот оператор, а также о тиле последнего (является ли он

выполняемым, а если нет - начинается ли он с дозволенного символа и может ли он быть записан в любом иесте програм­ мы). Одновременно с распознаванием операторов проверяется

и правильность их последовательной записи.

Создаваемая вторым просмотром промежуточная рабо­ чая программа постранично записывается на магнитный ба­ рабан. Если второй просмотр не обнаружил ошибок, то после

- 91 -

обработки оператора END ФОРГРАН-программы происходит

запись остатка промежуточной программы на магнитный ба­

рабан и вызов в МОЗУ-1 той части компилятора, которая

осуществляет третий просмотр,

5.2.1, Структура, распределение и типы

памяти рабочей программы

5 . 2 . I . I . Рабочая программа оостоит из:

5 . 2 . I . I . I . Обычных команд, непосредственно реализующих операторы ФОРТРАН-программы.

5.2Л,1.2. "Вкрапленных"-команд, расположенных вслед за

массивом обычных команд, и служащих для реализации об­ работки некоторых элементов массивов о переменными, ин­ дексами, некоторых возможностей оператора D0 , инфор­

мационных строк оператора ]?0шлАТ и т.п. Эти

команды являются либо псевдокомандами, которые служат

для формирования обычных команд, либо•информациошшми строками стандартной программы печати на АЦТГ/, либо (короткими) блоками, реализующими преобразования пара­

метра внешнего цикла для его использования во внутрен­

нем (см.также 5.2.4.). "Вкрапленные" команды при третьем

просмотре обрабатываются тшс ке, как и обычные команды,

5.2.1Л.3. Констант, расположенных вслед за массивом "вкрапленных" команд, и используемых для формирования или изменения команд. В отличие от "вкрапленяыхи цоманд, константы не обрабатываются при третьем просмотре.

5.2.1 Л.4. Чисел, расположенных вслед за массивом кон­ стант.

5.2.I.I.5. "Добавочных" команд, расположенных вслед за

массивом чисел и создаваемых, если это нужно, при треть­

ем просмотре для реализации операторов

О0Т0 и ариф­

метических

IF , в которых встречаются выходы ид об­

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

5.2.1.2, Перед началом третьего просмотра дана массива "добавочных" команд еще неизвестна, и в то же время тре­ буется .указание базовых адресов для переменных, различвых рабочих ячеек (см*также 5,2,1.3,4,) к массивов МОЗУ- -0. Поэтому нсо указанные делздшш размещаются в конце МСЗУ-0, нт-посрвдо-тьенно перед программой НС-2М. В СВЯЗИ с эти*! рабочее пел? ИС-СМ переэйэдаетон вверх, в сторону уменьшения адресов.. Его качало располагается вслед за маосююк "добавочных" команд, э конец - перед массивом указекинх выше г.едтчш;. Наивное р~;1очего коля ссущеотаяяе*с.ч прогрг-лчиой старта (см. 5.).

R.2.1.3, Второй иросхотр резервирует место в памяти для ЯВНО ИЛИ НЙЯ5ИО ЙГ.ПОЛЬЗУЗМЬ."' а ФОГТ?АН -ЯрОгрЫА'делачи...

'5.2.1,3,1. Кавдд-i *;рость.' аерьмеьпой соответствует одна ячейка, 'з которой располагается ее значение. Адреса этих ячеек располагаются, КАК правило, подряд, а порядке яв­ ного или неяркого описании переменных. Однако, в некото­ рых случаях компилятор саг,: создает вспомогательные (внутренние) простые переменные и присваивает им адреса вперемешку с адреса*: проезд/ переменных, явно шлюдьзу-- емих в «ЮРТРАП-програгале. Поэтому расположение подряд гарантируется лишь для адресов явно от;сашшх простых пе­ ременных*

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

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

Однако, обработка каждой отдельно взятой програм-

-93 -

мной единицы осуществляется независимо от других, и, в частности, таблица локальных простых переменных организует­ ся как стек (см., напр., С 83 > п « п ° 2 . 2 , 1 . и 2 , 2 . 2 . , и

£ 93) . Это осуществляется аналогично составлению таблиц для компиляции ассемблером отдельных (независимых)блоков [ 9 ] , с той лишь разницей, что локальным простым перемен­ ным различных программных единиц присваиваются различные адреса в памяти.

Таким образом, в различных программных единицах можно использовать одинаковые идентификаторы для обозна­ чения различных (локальных) простых переменных.

Таблица глобальных простых переменных,в отличие от таблиц локальных проотых переменных, при компиляции посто­ янно находится в памяти.

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

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

В частности, если этот адрес является одним ив адресов-ра­ бочей программы, то последняя в процессе выполнения может испортиться.

5.2.1.3.2. Каждому массиву соответствует набор из несксль- K.JC расположенных подряд ячеек. Длина набора равна коли­ честву элементов этого массива. В указанных ячейках распо-

-94 -

латаются значения элементов массива. Их адреса распола­

гаются в соответствующих видах памяти (МОЗУ-0, МОЗУ-1

или динамическая память) подряд, в порядке описания массивов в ФОРТРАН-программе.

Обработка описаний массивов осуществляется так же,

как и обработка описаний простых переменных (см.

5.2.X • 3. X.) •

5.2.1.3.3.При компиляции некоторых конструкций ФОРТРАН-

программы в состав рабочей программы включаются констан­ ты и ч*.сла, Примерами таких конструкций являются обраще­ ния к динамическим массивам, числа в арифметических выра­

жениях и т.п.

Таблицы констант и чисел создаются компилятором

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

места рабочей программы.

В таблицу констант или в таблицу чисел заносятся (по мере надобности) лишь те величины, которых в соот­ ветствующей таблице еще нет. Числа 1,2,3 и 10 не зано­ сятся в таблицу чисел. Вместо этого компилятор програм­ мирует обращения к соответствующим ячейкам ИС-2М [ 4 ] .

При компиляции команд автокода имеющиеся в ИС-2М константы L 4"] не заносятся в таблицу констант; вместо этого также программируется обращение к соответствующим

ячейкам ИС-2М.

5.2.1.3.4. При компиляции арифметических выражений часто возникает необходимость в выделении одной или нескольких рабочих ячеек для хранения промежуточных результатов.

Для этой цели в компиляторе отводится одна ячейка R , каждый из 45 разрядов которой соответствует одной рабочей

ячейке. Если в каком-либо разряде ячейки н находится единица, то это означает, что соответствующая рабочая

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

момент свободна. •

-95 -

При выборе рабочей ячейки происходит поиск первого, считая слева, нулевого разряда в ячейке К • Зтот разряд

становится единичным, и его номер считается (относитель­

ным) адресом рабочей ячейки. Как только сформируется коман­ да, в первом или втором адресе которой встречается обраще­

ние к содержимому некоторой рабочей ячейки Г0 , последняя считается свободной, и в соответствующий разряд ячейки R

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

цессе ее работы.. Такие псевдокоманды в рабочей программе не выполняются и, следовательно,, должны быть расположены

вне массива обычных команд (ом. 5 . 2 . I . I . I . ) . При втором . просмотре эти псевдокоманды создаются внутри массива

обычных команд, но помечаются специальным признаком, ука­

зывающим, что данная команда является "вкрапленной". В дальнейшем, при третьем просмотре, все "вкрапленные"

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

К числу "вкрапленных" команд относятся также инфор­

мационные строки стандартной программы Печати на АЦПУ,

указывающие формат втой печати; блоки, реализующие преоб­

разование параметра внешнего цикла при его использовании во внутреннем и др. Идея такого рода команд принадлежит Б.Б.Леви.

5.2.1.3.6. При выходе (с помощью оператора G0 Т 0 или арифметического I F ) из области цикла требуется сохра­ нить значение параметра этого цикла. Поскольку' параметр цикла внутри его области хранится в регистре адреса, при описанном переходе необходимо выполнение добавочной коман­ ды.

Если метка, встречающаяся в таком операторе Q0 Т0 v ш I F , описана (т.е. помечает какой-либо оператор) до

этого оператора, то указанная команда формируется при вто­ ром просмотре. В противном случае второй просмотр сделать

этого не может, т.к. остается неизвестным, вне или внутри

- Ъо -

области цикла будет расположена данная метка. Выясняется

это лиль при третьем просмотре. Тогда и формируются, если

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

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

5.2.2. Обработка меток.

При обработке каждого оператора ире:,;де всего происходит обработка его метки, если она ссаь.

Если оператор, расположенный вслед за Gj0 Т0,ариф-

метическим X р ^ •STffiP пли RETURМ , не помечен, vo он

может быть только командой автокода (константой).

В противном случае компилятор выдаст сообщите об ошибке.

Невыполняема оператор, за исключением оператора

Fj^RM AT. не должен снабжаться меткой.

Метки в программных единицах являются локальными.

Ото означает, что разные операторы могут быть помечены одинаково в том и только Б том случае, когда они находят­ ся в различных программных единицах.

Когдгалятор проверяет правильность употребления ме­

ток, помечающих операторы ипутри областей циклон. Все циклы

в программной единице нумеруются подряд,начинал с первого.

Если в операторе(3)0 Т<£ или арифметическом IJF

.расположенном

в цикле с номером

.встретилась метка пг

, то она--может

помечать оператор.расположенный либо вне области какого-

либо цикла, либо внутри области объемлющего цикла ( с

номером WJ^W.J

) . После завершения какого-либо цикла все

описанные в нем метки становятся недоступными для обраще­ ния, т. е. считается, что они расположены в цикле с максималь­ но возможным номером Ы^. Исключение составляют метки опера­ торов F0RMA.T , В таблице меток для каждой метки указыва­

ется номер цикла ее первого употребления

( или описания,

если оно расположено раньше

), а

при описании ( или,

соответственно, первом употреблении

)

происхо -

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

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

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

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

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 после формирования команд возведения в степень спуск не произойдет, хотя старшинство операции умнржения, казалось

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

ч

Соседние файлы в папке книги из ГПНТБ