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