JIT-компиляция за 5 микросекунд: как ИИ упростил написание быстрых компиляторов

JIT Compiling Code in 5μs

JIT-компиляция за 5 микросекунд: как ИИ упростил написание быстрых компиляторов

Автор рассказывает, как с помощью ИИ написал JIT-компилятор для своей базы данных pgrust, который компилирует код примерно за 5 микросекунд. Это позволяет компилировать каждый SQL-запрос, а не только их подмножество. В статье объясняется техника copy-and-patch: создание шаблонов машинного кода (stencils) и их заполнение под конкретные операции. На примере простого движка регулярных выражений автор показывает, как генерировать ARM64-код, собирать его из шаблонов и выполнять в рантайме. Результат — производительность, сопоставимая с рукописным кодом, но для общего случая.

Раньше быстрая JIT-компиляция считалась чёрной магией, но с помощью ИИ написать JIT-компилятор с быстрым временем компиляции стало проще, чем когда-либо, напрямую генерируя ассемблерный код.
  1. MaxBarraclough

    Напоминает пост в блоге 2024 года «Look ma, I wrote a new JIT compiler for PostgreSQL» [0]. В обеих статьях сетуют на то, что JIT-компилятор Postgres на основе LLVM [1] тратит время на генерацию кода.

    > Редкость JIT-компиляторов заставляет меня думать, что реализация JIT-компилятора исторически была слишком сложной, чтобы оно того стоило.

    Это верно только для написания JIT с нуля. JIT-компиляторов не так уж мало, просто часто используют LLVM (и другие фреймворки). У каждого крупного интерпретатора есть JIT-компилятор. У PCRE2 есть JIT-компилятор. Существуют JIT-фреймворки с гораздо более быстрой генерацией кода, чем LLVM: Cranelift, GNU Lightning, Mir. Сомневаюсь, что они могут генерировать код быстрее, чем кастомный copy-and-patch JIT, но они будут намного быстрее LLVM.

    [0] https://www.pinaraf.info/2024/03/look-ma-i-wrote-a-new-jit-c... , обсуждение: https://news.ycombinator.com/item?id=39742916

    [1] https://www.postgresql.org/docs/current/jit-reason.html

  2. agnishom

    Рекомендую статьи Рассела Кокса о реализации regex-движка: https://swtch.com/~rsc/regexp/

    Это очень по теме

  3. catlifeonmars

    Возможно, это немного мета, но было приятно читать. Освежает, когда читаешь статью об использовании LLM, которая не выглядит так, будто её тоже написал этот LLM.

    Возможно, я использую этот подход для генерации шаблонов для JIT-файрвола, с которым экспериментирую.

    Мне также приходит в голову, что это можно использовать для генерации байт-кода eBPF на лету.

  4. glum64

    Хм, Common Lisp, где JIT не только доступен, но и управляем: программист может решить, что заслуживает компиляции, а что нет.

    Помимо времени выполнения, JIT доступен также при компиляции или загрузке кода для выполнения (то есть вам нужно ускорить компиляцию или загрузку? без проблем, вы также можете скомпилировать это ускорение в нативный машинный код, и так до бесконечности...).

  5. mgaunard

    Проблема этого подхода в том, что это не настоящая JIT-компиляция, это просто шаблоны ассемблера с базовыми подстановками.

    Не используя LLVM, вы упускаете всю его оптимизацию.

  6. malisper

    Автор здесь. Дайте знать, если есть вопросы по посту или по pgrust.

  7. glenjamin

    pgrust звучит очень интересно, но с такими глубокими изменениями нет реального пути для апстрима — является ли конечной целью достаточная надёжность, чтобы получить широкое распространение?

  8. hamilyon2

    Для этого используется copy-and-patch компиляция

Ещё за этот день

2026-08-23