06 Jul 2026
Я последние пару недель очень увлёкся одной идеей, которую годами откладывал: пробую сделать свой язык программирования. Нейронки очень круто помогают, некоторые штуки можно делать в разы быстрее.
Прогресс и мои наблюдения:
Я несколько лет потихоньку выписывал всякие интересные мысли и идеи про языки программирования. Если интересно, они лежат тут: “О дизайне языков программирования”
Пару недель назад я закинул их в gemini и пообсуждал разные моменты. Тут реально круто, что нейронка знает много, например я думаю про какую-то фичу, а нейронка мне “эту фичу недавно добавили в OCaml” или “а в языке Pony сделали так-то” и я могу уже точечно посмотреть как сделано там или иначе и не изобретать велосипеды с нуля.
Потом чата мне стало мало (в этот момент я узнал, что стандартного способа выгрузить весть чат из gemini нет, есть только сторонние расширения в браузере), и я создал проект с .md файлами и начал писать в них, заодно разложив разные концепции в разные файлы. Что прикольно - текстовое описание это не код (и вначале оно было не сильно большим), нейронке его редактировать довольно легко. Мне хватало всё той же подписки на gemini за 20 евро в месяц, использовал antigravity ide с этой подпиской. Я раз за разом спрашивал агента, какие есть противоречия/неполные описания в проекте и просил его что-то дописать. Тут забавный момент - я с агентом общался на русском, но все описания языка попросил делать на английском. На английском устоявшаяся терминология в программировании и строгие описания и читать их удобно, но именно обсуждать как будто удобнее на своём родном языке.
Буквально за несколько дней описание концепций языка разрослось файлов до тридцати, дальше я попросил агента описать синтаксис языка в ebnf нотации, потом написать парсер для языка и потом интерпретатор для AST, чтобы можно было попробовать писать код на языке и посмотреть, насколько оно удобно и какие есть проблемы. К моему удивлению, нейронка сделала это буквально за день. Там точно есть баги, и в код интерпретатора я даже не смотрел. Но моя цель сейчас - не сделать “нормальный интерпретатор”, а просто попробовать написать какой-то код на языке и на мой взгляд всё ок.
Дальше я разошёлся и попросил агента написать LSP сервер для языка и дополнение для VS кода (antigravity ide поверх VS сделана). К моему удивлению, после нескольких исправлений заработало и это. Причём LSP может давать не только подсветку синтаксиса, но ещё и подсветку ошибок и всякие типа действия “показать тип переменной, перейти к месту объявления, показать места вызова” и т.п., и агент после нескольких итераций сделал и это!
Итог - за неделю я получил рабочий прототип языка, который можно открыть прямо в ide, и пописать код с рабочей подсветской синтаксиса и всякими экшенами для навигации по нему. Это офигенно. Делай я сам такое без нейронок - наверно, потратил бы как минимум месяц.
Реальных ускорений два: нейронка знает реально много и её можно использовать как консультанта - в каких языках есть фича, как сделана, какие плюсы и минусы у такого решения. Я в процессе заметно расширил свой кругозор и узнал про много новых концепций. И второе - я могу делегировать скучные кусочки типа написания парсера/ тестового интерпретатора и сделать их на порядок быстрее чем руками.
Чем я занимался вторую неделю - особо ничем, ждал когда происходящее уложится у меня в голове и появятся новые идеи.
Новые идеи пришли откуда я не ждал - claude снова открыли доступ к топовой модели Fable 5, и я попробовал её вызвать на описании языка и выписать что надо дописать/улучшить. Результатом я впечатлён - после запуска получился ответ где-то на пять страниц текста, и нейронка с реально глубоким пониманием происходящего нашла кучу проблем, нестыковок и недостаточно подробно описанных идей. Токены она кушает очень быстро, но по-моему эта модель как раз очень хороша в планировании. И как будто вариант давать ей тектовое техническое описание - как раз хороший способ, а программировать интерпретатор по описанию языка можно и моделью поменьше.
Сам язык
Описание языка в открытый доступ я пока не выложил, но скоро планирую. Просто потому, что я его очень активно доделываю и уточняю, а какие-то концепции я вообще выкидываю.
Кратко о том что я хочу сделать в языке:
- single-shot continuations: поверх них алгебраические эффекты, которые позволят одним механизмом описать и non-local return, и кидание исключений, и корутины c приостановкой кода.
- linear types + Scopes + RAII: для штук типа continuations и прочих гарантировать, что для них вызовут либо “продолжение”, либо “отмену”, причём вызовут ровно один раз.
- capture checking: вдохновлялся Scala 3, идея в том, что линейный тип можно ещё привязкать к какому-то скоупу и быть уверенным, что он его не покинет. Например, функция может захватить переменную из скоупа, но тогда она сама не должна его покидать (например, её будет нельзя сохранить в глобальную переменную).
- Опциональный GC: часто языки идут парами (например, высокоуровневый Python и к нему низкоуровневые библиотеки с интерфейсом на С, или например JVM для java написана на С++). И получается, что между языком с GC и без него есть жёсткая граница - разные языки, разный синтаксис, разные системы типов. Нельзя просто так взять горячий цикл на Java/Python и переписать этот кусок на C++. Если мне удастся в одном языке совместить сразу всё, можно будет миксовать подходы и не использовать Gc в местах где он мешает. Например, в коде самого сборщика мусора, и сборщик мусора будет написать на моём же языке как внешнюю библиотеку.
Я пока экспериментирую именно с дизайном языка, не отвлекаясь на то, как оно будет компилироваться.