ВУЗ:
Составители:
Таким образом, последовательность четверок и является результатом работы синтаксического ана-
лизатора.
1.3.2. Постфиксная запись
Обычно программа осуществляет те или иные действия над данными. Соответствующие операции
программист записывает, используя инфиксную форму записи, в которой знак операции ставится между
операндами. Например:
(А + В) * С.
Вычисление такого выражения является непростой задачей. Операцию умножения нельзя выпол-
нить до тех пор, пока не будет прочитан второй операнд С. Если этот операнд сам является сложным
выражением, то прежде, чем выполнить умножение, необходимо считать много данных из текста про-
граммы.
Отмеченные трудности можно легко обойти, если использовать другую форму записи операций.
Она называется постфиксной и отличается тем, что знак операции ставится непосредственно за операн-
дами. Такая запись обладает двумя ценными свойствами, благодаря которым ее используют как проме-
жуточную форму представления исходной программы при трансляции:
1. Для записи любого выражения не нужны скобки. Так как оператор непосредственно следует за
операндами, участвующими в операции, неопределенность в указании операндов отсутствует. Напри-
мер, выражение (А + В) * С в постфиксной записи имеет вид: А В + С *.
2. К моменту считывания очередного оператора соответствующие операнды уже прочитаны. По-
этому оператор может быть выполнен без чтения каких-либо дополнительны данных.
Сказанное выше относится к бинарным операциям, однако не трудно распространить результаты
рассуждений и на унарные операции. Однако при этом могут возникнуть сложности. Например, знак "–
" может стоять в инфиксной записи, указывая как бинарную, так и унарную операцию, и его правиль-
ный смысл становится очевидным из контекста. В постфиксной записи сделать это труднее. Унарный
минус и другие унарные операции можно представлять двумя способами: либо записывать их как би-
нарные операции, например, вместо " – В " писать " 0 – В "; либо для обозначения унарных операций
вводить новый символ, например, выражение А + (– В + С * Е) в постфиксной форме примет вид: А В
@ С Е * + + .
1.4. ГЕНЕРАЦИЯ КОДА
Возможны три формы объектного кода: абсолютные команды, помещенные в фиксированные ячей-
ки (после окончания компиляции такая программа немедленно выполняется); программа на автокоде (ее
потом придется транслировать); программа на языке машины, записанная на внешнюю память (для вы-
полнения она должна быть объединена с другими подпрограммами и затем загружена).
Первый вариант наиболее экономичен в отношении расходуемого времени. Главный недостаток
этого варианта состоит в том, что нельзя предварительно и независимо протранслировать несколько
подпрограмм и затем объединить их вместе дня выполнения, все подпрограммы должны транслиро-
ваться одновременно. Выигрыш во времени оборачивается проигрышем в гибкости.
Проще всего получить объектную программу на автокоде. В этом случае не приходится формиро-
вать команды как последовательности битов; можно порождать команды, содержащие символические
имена. Более того, можно формировать макроопределение. Это позволяет также уменьшить объем ком-
пилятора.
Несмотря на очевидные достоинства, трансляция на автокод обычно считается наихудшим из вари-
антов. И в самом деле, к процессу трансляции добавляется еще один шаг, который часто требует столь-
ко же времени, сколько длится собственно компиляция.
Большинство промышленных компиляторов вырабатывают объектную программу в виде объектно-
го модуля. Как правило, объектный модуль содержит символические имена других программ (подпро-
грамм), к которым он обращается, и имена своих входных точек, к которым можно обращаться из дру-
гих программ. Эта объектная программа "объединяется" с теми другими объектными программами, а
затем загружается в некоторую область памяти для выполнения.
Страницы
- « первая
- ‹ предыдущая
- …
- 20
- 21
- 22
- 23
- 24
- …
- следующая ›
- последняя »