PDA

Просмотр полной версии : Red Hat развивает JIT-компилятор MIR


Suicide
21.01.2020, 19:07
В компании Rad Hat ведётся разработка (https://developers.redhat.com/blog/2020/01/20/mir-a-lightweight-jit-compiler-project/) нового легковесного JIT-компилятора MIR (https://github.com/vnmakarov/mir), обеспечивающего выполнение кода, предварительно преобразованного в промежуточное представление MIR (Medium Internal Representation, не путать с другим промежуточным представлением MIR (https://blog.rust-lang.org/2016/04/19/MIR.html) (mid-level IR), применяемым в компиляторе Rust). Проект нацелен на предоставление основы для реализации быстрых и компактных интерпретаторов и JIT. Код проекта написан на языке Си и распространяется (https://github.com/vnmakarov/mir) под лицензией MIT.

На текущей стадии разработки трансляторы в промежуточное представление MIR подготовлены для языка Си (https://github.com/vnmakarov/mir/tree/master/c2mir) и биткода LLVM (https://github.com/vnmakarov/mir/tree/master/llvm2mir) (Bitcode), но в будущем планируется реализовать возможность генерации MIR для WebAssembly, байткода Java, CIL (https://ru.wikipedia.org/wiki/Common_Intermediate_Language) (Common Intermediate Language), Rust и C++. Проект развивается одним из разработчиков JIT-движка MJIT (https://github.com/k0kubun/yarv-mjit), используемого в Ruby. В первую очередь JIT на базе MIR планируется реализовать для CRuby (https://github.com/ruby/ruby) и MRuby (https://github.com/mruby/mruby). В будущем также не исключается возможность портирования GCC на использование MIR.

https://www.opennet.ru/opennews/pics_base/0_1579584861.png (https://www.opennet.ru/opennews/pics_base/0_1579584835.png)

Промежуточный код MIR может быть представлен в бинарном и текстовом (читаемом) виде. Данный код можно будет исполнить в интерпретаторе, сгенерировать на его основе машинный код (x86_64, в планах ARM64, PPC64 и MIPS64). Возможно и выполнение обратного преобразования - из MIR в CIL, байткод Java, WebAssembly и код на языке Си.

Из особенностей MIR выделятся строгая типизация, поддержка модулей и функций, предоставление набора инструкций для преобразования типов, сравнения, арифметических и логических операций, ветвления и т.п. Модули, включающие набор функций, преобразованных в формат MIR, могут загружаться в форме библиотек, а также загружать внешний код на языке Си.

https://www.opennet.ru/opennews/pics_base/0_1579585709.png (https://www.opennet.ru/opennews/pics_base/0_1579585700.png)https://www.opennet.ru/opennews/pics_base/0_1579585657.png (https://www.opennet.ru/opennews/pics_base/0_1579585645.png)

Ключевым достоинством выполнения промежуточного кода в JIT вместо компиляции в нативные исполняемые файлы, является возможность формирования компактных файлов, которые могут выполняться без пересборки на разных аппаратных архитектурах (x86, ARM, PPC, MIPS). Для неподдерживаемых архитектур доступен режим интерпретации, который в случае MIR работает в 6-10 раз медленнее JIT.

Из недостатков существующих JIT-компиляторов GCC и LLVM называется их излишняя раздутость, низкая скорость компиляции и трудность реализации комбинированных оптимизаций для разных языков программирования. Разработчики MIR попытались решить эти проблемы и поставили перед собой цели:


Компиляция в MIR должна осуществляться как минимум в 100 раз быстрее, чем в GCC;

JIT для исполнения MIR должен быть очень компактным и включать примерно 15 тысяч строк кода;

Исполнение MIR с использованием JIT должно быть не более чем на 30% медленнее, чем производительность исполняемого файла, собранного на основе того же Си-кода в GCC (с оптимизациями "-O2");

Стадии инициализации до начала фактического исполния должны занимать в 100 раз меньше времени;

MIR-представление для JIT должны быть в 100 раз меньше собранного в GCC исполняемого файла.
В текущем виде реализация MIR во многим опережает изначально поставленные цели: проведённые тесты показали, что производительность компиляции в MIR быстрее "GCC -O2" в 178 раз, производительность исполнения отстаёт от нативного кода на 6%, размер кода меньше в 144 раза, реализация MIR JIT составляет 16 тысяч строк кода.

https://www.opennet.ru/opennews/pics_base/0_1579588985.png (https://www.opennet.ru/opennews/pics_base/0_1579588980.png)

21.01.2020

http://www.opennet.ru/opennews/art.shtml?num=52223