переменной рс, а операция условного ветвления — только в том случае, если
условие есть истина.
Массив code является, естественно, внутренним для интерпретатора, однако
представим себе, что нам захотелось сохранить сгенерированную программу в
файл. Если бы мы записывали адреса функций, то результат получился бы
абсолютно непереносимым, да и вообще ненадежным. Однако мы могли бы
записывать константы, представляющие функции, например 1000 для addop, 1001
для pushop и т. д., и переводить их обратно в указатели на функции при чтении
программы для интерпретации.
Если внимательно посмотреть на файл, который создает эта процеду-, можно
понять, что он выглядит как поток команд виртуальной машины. Эти команды
реализуют базовые операции нашего рабочего языка,
рункция generate — это
компилятор, транслирующий язык на виртуальную машину. Виртуальные машины —
стародавняя идея, обретшая госледнее время новую популярность благодаря Java и
виртуальной шгане Java (Java Virtual Machine, JVM); виртуальные машины
предоставляют простой способ создавать переносимые и эффективные реали-, ции
программ, написанных на языках высокого уровня.
Программы, которые пишут программы
Возможно, самым примечательным в функции generate является то, о она
представляет собой программу, которая пишет другую програму. ее вывод есть
поток исполнимых команд для другой (виртуальной) шшны. Собственно, подобная
идея нам привычна, именно это делают е компиляторы, только команды они
генерируют для реальных машин. На самом деле формы, в которых появляются
программы
, пишущие программы, очень разнообразны.
Один обычный пример дает динамическая генерация HTML для web-раниц. HTML —
это язык, хоть и достаточно ограниченный; кроме то, в себе он может содержать и
код JavaScript. Web-страницы часто нерируются "на лету" программами на Perl или
С, содержание таких раниц (например, результаты поиска или реклама, нацеленная
на определенную аудиторию) зависит от
приходящих запросов. Мы использовали
специализированные языки для графиков, картинок, таблиц, математических
выражений и индекса этой книги. Еще одним примером эжет служить PostScript —
язык программирования, тексты на котором создаются текстовыми процессорами,
программами рисования и множеством других источников; на финальном этапе
обработки книга, которую вы держите в руках, представлена как программа на
PostScript, держащая 57 000
строк.
Документ — это статическая программа, однако идея использования языка
программирования как способа записи любой проблемы является весьма
многообещающей. Много лет назад программисты мечтали о том, что компьютеры
когда-нибудь смогут сами писать для себя программы, энечно же, эта мечта никогда
не осуществится в полной мере, однако годня можно сказать, что машины
нередко
пишут программы за нас и иногда в таких областях, где совсем недавно это трудно
было себе представить.
Наиболее распространенные программы, создающие программы, — это
компиляторы, которые переводят программу с языка высокого уровня в машинный
код. Однако нередко оказывается удобным переводить код программы сначала на
один из широко известных языков высокого
уровня. В предыдущем параграфе мы
упоминали о том, что генератор синтаксического анализатора преобразует