Дайджесты новостей
Инженерный чертеж легкого турбинного микроядра JavaScript-рантайма Ant рядом со спидометром запуска за 3.9 миллисекунды на контрастном графитовом фоне.

Ant: легковесный JavaScript-рантайм с движком Silver и запуском за 4 миллисекунды

В серверном JavaScript сложилась устойчивая олигополия движков: практически любой рантайм, с которым мы сталкиваемся на проде, построен либо поверх V8 от Google (Node.js, Deno, Cloudflare workerd), либо на JavaScriptCore от Apple (Bun). Эти движки развиваются десятилетиями, обладают колоссальной мощью JIT-оптимизаций и глубоко проработанными сборщиками мусора. Однако за эту мощь приходится платить весом: базовый бинарник Node.js весит около 140 МБ, Bun — более 61 МБ, а Deno перешагивает за 77 МБ.

Когда речь заходит о микросервисах в контейнерах, CLI-утилитах или бессерверных вызовах (serverless/edge computing), такой оверхед начинает мешать. Если функции требуется отработать за 5 миллисекунд и завершиться, тратить десятки мегабайт оперативной памяти и сотни миллисекунд на инициализацию виртуальной машины V8 — расточительство. Разработчик theMackabu представил независимый проект Ant — серверный рантайм для JavaScript и TypeScript с собственным оригинальным движком Ant Silver, ориентированный на минимальный вес и мгновенный холодный старт.

Архитектура Ant Silver и компиляция через MIR

Главная техническая интрига Ant — отказ от готовых гигантов. Ant Silver написан с нуля: это независимый парсер, интерпретатор AST и компактный сборщик мусора. В отличие от легковесных встраиваемых движков вроде QuickJS, которые традиционно работают только в режиме чистой интерпретации байткода, Ant изначально проектировался с прицелом на околонативную производительность благодаря JIT-компилятору.

Вместо использования тяжеловесной инфраструктуры LLVM, которая увеличила бы размер исполняемого файла на десятки мегабайт и замедлила старт, автор применил форк бэкенда MIR (Medium Internal Representation), созданного Владимиром Макаровым. MIR представляет собой легковесную промежуточную среду для JIT-генерации машинного кода: он быстро преобразует внутренний байткод Ant в инструкции конкретного процессора с минимальными накладными расходами на анализ регистров.

В результате базовый исполняемый файл Ant занимает всего 8.6 МБ, а при сборке с флагом оптимизации по размеру -Os ужимается до рекордных 4.5 МБ. Для сравнения: такой объем сопоставим с легковесными утилитами на Go или специализированными инструментами вроде безголового браузера Lightpanda 1.0, также спроектированного ради холодного старта за миллисекунды.

Холодный старт и соответствие стандартам

В тестах на задержку холодного старта измерялся классический микросервисный сценарий: запуск процесса, инициализация маршрутизатора Hono с двумя эндпоинтами и немедленное завершение без блокировки сокета. Ant продемонстрировал среднее время исполнения в 3.9 мс (с разбросом от 2.1 до 5.3 мс). Bun на движке JavaScriptCore справился за 8.8 мс (в 2.26 раза медленнее), Deno потребовал 18.6 мс, а стандартный Node.js — 29.4 мс (в 7.5 раз дольше).

При разработке нового движка ключевой риск — фрагментация языка и несовместимость со спецификациями ECMAScript. Создатели Ant выбрали стратегию верификации по официальным наборам тестов:

  • compat-table: 100% прохождение тестов (1511 из 1511 проверок по стандартам от ES5 до ESNext);
  • Спецификация Temporal: 100% (все 4603 теста по ревизии от августа 2026 года);
  • Набор тестов test262: около 66% (35 590 успешно пройденных тестов из 53 578);
  • Спецификации WinterTC (Ecma TC55 Minimum Common API): поддержка стандартных глобальных интерфейсов fetch, Request, Response, URL и потоков ReadableStream.

Кроме того, Ant из коробки поддерживает нативный TypeScript — типы просто вырезаются на этапе лексического анализа без необходимости долгого запуска tsc или внешних бандлеров.

Практический сценарий: от микросервиса к профилированию

Посмотрим, как выглядит запуск легковесного API-сервиса на Ant. В первом листинге создадим изолированный маршрутизатор на базе фреймворка Hono:

import { Hono } from 'hono';

const app = new Hono();

// Регистрация легковесных эндпоинтов без накладных расходов V8
app.get('/api/health', (c) => c.json({ status: 'ok', engine: 'Ant Silver' }));
app.get('/api/users/:id', (c) => {
  const userId = c.req.param('id');
  return c.text(`User ID: ${userId}`);
});

console.log('Маршруты Hono успешно инициализированы в среде Ant Silver');
process.exit(0);

Теперь протестируем сценарий холодного старта и сравним поведение Ant с Bun и Node.js с помощью консольного бенчмарка Hyperfine:

# 1. Запуск изолированного скрипта в среде Ant
ant bench-coldstart.js

# 2. Сравнительный замер задержки инициализации рантаймов (100 итераций)
hyperfine --warmup 10 --runs 100 \
  'ant bench-coldstart.js' \
  'bun bench-coldstart.js' \
  'node bench-coldstart.js'

Компромиссы и инженерный вердикт

Несмотря на впечатляющие 3.9 миллисекунды и компактный размер в 4.5 МБ, использовать Ant как универсальную замену Node.js в продакшене пока рано. Уровень прохождения test262 в 66% означает, что экзотические краевые случаи синтаксиса или тонкие нюансы прототипов объектов могут завершаться непредвиденными ошибками. Кроме того, у Ant нет поддержки нативных C++ аддонов (Node-API / NAN), поэтому библиотеки с бинарными биндингами работать не будут.

Однако как специализированный инструмент Ant выглядит крайне многообещающе. Это идеальная среда для CLI-утилит на TypeScript, встраиваемых сценариев автоматизации в IoT и edge-функций, где критичны каждая миллисекунда холодного старта и каждый мегабайт оперативной памяти. Внимательно следим за развитием движка Ant Silver: конкуренция независимых реализаций всегда идет экосистеме на пользу.