yk
- 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.
Как устроена
- Интерпретатор компилируется с помощью ykllvm (заменяет cc/ld в Makefile)
- В точках цикла интерпретатора расставляются маркеры
YkLocation - ykllvm вставляет
__yk_trace_basicblock(id)в точки ветвления потока управления - В рантайме горячие циклы запускают запись трассы
- Трассы оптимизируются и компилируются в машинный код
- 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.