← На главную

slisp компилирует Lisp в ассемблер на Go для Linux/AMD64

26.06.2026 18:30 · hackernews

slisp — компилятор Lisp в ассемблер для Linux/AMD64. Он написан на Go и берёт Lisp-программы на вход, а выдаёт готовый .s файл, который потом собирается через nasm и линкуется через ld. Такой подход позволяет обойтись без REPL, но всё равно исполнять типичные Lisp-алгоритмы.

Внутри компилятора есть стандартная библиотека на самом slisp (файл stdlib.slisp). Она подключается ко всем программам по умолчанию, если не отключить флаг -stdlib=false. Там — print с поддержкой типов, map, length, утилиты для работы со списками, целыми, строками, лямбдами и замыканиями. Парсинг простой: поддерживаются cond, defun, do, if, lambda, let, list, set!. Для чисел — полный набор сравнений (=, <, <=, >=, >) и отрицание через !.

Сборки мусора нет. Макросов тоже — без quote и quasiquote их реализация была бы слишком сложной. Автор отмечает, что eval в компиляторе не нужен, поэтому и с цитированием решили не заморачиваться.

Компиляцию можно запустить вручную: ./slisp example.lisp > example.s, потом nasm -f elf64 example.s, ld -o example example.o. А можно просто выполнить make — он сам найдёт все *.lisp в директории, скомпилирует, соберёт и запустит.

Под капотом — модульные тесты на Go и интеграционные сценарии в папке test/. Они компилируют фиксированные программы и сверяют вывод с эталоном. Плюс есть фаззинг: можно запустить go test -fuzztime=300s -parallel=1 -fuzz=FuzzProject -v и пусть ищет баги пять минут.

Автор признаётся: до slisp он писал компилятор для своего языка s-lang. Там были целые числа, потом добавились float, строки и указатели с метками в младших битах. Но типовая система и синтаксис стали слишком громоздкими. В итоге он всё переписал с нуля — взял SysV ABI вместо самодельного, выбрал Lisp за простоту парсинга и заложил правильную типизацию сразу.

Оба проекта — игрушечные, но slisp уже чувствуется более цельным и рабочим, хотя уступает s-lang по объёму стандартной библиотеки.

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