EnglishРусский Map

yk

Toolbox toolboxcompilersjitcC/RustApache-2.0/MIT ↳ show in map Markdown
title
yk
type
toolbox
summary
Система метатрассировки, добавляющая JIT в существующий C-интерпретатор примерно за 400 строк изменений
tags
compilers, jit, c
language
C/Rust
license
Apache-2.0/MIT
created
2026-04-15
updated
2026-04-15
lang
ru
translation_of
yk
source_updated
2026-04-15
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Система метатрассировки, которая автоматически формирует JIT-компиляторы из C-интерпретаторов. Добавляете ~400 строк в существующий интерпретатор и получаете ускорение примерно в 2 раза (среднее геометрическое), сохраняя полную совместимость с эталонной реализацией.

Что делает

yk инструментирует C-интерпретаторы во время компиляции с помощью модифицированного LLVM (ykllvm). Обнаруживая горячие циклы в исполняемых программах, система трассирует выполнение интерпретатора, оптимизирует трассу и компилирует её в машинный код.

Главное преимущество: в отличие от RPython или Truffle, не нужно писать новый интерпретатор. Берётся готовая эталонная реализация (PUC Lua, MicroPython) и дополняется возможностями JIT.

Как устроена

  1. Интерпретатор компилируется с помощью ykllvm (заменяет cc/ld в Makefile)
  2. В точках цикла интерпретатора расставляются маркеры YkLocation
  3. ykllvm вставляет __yk_trace_basicblock(id) в точки ветвления потока управления
  4. В рантайме горячие циклы запускают запись трассы
  5. Трассы оптимизируются и компилируются в машинный код
  6. JIT-код выполняется с guard'ами, выполняющими деоптимизацию при неудачной спекуляции

Основные API

// Mark a control point (interpreter loop)
YkLocation loc = yk_location_new();
while (true) {
    yk_mt_control_point(mt, &loc);
    // interpreter dispatch
}

// Burn a runtime value as a trace constant
opcode = yk_promote(GET_OPCODE(i));

// Mark a function as pure (enables constant propagation)
__attribute__((yk_idempotent))
int get_opcode(Instruction i) { ... }

Проекты на yk

  • yklua - PUC Lua с JIT, тривиально следует за upstream (5.4.6 -> 5.5.0 за 2 часа)
  • ykmicropython - MicroPython с JIT
  • ykllvm - форк LLVM с инструментацией трассировки

Производительность

Ускорение примерно в 2 раза по среднему геометрическому на бенчмарках, в отдельных случаях - в 4-6 раз. Это меньше, чем у оптимизированного вручную LuaJIT, но LuaJIT застрял на Lua 5.1 и не может поспевать за обновлениями языка.

Ограничения

  • ПО на стадии альфа-версии, только x64
  • Не хватает ряда оптимизаций, есть TODO-остановки
  • Финансируемый исследовательский проект (Shopify, Royal Academy of Engineering)
  • Деоптимизация усложняет систему по сравнению с нативными интерпретаторами

Подробный технический разбор см. в retrofitting-jit-c-interpreters.


Repo: https://github.com/ykjit/yk