Alek�ei Matiu�hkin

сделано с умом



Долгая дорога к Cure

Thursday, 16 Apr 2026 Tags: 2026tech

Чуть меньше года назад я приступил к исполнению собственной давней задумки: начал работать над языком, компилируемом в BEAM, и реализующим две важнейшие для моей повседневной работы возможности: зависимые типы с разрешением и проверкой на этапе компиляции и верифицируемые конечные автоматы в качестве примитива языка.

Я выбрал эрланг в качестве языка реализации, потому что мне казалось, что мне так будет проще с компилятором. Я нагромоздил в кучу разные симпатичные финтифлюшки, многие из которых были добавлены просто «чтоб было, потому что это прикольно». Довольно быстро я запутался, а вскоре — потерял контроль над тем спагетти-кодом.Я перестал понимать, что и почему у меня ломается, когда я добавляю новые безобидные на первый взгляд возможности. Я подключил LLM и эта тварь мне сообщила, что кодовую базу создавал пьяный лесорую с тремя классами образования, которому нельзя доверить ничего сложнее сортировки пузырьком. Не прямо этими словами, но близко к тексту.

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

Я отложил написание (переписывание) кода на несколько месяцев и стал думать, что я сделал не так.

Во-первых, за последнее десятилетие я работал преимущественно с эликсиром, и выбор эрланга — юыл сиюминутной ничем не оправданной блажью. Вызвать :compile.forms/2 запорсто можно и из эликсира. Кроме того, экосистема позволила отказаться мне от make-файлов и довольно топорной сборки.

Во-вторых, в первом подходе к снаряду — я пытался охотиться сразу на уток, зайцев и кабанов. Ничего системного в том подходе не было, я просто добавлял и добавлял новые штуки, по ходу пьесы подпирая палками разваливавшийся каркас. Добавление нового оператора могло развалить парсинг модулей. В актуальной версии я четко следовал плану: лучше медленно, но внятно.

И, самое главное, в первой версии я так спешил, что повторил ошибку почти всех существующих языков: AST присутствовало в виде пристройки сбоку, сарайчика на отшибе. Лексер и парсер напрямую могли передать управление компилятору. Это и оказалось ключевой ошибкой.

Переосмыслив все это, я решил начать перестройку издалека. Так появилась библиотека metastatic. То есть, я поставил AST не только во главу угла, а вообще заставил парить над всеми остальными сущностями.

Metastatic is a library that provides a unified MetaAST (Meta-level Abstract Syntax Tree) intermediate representation for parsing, transforming, and analyzing code across multiple programming languages using a three-layer meta-model architecture.
Build tools once, apply them everywhere. Create a universal meta-model for program syntax that enables cross-language code analysis, transformation, and tooling. Metastatic provides the foundation - the MetaAST meta-model and language adapters. Tools that leverage this foundation (mutation testing, purity analysis, complexity metrics) are built separately.

Если приглядеться, MetaAST ужасно напоминает Elixir AST, потому что лучшего способа выразить дерево, чем {node, meta, children} — попросту не существует. В общем, я вложил довольно много усилий в создание и отладку этого самого «нового» AST. Оно и легло в основу моей второй попытки написать «Dependently-typed programming language for the BEAM virtual machine with first-class finite state machines and SMT-backed verification», как написано на заглавной странице.

После этого я открыл сундук «вещи прошлого тысячелетия», вытащил оттуда обычные ручку и блокнот и выписал все возможности первой версии, которые я худо-бедно сумел реализовать. Сгруппировал их по степени важности, полезности и сложности. На первом этапе я решил отказаться от поддержки настоящих зависимых типов fn len(l: Vector(_, n)) -> NonNegInt = n, но многое интересное выжило.

FSM как граждане первого сорта пока тоже в весьма зачаточном состоянии, но я теперь никуда не тороплюсь, и буду доводить из до ума неторопливо, но аккуратно.

Попробуйте

Cure -- Dependently-Typed BEAM Language
Dependently-typed programming language for the BEAM with first-class FSMs and SMT-backed verification.
и, может быть, вам понравится.


⇦  ¦