Это может быть поздно, но ради помощи любому другому, я публикую этот ответ.
JIT-компилятор имеет все шаги, которые есть у AOT-компилятора.Основное отличие состоит в том, что компилятор AOT выводит машинно-зависимый код в исполняемый файл, такой как exe и т. Д., В то время как JIT-компилятор загружает машинно-зависимый код в память во время выполнения (следовательно, это приводит к снижению производительности, поскольку каждый раз, когда ему нужно перекомпилировать и загружать).
Как JIT-компилятор загружает машинный код в память во время выполнения?
Я не буду учить вас машинному коду, потому что я предполагаю, что вы уже знаете об этом,
напримерассемблерный код
mov rax,0x1
переводится в
48 c7 c0 01 00 00 00
, вы динамически генерируете переведенный код и сохраняете его в такой вектор (это вектор C)
vector machineCode{
0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00,
}
затем вы копируете этот вектор в память, для этого вам нужно знать объем памяти, требуемый этим кодом, который вы можете получить с помощью machinecode.size (), и учитывать размер страницы.
дляскопируйте этот вектор в память, вам нужно вызвать функцию mmap в C. установить указатель на начало вашего кода и вызвать его.Вам хорошо идти.
Извините, если что-то не понятно, вы всегда можете проверить этот пост для простоты https://solarianprogrammer.com/2018/01/10/writing-minimal-x86-64-jit-compiler-cpp/ https://github.com/spencertipping/jit-tutorial