72
интерпретатора заключается в том, что формируется исполняемый файл,
содержащий в себе как непосредственно интерпретатор, так и исходный текст
программы (почти в явном виде). Это приводит к тому, что внешне мы имеем
исполняемый модуль, который, однако, занимается не чем иным, как
интерпретацией со всеми вытекающими отсюда последствиями –
достоинствами и недостатками. Типичным примером подобных систем
является старая система программирования Clipper.
Пишутся интерпретаторы обычно на языках высокого уровня. И
особенно полезными являются здесь принципы объектно-ориентированного
программирования. Однако зачастую эффективнее бывает технология, при
которой сначала создается макетный интерпретатор, реализованный, скажем,
на Прологе. Макетный интерпретатор является полигоном для отладки
структуры языка, он, естественно, прост, но малоэффективен с точки зрения
скорости интерпретации. Тем не менее, Пролог для отладки структуры языка
– незаменимое средство. Интерпретатор языка, среднего между Бейсиком и
Паскалем, можно написать за 2-3 дня, и занимать он будет 400-500 строк
(личный рекорд автора – это интерпретатор языка, в котором есть циклы,
условные операторы, операторные скобки и полная арифметика с набором
математических функций, который был написан за два вечера и занимал чуть
более 400 строк). После отладки структуры языка можно браться за
реализацию интерпретатора и на более эффективных с вычислительной точки
зрения языках.
КОМПИЛЯТОРЫ КОМПИЛЯТОРОВ
Выше мы уже упоминали о компиляторах компиляторов (КК) –
системах, позволяющих создавать компиляторы. На самом деле КК – это
некий инструментарий программиста, помогающий создавать компиляторы
(или интерпретаторы). Создавая множество компиляторов или постоянно
модифицируя грамматику разрабатываемого языка (к сожалению, далеко не
всегда можно заранее ясно определить структуру и синтаксис), разработчик,
естественно, желает некоторым образом автоматизировать некие рутинные
процедуры. Не случайно все рассмотренные нами методы анализа по
возможности представлялись в формальном виде. Все они могли быть
автоматизированы. Имея регулярную грамматику лексической структуры
можно, автоматически сгенерировать сканер в виде конечного автомата.
Имея грамматику синтаксической структуры, можно написать универсальную
процедуру синтаксически управляемого перевода (или создать универсальный
МП-автомат).