Почему Janet: лисп, который учат за вечер и компилят в файл меньше мегабайта

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

Эссе про язык, о котором вы не слышали, собрало 464 очка

Шахматная доска, отрендеренная в Bauble — инструменте на Janet
Шахматная доска, отрендеренная в Bauble — инструменте на Janet

Эссе «Why Janet?» Иана Генри — это не релиз и не новость, а признание в любви к малоизвестному лиспу. И тем не менее оно набрало 464 очка и 244 комментария — потому что под ним собрались люди, которые на Janet уже пишут всё подряд, и те, кто впервые о нём услышал. Один комментатор точно поймал настроение: тред «пахнет до-ИИ-эпохой интернета — новый язык, новый синтаксис, жаркий спор людей, годами пишущих код».

Тезис автора: лисп, который помещается в голову

Генри перечисляет, за что любит Janet, и аргументы у него конкретные, а не «мне нравится синтаксис»:

  • Простота. Всего восемь базовых инструкций, а вся стандартная библиотека, по словам автора, «помещается на одной странице». Janet можно «выучить за вечер», потому что семантика времени выполнения близка к привычным языкам вроде JavaScript.
  • Распространяемость. Janet компилируется в нативные исполняемые файлы меньше мегабайта без зависимостей — «можно делиться программами с другими людьми, не прося их сначала установить Janet».
  • Обработка текста. Вместо регулярок — PEG-грамматики (parsing expression grammars), которые автор называет «проще, мощнее и предсказуемее» и которые справляются с многострочным текстом, бинарными форматами и структурированными данными.
  • Шелл-скриптинг. Сторонняя библиотека даёт DSL для пайпов и редиректов прямо в коде, делая Janet конкурентом Bash.
  • Выполнение на этапе компиляции. Janet умеет сериализовать состояние программы на диск, позволяя запускать код во время компиляции и встраивать результат в бинарник — удобно для упаковки ассетов и кодогенерации.
  • Макросы. Их автор считает фундаментальной фичей: возможность «расквотить» литеральные функции делает макросы референциально прозрачными.

Отдельно Генри хвалит современную подачу: Janet ставит читаемость выше лисп-традиции и избегает древних имён вроде CAR или PROGN.

Тред: люди, которые уже на игле

Самое убедительное доказательство пришло не от автора, а от практиков. Один рассказал, что Janet вытеснил у него целый зоопарк инструментов:

«Janet заменил мне sh, python, awk и т.д. для системных скриптов длиннее определённого размера. Очень быстрый старт (1,4 мс через hyperfine против 1 мс у dash) для скриптов, а его sh-DSL позволяет очень изящно набирать шелл-команды, вроде ($ cmda w x | cmdb y z). Возможность загрузить образ для отладки тоже сильно помогает» — mackeye

Другой признался в полной зависимости:

«Я по-настоящему предвзят. За последние, проверяю записи, 10 месяцев с тех пор как начал Janet, я в принципе разучился писать всё остальное (кроме языков семейства APL). Я даже веду community-сайт с документацией» — veqq, ведущий janetdocs.org

Ещё один указал на редкую деталь, которую автор упустил: Janet идёт со встроенной сетью — «перепробовав много крошечных интерпретаторов за годы, это, по моему опыту, относительно редко».

Тред: чего Janet не хватает — и где автор ошибся

Фанаты не были слепы. Janetacarr — человек, которого, по его словам, постоянно принимают за создателя языка (он им не является), — назвал реальные слабости:

«У меня есть претензии к Janet. В основном это отсутствие версионирования в пакетном менеджере и нехватка библиотек в принципе (продвинутый HTTP-роутинг и т.п.). Но я ОБОЖАЮ, что Janet делает бинарники через JPM, портативен — я однажды как PoC поставил Janet на консоль Playdate» — janetacarr

А внимательный читатель поймал автора на фактической ошибке:

«„SETQ это def“ — я сказал „что“ вслух, ведь SETQ не создаёт привязок, а только обновляет. Заглянул в документацию — автор действительно неправ: привязки через def неизменяемы. Он, вероятно, имел в виду „SETQ это set“» — a-french-anon

Были и сравнения с соседями: кто-то напомнил про Fennel — более ранний язык того же разработчика, компилирующийся в Lua; кто-то предложил сравнить Janet с Tcl, у которого схожие достоинства (компактность, встраиваемость, DSL-дружелюбность). И отдельно всплыло, что Janet вышел больше чем через 10 лет после Clojure (Clojure — 2007, Janet — 2019).

Чем Janet уже доказал себя: Bauble и Toodle

Лучший аргумент за язык — то, что на нём сделано. Комментатор напомнил, что сам автор эссе сделал на Janet два художественных инструмента — Bauble (рендеринг 3D-сцен через signed distance functions) и Toodle, — и именно они в своё время «зажгли» интерес к языку у многих.

Вывод: не «next big language», а идеальный инструмент для одного человека

Janet не претендует заменить Python на работе — у него нет ни зрелой экосистемы библиотек, ни версионирования пакетов, что честно признают даже фанаты. Его ниша другая: личные проекты, скрипты, встраиваемые DSL и художественные инструменты, где ценится язык, который целиком помещается в голову, стартует за миллисекунды и компилится в один переносимый файл. Скепсис уместен — один комментатор хорошо подметил, что лисперы «возбуждаются от очень абстрактных вещей вроде референциальной прозрачности, от которых обычный человек на улице убежал бы». Но 464 очка и десятки людей, которые «разучились писать на остальном», — это не про абстракции, а про то, что инструмент реально приятно держать в руках.

Получайте такие разборы каждый день

Главные истории Hacker News — на email, в Telegram или RSS.

Следующая новость · 2 из 24 Читать дальше
🚀Tech

KDE объявила, что Plasma 6.8 станет последней версией с поддержкой X11

Через полгода в Plasma 6.8 на экране входа останется только Wayland, а X11-код выкинут из Plasma Shell и настроек. Аргумент KDE: 95% пользователей уже на Wayland. Аргумент треда: а как же Talon, мульти-мониторные кабинеты и LED на клавиатуре?

★ 186 · 💬 230 · blog.davidedmundson.co.uk · 5 мин