Я написал виртуальную машину на C, которая имеет достойную производительность для не-JIT VM, но я хочу узнать что-то новое и повысить производительность. Моя текущая реализация просто использует переключатель для перевода из байт-кода VM в инструкции, который скомпилирован в таблицу перехода. Как я уже сказал, достойная производительность для того, что она есть, но я ударил барьер, который можно преодолеть только с помощью JIT-компилятора.
Я уже давно задал подобный вопрос о самомодифицирующем коде, но я понял, что не задаю правильный вопрос.
Итак, моя цель - написать JIT-компилятор для этой виртуальной машины C, и я хочу сделать это в сборке x86. (Я использую NASM в качестве моего ассемблера). Я не совсем уверен, как это сделать. Мне нравится сборка, и я просмотрел некоторые самомодифицирующие примеры кода, но я еще не понял, как делать генерации кода.
До сих пор мой основной блок копирует инструкции в исполняемый фрагмент памяти с моими аргументами. Я знаю, что я могу пометить определенную строку в NASM и скопировать всю строку с этого адреса статическими аргументами, но это не очень динамично и не работает для JIT-компилятора. Мне нужно уметь интерпретировать инструкцию из байт-кода, копировать ее в исполняемую память, интерпретировать первый аргумент, копировать его в память, затем интерпретировать второй аргумент и копировать его в память.
Мне сообщили о нескольких библиотеках, которые облегчили бы эту задачу, например, молнию GNU и даже LLVM. Однако сначала я хотел бы написать это вручную, чтобы понять, как это работает, прежде чем использовать внешние ресурсы.
Есть ли какие-либо ресурсы или примеры, которые это сообщество может предоставить, чтобы помочь мне начать работу над этой задачей? Простой пример, показывающий две или три команды типа "добавить" и "mov", используемые для генерации исполняемого кода, с аргументами, динамически, в памяти, будет творить чудеса.