Обычно вам нужно создать таблицы символов и выполнить проверку типов. Для некоторых языков это можно сделать на лету; для других, я думаю, в значительной степени нужно сначала разрешить имя и проверить тип, иначе вы не сможете правильно его интерпретировать (на ум приходит C++).
После того, как вы создали таблицы символов, вы можете написать интерпретатор, обходя дерево в порядке выполнения и делая то, что говорят операторы. Основная арифметика довольно проста. Управление строковыми и динамическими хранилищами сложнее; вам нужно выяснить, как вы собираетесь обрабатывать выделение и освобождение памяти, а для языков, которые управляют памятью, вам в конечном итоге придется реализовать какой-то сборщик мусора. В этот момент жизнь быстро усложняется.
Скорее всего, вы обнаружите, что вашему языку нужны функции, которые вы не рассматривали. Обработка исключений? Несколько заданий? Локальные области? Лямбды? Закрытия? Вы довольно быстро обнаружите, как много в современных языках того, что делает их полезными.
Когда вы начнете писать более сложные программы, вам понадобится отладчик. Контрольные точки? Единственный шаг? Переменный осмотр? Обновлять? Начинать с произвольных мест? Цикл чтения-оценки-печати?
Вам все еще нужно привязать свой язык к внешним библиотекам; большинство людей хотят общаться с консолями и файлами; вам нужны буферизованные файлы или вы согласны с 1 символом за раз и соответствующим снижением производительности? Вы сможете поспорить с символьными представлениями (7-битный ascii? 8-битный? UTF8 с символами, отличными от единиц измерения? Полный Unicode?) и стандартными библиотеками поддержки (конкатенация строк, поиск, преобразование чисел [включая точные преобразования с плавающей запятой в обоих направлениях] , арифметика больших чисел, ловушки с плавающей запятой, .... Список проблем становится довольно длинным, если вам нужен полезный язык программирования.
Ядро интерпретатора, скорее всего, будет довольно небольшим. Вы обнаружите, что другие вещи, вероятно, сжигают на один или два порядка больше усилий. Где-то здесь, если вы хотите, чтобы кто-нибудь использовал язык, вам нужно задокументировать все сделанные вами выборы. И да поможет вам Бог, если вы немного измените интерпретатор после того, как кто-то запустит большое приложение.
Далее кто-то будет жаловаться на производительность. Теперь вы можете настроить свою реализацию и начать сожалеть о том, что вы написали интерпретатор вместо компилятора.
Наслаждаться. Если у вас есть AST, вы едва поцарапали поверхность. Если вы возьметесь за это, вы научитесь по-настоящему ценить то, что современные языки предоставляют из коробки, и сколько усилий потребовалось для этого.
person
Ira Baxter
schedule
16.02.2011