← На главную

Создатель SQLite объяснил, зачем в БД байткод-машина — она повсюду

22.05.2026 14:12 · hackernews

Ричард Хипп, создатель SQLite, рассказал в ответ на вопрос в Twitter, почему его база данных использует байткод-виртуальную машину для выполнения SQL-запросов. Хотя байткод-машины обычно ассоциируются с языками вроде JavaScript или Python, они встречаются в самых неожиданных местах.

Внутри ядра Linux живёт eBPF — extension-механизм с собственным интерпретатором и JIT-компилятором. Это регистровая VM с десятью регистрами общего назначения и сотней опкодов. Изначально eBPF (тогда просто BPF) был фильтром пакетов, описанным ещё в 1993 году в USENIX. Оригинальный стековый фильтр работал плохо на RISC-процессорах, а новая регистровая реализация оказалась в 20 раз быстрее. Долгое время Linux-версия была простой: два регистра, интерпретатор-свитч и никаких обратных переходов. В 2011 году появился JIT для x86-64, в 2012 — первое не-сетевое применение, а в 2014 BPF расширили до универсальной внутриядерной виртуалки: добавили восемь регистров, 64-битные значения, инструкции, близкие к реальному железу, и возможность вызывать ограниченный набор функций ядра.

DWARF — формат отладочной информации от GCC и LLVM. Чтобы отладчик мог показать значение локальной переменной даже если она в регистре, на стеке или оптимизирована, компилятор оставляет выражение на стековом языке DWARF Expressions. GDB и LLDB выполняют его через свитч-интерпретатор.

У GDB есть и другой интерпретатор — для удалённой трассировки. Когда GDB отлаживает устройство, код на цели сам вычисляет значения выражений. Чтобы не тащить туда полноценный символьный evaluator, GDB переводит выражения из языка Си в простой байткод из сорока опкодов — чистая работа с целыми и числами с плавающей точкой, без типов и символов.

WinRAR внутри своих .rar-файлов прячет байткод для виртуальной машины RarVM, похожей на x86. Как обнаружил исследователь уязвимостей Тэвис Орманди из Google, эти фильтры-препроцессоры делают обратимое преобразование данных, повышая степень сжатия. У RarVM восемь регистров (r0–r7, r7 — стековый указатель) и знакомое ассемблеру поведение.

На GPU байткод тоже применяют: одни исследователи в 2020 году сделали интерпретатор арифметических выражений для рендеринга неявных поверхностей — перекомпилировать шейдеры для десятков тысяч специализированных программ под каждый кадр было бы невозможно. А в 2017 году в проекте Ubershaders родилась безумная идея: не компилировать шейдеры под каждую конфигурацию, а эмулировать конвейер рендеринга прямо на GPU через гигантские гибкие шейдеры-интерпретаторы, избежав статтеров.

Ещё байткод живёт в TrueType (более 200 инструкций для хинтинга глифов) и PostScript — вместе с бинарной кодировкой.

Читать оригинал →