ЖУРНАЛ ХАКЕР

Создай язык сам, или конструктор для программиста

Спецвыпуск Хакер, номер #004, стр. 004-066-1


The Hound of Winter (thow@ireland.com)

Что я скачал?

В каталоге образовалось несколько файлов - пара с документацией, пара исполняемых EXE-шников и библиотеки для Microsoft Visual C++. Полное название продукта выглядит так: "The Adept Software Programming Language Creator (PLC)". Позволяет сия штучка не много, но достаточно, чтобы играть с ней пару недель. А именно:

1. Имеется встроенный интерпретатор простых конструкций языка Си.

2. Можно создавать свои языки в примитивной форме и получать приличные интерпретаторы.

3. Практически не требует усилий.

4. Распространяется свободно, но с ограничениями - исходники не поставляются, а поставляются уже откомпилированные библиотеки. Исходники можно получить у компании за деньги. ;-(

Чтобы создать свой собственный бейсик или Си-подобный язык, придется немного потрудиться. В общем случае понадобится написать около сотни строк кода. Но все довольно просто, да и архив снабжен работающим примером. Необходимо расписать структуры данных для различных типов нового языка, операторов, ключевых слов и определить процедуру, которая будет реагировать на их появление в тексте программы нового языка.

Как это делается?

Типы переменных интерпретатором определяются автоматически, как в Perl или Python, при использовании этих переменных первый раз. Например, достаточно написать:

example = 1

stringer = "PLC IS COOL!"

И переменная example будет целым числом, а stringer - строкой. Сразу предупреждаю, что интерпретатор не поддерживает язык со структурами, массивами и указателями. ;-( Кроме того, исходный файл на новом языке должен содержать всего две секции: описания глобальных переменных и собственно процедуры на этом языке.

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

1. В программу на Си++ подключаются библиотеки из скачанного архива PLC.

2. Вызывается процедура инициализации PLC_Startup().

3. Вызывается Init() для описанного и используемого языка.

4. Для каждой внешней команды вызывается PLC_AddCommand().

5. Загружается исходник программы для исполнения.

6. Он транслируется с помощью PLC_Compile() и PLC_CompileStatements().

7. Проверяются ошибки.

8. Вызывается PLC_Execute(), и происходит исполнение программы.

9. Проверяются ошибки.

10. Вызывается PLC_Shutdown().

Процедура PLC_CompileStatements() транслирует содержание только одной из процедур в программе. Если же язык не позволяет делить программу на процедуры (бейсик, к примеру) то всю программу можно исполнить, вызвав PLC_CompileStatements() для всего файла с программой.

В общем, прочитав все эти характеристики и инструкции, я решил создать что-то наподобие бейсика - на пробу. И раз уж "инструкция прилагается", то и смотреть надо в нее. В комплекте присутствуют файлы PLC_C.CPP и PLC_C.H - это определение языка для Си. Скопировав их в PLC_BASIC.CPP и PLC_BASIC.H, я приступил к правке этих файлов под бейсик. Файл PLC_BASIC.H можно оставить неизмененным - он подойдет и для бейсика. А вот PLC_BASIC.CPP придется немного переписать.

Первым делом необходимо изменить конструкции PLC_KEYWORD и PLC_OPERATOR, потом немного изменить процедуры ExecKeyword() и ApplyOperator(). Структура PLC_KEYWORD содержит список служебных слов языка, таких как IF, THEN, ELSE, FOR, GOSUB, GOTO. Из файла PLC_BASIC.CPP в этой структуре можно удалить все элементы, кроме вот этих:

Содержание  Вперед на стр. 004-066-2