Я бы хотел написать очень маленький JIT-компилятор для разработки игрушечного процессора, который я написал (чисто академический), но у меня проблемы с дизайном среднего уровня. Концептуально, я знаком с тем, как работает JIT - вы компилируете байт-код в (машинный или сборный?) Код для запуска. Однако на уровне орехов и болтов я не совсем понимаю, как вы на самом деле делаете это.
Моя (очень "новая" ) реакция коленного рефлекса, так как у меня нет первой подсказки, с которой начать, было бы попробовать что-то вроде следующего:
- mmap() блок памяти, установив доступ к PROT_EXEC
- записать собственный код в блок
- хранить текущие регистры (указатель стека и т.д.) где-то уютно
- изменить текущие регистры, чтобы указать на собственный блок кода в отображаемой области
- исходный код теперь будет выполняться машиной
- восстановить предыдущие регистры
Является ли это даже близким к/правильному алгоритму? Я пробовал изучать разные проекты, которые, как я знаю, имеют JIT-компиляторы для изучения (например, V8), но эти кодовые базы оказываются трудными потребляют из-за их размера, и я не знаю, с чего начать искать.