Cтраница 2
Наличие этих таблиц во время выполнения позволяет ввести или вычислить любую цепочку и затем использовать ее как метку в инструкции перехода или как имя подпрограммы в вызове подпрограммы. Такая цепочка просто отыскивается в соответствующей таблице в момент перехода или вызова, а затем выполняется нужная передача управления. Если эта цепочка не использовалась как метка инструкции или имя подпрограммы, то во время выполнения выдается сообщение об ошибке и работа программы прекращается. [16]
![]() |
Алгол-программа с метками и процедурами в качестве параметров. [17] |
Опять-таки нет ощутимого различия между передачей по имени, по значению или по ссылке; мы ожидаем, что будет передаваться указатель на некоторое место среди команд программы. Инструкция перехода на формальный параметр в вызываемой подпрограмме приводит к появлению неоднозначности. Обычно считается, что после перехода должна получиться такая же среда ссылок, какая возникла бы, если бы переход выполнялся в точке, где метка передается, как параметр. Следовательно, метка должна включать в себя описание среды ссылок в точке передачи, точно так же, как подпрограмма-параметр. [18]
Между любой парой выражений может быть вставлен атом, слу. Инструкция перехода имеет вид ( GO метка); она передает управление на выражение, следующее за указанной меткой. [19]
Однако и в этом случае после выполнения инструкции PC также указывает на адрес слова, следующего за последним словом инструкции. Сказанное справедливо для всех инструкций, не являющихся инструкциями переходов. [20]
При выполнении инструкции вычисляемого перехода вычисляется значение выражения е и, если это необходимо, результат преобразуется к целому типу. Если еп или еЛ, то управление передается следующей за инструкцией вычисляемого перехода исполняемой инструкции. [21]
Метки как локальные синтаксические указатели во время трансляции. Простейший подход состоит в том, чтобы ограничить использование меток и инструкций перехода лишь теми ситуациями, когда возможна их непосредственная трансляция в аппаратные конструкции адресов команд и команд перехода. Таким образом, допускается простое и эффективное моделирование структуры меток и инструкций перехода. Чтобы осуществить соответствующее моделирование, транслятор должен иметь возможность приравнять каждой метке ее адрес во время выполнения так, чтобы можно было транслировать инструкции перехода в эквивалентные команды перехода. Обычно при трансляции организуется таблица меток. Во время генерирования выполняемой программы каждой метке в этой таблице сопоставляется эквивалентный ей ( относительный) адрес в выполняемой программе. По окончании трансляции таблица меток уничтожается. Наилучшим примером этого подхода является Фортран. Внутри каждой подпрограммы на Фортране все метки инструкций должны быть различными. Не допускаются ссылки извне подпрограммы на ее внутренние метки; отсутствие внутри подпрограммы метки, на которую есть ссылка из этой подпрограммы, считается ошибкой. В Фортране всегда возможно странслировать метки в относительные машинные адреса еще до начала выполнения программы. [22]
Именно отсутствие структурности, связанное с использованием переходов и меток, вызывает возражения. В этой связи заслуживает внимания тот факт, что в больших программистских проектах, где много разных людей пишут программы, а также используют и хранят программы, написанные другими, обычно устанавливаются строгие правила на применение инструкций перехода, так что получающиеся программы достаточно структурны, хотя возможность использовать инструкции перехода все же остается. [23]
Именно отсутствие структурности, связанное с использованием переходов и меток, вызывает возражения. В этой связи заслуживает внимания тот факт, что в больших программистских проектах, где много разных людей пишут программы, а также используют и хранят программы, написанные другими, обычно устанавливаются строгие правила на применение инструкций перехода, так что получающиеся программы достаточно структурны, хотя возможность использовать инструкции перехода все же остается. [24]
В этом случае вычеркивание одной из ветвей можно инициировать, поместив знак вычеркивания на одну из выходных дуг соответствующей вершины-переключателя. В качестве дополнительной оптимизации в следующей реализации описанной здесь потоковой модели будет замечено, что инструкции каждой ветви являются непрерывными, и поэтому возможно достичь эффекта вычеркивания путем перепрыгивания через всю ненужную нам ветвь с помощью изменения указателя стека и счетчика команд. Это является потоковым аналогом инструкции перехода в традиционном компьютере. [25]
Метки как локальные синтаксические указатели во время трансляции. Простейший подход состоит в том, чтобы ограничить использование меток и инструкций перехода лишь теми ситуациями, когда возможна их непосредственная трансляция в аппаратные конструкции адресов команд и команд перехода. Таким образом, допускается простое и эффективное моделирование структуры меток и инструкций перехода. Чтобы осуществить соответствующее моделирование, транслятор должен иметь возможность приравнять каждой метке ее адрес во время выполнения так, чтобы можно было транслировать инструкции перехода в эквивалентные команды перехода. Обычно при трансляции организуется таблица меток. Во время генерирования выполняемой программы каждой метке в этой таблице сопоставляется эквивалентный ей ( относительный) адрес в выполняемой программе. По окончании трансляции таблица меток уничтожается. Наилучшим примером этого подхода является Фортран. Внутри каждой подпрограммы на Фортране все метки инструкций должны быть различными. Не допускаются ссылки извне подпрограммы на ее внутренние метки; отсутствие внутри подпрограммы метки, на которую есть ссылка из этой подпрограммы, считается ошибкой. В Фортране всегда возможно странслировать метки в относительные машинные адреса еще до начала выполнения программы. [26]
При наличии рекурсивных подпрограмм для обеих конструкций необходимо, чтобы метки во время выполнения изображались парой, составленной из адреса соответствующей машинной команды и указателя на активационную запись. Эти сложности будут подробно рассмотрены в гл. Алгола; таким образом, необходимо перейти к частичному программному моделированию структуры меток и инструкций перехода goto во время выполнения программы. [27]
Этот метод был независимо предложен в совместной работе Харди и Сухоки [31] и в неопубликованной ра оте Сешу. Его основная идея состоит в отождествлении с вентилями небольших, часто используемых последовательностных схем. Так, например, триггер ( очевидный претендент на такое отождествление) описывается в модели как вентиль с двумя входами ( установкой и сбросом) и двумя выходами. Логический компилятор может интерпретировать такой вентиль, помещая инструкцию перехода в соответствующей точке компилированной модели. Эта инструкция вызывает обращение к замкнутой подпрограмме, которая модифицирует таблицу состояний триггера. В случае, когда данный триггер исправен, такой метод дает экономию в вычислениях по сравнению со стандартным подходом к моделированию триггера как пары вентилей, соединенных перекрестными связями при условии, что данный триггер свободен от неисправностей. [28]
В первом методе цепочки литер рассматриваются, как подкар-тины. Во втором методе непосредственно за командой WRITE TEXT следует некоторое количество слов, которые содержат коды литер. При этом дисплейный процессор будет интерпретировать все слова, следующие за инструкцией WRITE TEXT, как упакованные коды литер, пока не встретит специальную литеру выхода. Первый метод менее удобен, чем второй, в особенности если для инструкции перехода требуется два слова. [29]
Команда if означает, что будет производиться проверка на выполнение условия. Затем генерируются инструкции SML для оценки условия. Поскольку в SML отсутствует прямой эквивалент для оператора if / goto, его приходится эмулировать, выполняя вычисления с х и у и ветвление в зависимости от результата. Если х равен у, результат вычитания х из у равен нулю, поэтому для эмуляции оператора if / goto можно использовать инструкцию перехода по нулю. Первый шаг требует, чтобы значение у было загружено ( из SML ячейки с номером 98) в аккумулятор. Значение в аккумуляторе может оказаться как нулевым, так и положительным или отрицательным. Так как рассматривается операция, нас интересует переход по нулю. Сначала в таблице символов ищется ячейка перехода ( в данном случае 60), которая не находится. [30]