0001: пишем свой (простейший) язык
Как я уже говорил в предыдущем выпуске рассыки -- Форт самый простой язык. В
этом выпуске я расскажу, как можно на его основе создать простейшую систему
программирования (и ОС, если движок см. далее заставить загружаться и работать
напрямую с железом).
Одновременно это будет описанием методики целевой компиляции (ЦК), описание
которой я смог найти только в английском варианте -- мой перевод статьи
Брэда Родригеса по написанию простого форт-ассемблера см. на
http://akps.ssau.ru/forth/ .
Почему я использую этот способ применения Форта ?
Основная причина -- мне нравится Форт, но мне необходим простой доступ к
готовым наработкам (различные библиотеки) и API операционных систем, причем
программы должны работать на любом железе от микроконтроллерных поделок
с несколькими Кб памяти до обычных современных персоналок.
Вместо того чтобы искать несколько форт-систем для каждой платформы мне
оказалось проще применить подход, используемый широко известной технологией
Java (и .NET): система выполнения программ строится из нескольких слоев:
- железо и (необязательно) операционная система -- обзовем этот уровень
хост-системой и хост-ОС соответственно
- движок на С(++), ассемблере или любом другом языке, который интерпретирует
байт-код виртуальной стековой машины tinyVM (аналогично JVM). Архитектура
такой (форт-)машины включает память программ и данных (фон-неймановская
архитектура) и два стека: стек возвратов (используется только для работы
команд CALL и RET, то есть хранения адресов возврата из вложенных вызовов)
и стек данных (используется для передачи и временного хранения данных).
- программы в байт-коде tiny.
Байт-код -- широко применяемое в computer science понятие (см. точное
определение в сети), близкое к понятию машинного кода. Также байт-код часто
называют промежуточным представлением программы (IML), если затем он
транслируется в native машинный код целевой системы.
Байт-код может иметь любой формат команд, я ограничился только двумя:
0op: <опкод> безоперандные команды и префиксы
1op: <опкод> <операнд> команды с одним операндом
Для максимального упрощения кода движка я выбрал организацию памяти ВМ без
байтовой адресации:
int M[];
Слово CELL в Форте обозначает машинное слово (см. стандарт на язык), в tinyVM
оно соответствует типу int в С(++).
Программы для tinyVM я пишу на ассемблеро-подобном языке, очень близком с
Форту. Для их компиляции использую целевой компилятор (ЦК): расширение
форт-системы SP-FORTH http://spf.sf.net
Использование tiny позволяет писать на Форте, но при этом
- не привязываться к каким-то конкретным форт-системам (ЦК пишется за 5 минут
для любой форт-системы: скорее всего потребуется только замена слов для
открытия и записи файлов)
- и легко встраивать интерпретатор и tiny-программы в другие программы на
любых традиционных языках (для их конфигурирования и программирования
пользователем)
Более подробно см. следующие выпуски
Полный текст tiny брать с http://akps.ssau.ru/forth/tiny/
================
http://akps.ssau.ruforth@km.ru
FidoNet SU.FORTH 2:5057/18.29
tel.: +7 8462 28 9910 (work), 15 4313 (home)