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

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

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

-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") осуществляет также запоминание -значения регистра адреса - параметра внешнего цикла, который восста-

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

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

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

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

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

-104 -

ЧИСЛО вависят от того, является ли он параметром внутрен­

него или внешнего цикла.

Параметр внутреннего цикла превращается (програм­ мным образом) в нормализованное число л засылается ь спе­

циальную ячейку (для чего один раз для каждого арифмети­ ческого выражения, в котором он встречается, создается

вспомогательная простая переменная, см. 5.2,1.3.1.). Па­

раметр же внешнего цикла превращается в нормализованное число, если это нужно, лишь однажды для всего внутреннего

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

ний цикл создается вспомогательная метка (см. 5.2.2.).ко-1 торая вначале лишь регистрируется, но не описывается. Ес­

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

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

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

размещается данное .число, для этого, кроме того, создает­

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

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

?летка, и если это так, то команда начала цикла

("52" или

"72")

заменяется на команду "16" обращения к соответствую­

щему блоку "вкрапленных" команд. Первая команда такого

блока совпадает с командой начала цикла "52" или "72".

 

При выходе из цикла с помощью оператора

с;0 Т0

или арифметического IP параметр внутреннего цикла пе­

реводится из регистра адреса в соответствующую ячейку

(где

располагается' значение переменной с таким идентифи-

- 105 -

катором) в единицах второго адреса. При &том параметры всех внешних циклов уже находятся в своих ячейках также в

единицах второго адреса. Поэтому, чтобы в данном случае

вне цикла обратиться к его параметру, следует использо­ вать встроенную функцию FL0AT ( С М . 2.6.3.3.), которая

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

вание происходит автоматически (см.выше).

5.2.5. Обработка условных операторов

Известно, что в арифметическом условном операторе

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

ответствующую оптишзацию.

Так, например, конструкция:

IF (А) 5,5,2 ;

5 : . . .

программируется в две команды:

0.02. О. а. 1

0.36. О. :2. О

В логическом условном операторе часто вслед за ус­

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

Так, например; оператор:

IF (J.NE.O) G0 Т0 1 ;

программируется в виде;

0.15. j . Оо О

0.70. О. :1.0

-IQ6 -

6.2.6.Обработка подпрограмм

Каждая подпрограмма пользователя в рабочей программе начи­

нается о команд (обозначения - см. СбЗ ):

~в г 4.52. РА*. О. РА"

0.16. О . а1. О

PA"s//0„52.

О .

РА. °1 выход из подпрограммы

«*_ .,#0.00.

О .

0 . 0 )

ais <первая рабочая команда подпрограммы >

Оператор RETURN

этой подпрограммы реализуется в виде:

0.16.о. РЛ". о

Обращение к такой подпрограмме (без учета замены парамет­ ров) происходит в виде:

0,16, М .

ЁГ . — —

Ы : . . .

Перед обращением к подпрограмме происходит:

-вычисление и пересылка значений фактических параметров,

соответствующее формальным параметрам - простым перемен­

ным, в нужные ячейки;

-пересылка в соответствующие ячейки (резервируемые при

описании подпрограммы) различных характеристик массивовфактических параметров (адреса начала, длины, количества столбцов и некоторых других);

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

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

стыми переменными - не параметрами цикла.

Внутри подпрограммы обработка элемента массива -

формального параметра происходит путем формирования команд:

.реализующих обращение к элементу соответствующего ему мас­

сива - фактического параметра)" с помощью характеристик

- 107 -

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

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

(ом. 2.6.3.).

Обработка обращения к подпрограммеформальному па­

раметру происходит также с учетом характеристик соответст­ вующей подпрограммы - фактического параметра, пересланных

ранее, при обращении к вызывающей подпрограмме. Поэтому необходимо, чтобы все подпрограммы - фактические параметры,

соответствующие одной и той же подпрограмме - формальному

параметру, тлели однотипную структуру (вид подпрограммы, количество и типы формальных пэрамефров). Кроме того, эти

подпрограммы должны быть указаны в операторе EXTJSBKAL (см. также 2.6.2.1.5. и 2.6.3.). Таким образом, программи­

рование обращения к подпрограмме - формальному параметру

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

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

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

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

нуса и косинуса- СП-ОООб, .для тангенса - СП-OQII, для арк­ тангенса - СП-0012, для экспоненты - СП-0003 и для натураль­

ного логарифма - -П-0004), либо программируется в виде од­ ной или нескольких команд непосредственно в рабочей програм­ ме (для всех остальных встроенных функций).

Замечание: СП-0001 реализует X**Y "Р11 V нецелом или отрицательном.

Поскольку фактический параметр может быть арифмети­

ческим выражением, в котором, в свою очередь, могут ветре-

- 108 -

титься обращения к функциям,- блок обработки подпрограмм

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

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

запоминается целый ряд величин, связанных с обработкой подпрограмм и арифметических выражений. Количество этих

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

ражений, и поэтому глубина рекурсии здесь будет меньше,

оставаясь при этом вполне достаточной для практических целей.

5,2,7., Печать ошибок

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

Е Л И номер неверно записанного фактического параметра. Блок печати ошибок постоянно находится на магнитном

барабане и вызывается в МОЗУ только при обнаружении ошиб­ ки. Этот блок по номеру ошибки находит и считывает с маг­ нитного барабана ее текст и печатает на АЦПУ информацию об ошибке.

В целом ряде ошибок номер имеет вид oC't. ^ , Это означает, что имеется несколько ошибок, являющихся разно­

видностями "укрупненной" ошибки с номером oi. А . Тогда на

АЦПУ печатается текст ошибки с номером об 4 , а уточняю­ щую информацию о конкретной разновидности ошибки пользова­

тель может получить в таблице ошибок (см. 40 по ее "полно­ меру"^ . Такая отруктура объясняется ограниченностью места (на магнитном барабане) для текстов ошибок и стрем­

лением предоставить пользователю по возможности наиболее подробную информацию об ошибках.

- 109 -

После обнаружения и печати ошибки восстанавливает­ ся содержимое МОЗУ, куда считывалоя блок печати ошибок,

после чего происходит переход на обработку очередного

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

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

продолжается текущая обработка. Иногда (например, при не­ верном заголовке подпрограммы) происходит останов, т.е.

дальнейшая работа компилятора (поиск ошибок) прекращается.

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

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

сообщений об ошибках.

5.3. Третий просмотр

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

тельной) рабочей программы. Полученная рабочая щхлрамма

размещается в МОЗУ-0 ( и поэтому третий просмотр работает

в МОЗ.У-1). После создания всех команд рабочей программы

вслед за этими командами размещаются созданные вторым про­

смотром константы и числа (см. 5.2.1.3.3.). Затем, если они есть, располагаются созданные уже ранее третьим просмот­ ром "добавочные" команда (см, 5 . 2 . I . I . 5 . ) .

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

Кроме этого, третий просмотр осуществляет обработ­ ку дополнительных возможностей (операторов gPTlffN ,

им, 2.8.2.5.), управляющих процессом компиляции, точнее,

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