В последнее время один из главных Разработчики CPython представили новый JIT-компилятор для Python используя технику копирования и исправления, который новейшая и инновационная техника компиляции что выделяется своей скоростью, простотой обслуживания и его полная интеграция с существующим интерпретатором.
Копирование и исправление основан на использовании предопределённой библиотеки фрагментов двоичного кода, известных как «шаблоны» для вывода оптимизированного машинного кода. Эти шаблоны представляют собой предварительно созданные реализации узлов AST (абстрактного синтаксического дерева) или байтовых кодов операций, которые содержат пропущенные значения, такие как непосредственные литералы, смещения переменных стека, а также цели ветвления и вызова.
Он позволяет систематически генерировать варианты бинарных шаблонов на C++ чистым и чистым способом. Использует инфраструктуру компилятора Clang+LLVM. чтобы скрыть конкретные детали платформы на низком уровне.
Во время выполнения оптимизация и генерация кода становятся более простыми задачамиl Найдите таблицу данных, содержащую соответствующий шаблон, создайте ее экземпляр и поместите ее в нужное положение с помощью процесса копирования и исправления, корректируя любые недостающие значения для исправления во время выполнения.
Если смотреть на это с более простой точки зрения, то он состоит из компиляции (копирования) существующего исходного кода и корректировки недостающих значений или конкретных модификаций (патчей).
Copy-and-Patch значительно облегчает автоматическое преобразование интерпретатора, написанного на языке C. в JIT-компиляторе, что устраняет необходимость отдельно создавать логику генерации кода и представления компиляции. Благодаря использованию общего генератора кода исправление ошибок в интерпретаторе приводит к автоматическому решению тех же проблем в JIT.
Подход копирования и исправления основан на сходстве между перемещением кода в памяти. Когда компоновщик загружает объектные файлы и подставляет машинные инструкции вместо байт-кода в JIT, это аналогичные задачи. Во время выполнения программы lПеречислены инструкции байт-кода, сгенерированные интерпретатором: и предварительно скомпилированный машинный код копируется для каждой инструкции в исполняемую область памяти, затем из этого инструкции Они динамически изменяются для замены обработанных данных в реальном времени. В случае JIT предопределенные шаблоны копируются из уже скомпилированных функций и заменяются необходимыми значениями, такими как аргументы и константы).
Внедрение JIT с использованием метода копирования и исправления включает в себя компиляцию объектного файла в формате ELF илис помощью ЛЛВМ. Этот объектный файл содержит информацию об инструкциях байт-кода и сведения о необходимой замене данных. Во время выполнения JIT заменяет инструкции байт-кода, сгенерированные интерпретатором, представлениями машинного кода, одновременно корректируя данные, необходимые для вычислений. Хотя реализация JIT требует LLVM в качестве зависимости во время компиляции, компоненты среды выполнения не привязаны к внешним зависимостям, что сокращается примерно до 300 строк рукописного кода C и 3000 строк сгенерированного кода C.
Что касается производительности, предлагаемый JIT с методом копирования и исправления представляет заметные улучшения по сравнению с традиционными подходами. По сравнению с обычными JIT-компиляторами (LLVM-O0) он генерирует код в 100 раз быстрее, а результирующий код Это на 15% эффективнее. В области компиляции WebAssembly (Liftoff) появился новый JIT. демонстрирует генерацию кода в 5 раз быстрее, а полученный код выполняется на 50 % быстрее.
По сравнению с JIT-компилятором оптимизации, таким как LuaJIT, который использует написанный вручную ассемблерный код, предлагаемый JIT показал лучшие результаты в 13 из 44 тестов. Хотя в среднем он отставал по производительности на 35%, важно подчеркнуть, что эта разница компенсируется значительным упрощением обслуживания и снижением сложности реализации. Этот баланс между производительностью и эффективностью управления кодом делает предлагаемый JIT привлекательной альтернативой в сфере производительности.
Финалменыи если вам интересно узнать об этом больше, вы можете проверить подробности По следующей ссылке.