Аркод: как делать компилятор?

Собственно, разработка языка Аркод — это не проблема. Пока я вижу, что это Тривиль с небольшим количеством добавлений (может не Аркод, а Арвиль?).  Возможно, что что-то из Тривиля придется удалить или изменить, но это покажет практика.

А вот дальше начинаются технические вопросы и варианты их решения.

Замечание: я не упоминаю язык описания схем, не потому что его не будет, а потому что с ним более-менее все ясно. Это json схема, детали будут видны по ходу, думать и них еще рано.

Я не собираюсь делать отдельный компилятор (по крайней мере, пока язык будет развиваться и плыть). А буду дорабатывать «трик» (компилятор Тривиля на Тривиле), а именно сделать:

  • Общее AST для двух языков
  • Общий лексер, который настраивается на набор ключевых слов (и может быть на дополнительные знаки операций)
  • Общий парсер, тоже, скорее всего, настраиваемый. Хотя может быть, в какой-то момент придется делать второй парсер, если отличия будут существенные.
  • Общий семантический анализ (на объединенном AST)
  • Генерация — вот тут сложно, и об этом дальше.

Историческая справка: Подход похож на тот, что был использован в XDS — общее AST, два парсера для Модулы-2 и Оберона-2, общий семантический анализ, и далее общая генерация (back-end). Большой плюс решения — возможность использовать оба языка, произвольно смешивая их в программе.

Почему нельзя использовать (напрямую) генерацию из Тривиля?

Архитектурное программирование неизбежно требует отказа от монолитных программ, а Тривиль делает монолитную программу, просто потому что так тривиальней. В принципе, прототипировать можно и на монолитных программах, но лучше подразумевать динамическую загрузку и динамическое связывание с самого начала, иначе потом можно налететь на спрятанные грабли.

Отказ от монолитных программ требует раздельную компиляцию, которую здесь я понимаю, как возможность независимой компиляции частей программы и потом использование частей без доступа к исходному коду. И это очень существенное изменение работы компилятора — необходимо хранить семантическую информацию, проверять версии скомпилированных частей, и минимизировать прямые связи при генерации кода.

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

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *