← На главную

Автор пслэнг смешал C++ и Rust для изоляции ресурсов

07.05.2026 13:01 · hackernews

Я начал писать собственный язычок в декабре прошлого года, пока проект на паузе. Это не новый «убийца» C++ или Rust, а просто мой проект для фана, в котором я уже написал рабочий трейсер путей из 1К строк кода. Мой главный запрос — сделать язык для моддинга игры с сложной симуляцией. Я оценил Lua и C++, но у них проблемы: в Lua трудно изолировать доступ к файлам и сети, а в C++ модификаторы требуют компилятора с тяжелым ядром, что невозможно скрыть от пользователя. Мои цели были четкими: полный доступ к C, возможность работы с «сырыми» указателями на сущности, быстрая компиляция и возможность изолировать код от внешних ресурсов. Я назвал это pslang — смесь C++, Rust, Python и Zig. Это императивный язык со строгими типами. В нем 13 базовых типов, включая специализированный 16-битный float для графиков HDR, и даже пустые структуры размером в ноль байт, которые не занимают память, но работают как флаги.

Синтаксис индентированный как у Python, но с правилами C. Массивы передаются по значению, а не по указателю, а функции могут объявляться позже, так как типы явно указаны. Язык не делает неявные приведения, всё нужно делать через оператор as. Для работы с памятью я использовал стандартную схему AAPCS64 на процессорах Apple Silicon M1/M2, возвращая значения через регистры x0 или v0, а не через стек. Парсер я писал на Bison, генерируя C++ код вместо C, чтобы избежать глупых глобальных переменных. Для управления отступами в коде я применил хитрость: сначала парсер считает глубину indentation на каждой строке, а затем отдельный проход распределяет блоки кода. Это работает быстрее, чем настоящий контекстно-свободный парсер, но выглядит криво. Интерпретатор сейчас простой «проходной» по дереву абстрактной синтаксической структуры, он медленный, но отлично подходит для отладки. Компилятор работает в режиме JIT, создавая исполняемый образ прямо в памяти. Генерация ассемблера Aarch64 была самой сложной частью, так как мне пришлось вручную собрать биты команд, учитывая строгие ограничения на 32-битные инструкции и сложные правила выравнивания стека. Сейчас проект на стадии создания промежуточного представления, похожего на SSA, но без ограничений на повторное присваивание значений.

Я надеюсь, что этот эксперимент покажет, как создавать языки с нуля, не обязательно следуя идеалам академических исследователей. Для меня важно было понять, можно ли совместить производительность нативного кода с удобством скриптовых языков для создания модов. Путь к созданию своего языка оказался сложнее, чем кажется, но результат уже позволяет писать реальные программы. Если вы думаете, что это только для фанатов, то попробуйте сами, ведь создать свой собственный язык программирования сейчас проще, чем когда-либо, хотя и не так легко, как многие обещают.

Читать оригинал →