
Чому Janet? Есей про маленький діалект Ліспа
Програміст Ієн Генрі пояснює, чому маленький діалект Ліспа Janet став його основною мовою для хобі-проєктів: ядро з восьми інструкцій, вбудовуване середовище на C і самостійні бінарники.
У есеї на своєму блозі програміст Ієн Генрі пояснює, чому маленький діалект Ліспа Janet уже кілька років є його основною мовою для хобі-проєктів. Мова йому сподобалася настільки, що він написав про неї цілу книжку — «Janet for Mortals» — і безкоштовно опублікував її онлайн.
Маленька мова, яку можна вивчити за вечір
Janet — імперативна мова з функціями як значеннями першого класу, єдиним простором імен для ідентифікаторів і лексичним блоковим скоупом. Її ядро — лише вісім інструкцій: do, def, var, set, if, while, break і fn, а макроси дають конструкції вищого рівня. Генрі описує семантику виконання як знайому: «уявіть JavaScript плюс типи-значення мінус усі дивацтва». Уся стандартна бібліотека вміщується на одній сторінці.
Від байткоду до самостійних бінарників
Janet компілює себе в байткод, записує його у C-файл, який також запускає середовище виконання Janet, а потім компілює цей файл системним C-компілятором. Результат — програми постачаються як нативні виконувані файли, і нічого не треба встановлювати. Бінарник hello world важить менше мегабайта — 784K для Janet 1.27.0 на aarch64 macOS — разом із середовищем виконання, збирачем сміття і компілятором байткоду, тож програми можуть виконувати код Janet у час роботи. Середовище — невелика C-бібліотека, яку легко вбудувати, навіть у вебсайти.
PEG, шел-скрипти та колекції
Замість регулярних виразів обробка тексту в Janet побудована на граматиках розбору виразів (PEG), які Генрі називає простішими, потужнішими й передбачуванішими: вони розбирають HTML, JSON і бінарні формати з нульовими байтами. Стороння бібліотека sh додає DSL для шел-скриптів із конвеєрами й перенаправленнями. Колекції бувають змінювані та незмінювані: незмінювані мають семантику значень, а змінювані, як-от хеш-таблиці, порівнюються за ідентичністю.
Макроси та значення часу компіляції
Написання макросів — те, що Генрі радить найбільше, і, за його словами, негігієнічні макроси Janet усе одно можуть бути референційно прозорими, бо літеральні функції можна розквартувати (unquote). Janet також дозволяє переносити значення з часу компіляції в час виконання: компіляція запускає код верхнього рівня, а потім записує на диск повний знімок стану програми, зберігаючи спільні посилання, генератори й замикання. У книжці показано, як цим згенерувати прив'язки до бази даних із SQL-схеми.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.