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

Спецвыпуск Хакер, номер #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

загрузка...
Cпец Хакер #075Cпец Хакер #074Cпец Хакер #073Cпец Хакер #072Cпец Хакер #071Cпец Хакер #070Cпец Хакер #069Cпец Хакер #068Cпец Хакер #067Cпец Хакер #066Cпец Хакер #065Cпец Хакер #064Cпец Хакер #063Cпец Хакер #062Cпец Хакер #061Cпец Хакер #060Cпец Хакер #059Cпец Хакер #058Cпец Хакер #057Cпец Хакер #056Cпец Хакер #055Cпец Хакер #054Cпец Хакер #053Cпец Хакер #052Cпец Хакер #051Cпец Хакер #050Cпец Хакер #049Cпец Хакер #048Cпец Хакер #047Cпец Хакер #046Cпец Хакер #045Cпец Хакер #044Cпец Хакер #043Cпец Хакер #042Cпец Хакер #041Cпец Хакер #040Cпец Хакер #039Cпец Хакер #038Cпец Хакер #037Cпец Хакер #036Cпец Хакер #035Cпец Хакер #034Cпец Хакер #033Cпец Хакер #032Cпец Хакер #031Cпец Хакер #030Cпец Хакер #029Cпец Хакер #028Cпец Хакер #027Cпец Хакер #026Cпец Хакер #025Cпец Хакер #024Cпец Хакер #023Cпец Хакер #022Cпец Хакер #021Cпец Хакер #020Cпец Хакер #019Cпец Хакер #018Cпец Хакер #017Cпец Хакер #016Cпец Хакер #015Cпец Хакер #014Cпец Хакер #013Cпец Хакер #012Cпец Хакер #011Cпец Хакер #010Cпец Хакер #009Cпец Хакер #008Cпец Хакер #007Cпец Хакер #006Cпец Хакер #005Cпец Хакер #004Cпец Хакер #003Cпец Хакер #002Cпец Хакер #001