Создание JIT-компилятора

Я написал реализацию Brainfuck (C ++), которая работает следующим образом:

  1. Прочитать входной файл brainfuck
  2. Сделать тривиальную оптимизацию
  3. Преобразовать мозговую черту в машинный код для виртуальной машины
  4. Выполнить машинный код в виртуальной машине

Это довольно быстро, но теперь узким местом является виртуальная машина. Он написан на C ++ и читает токен, выполняет действие (которого совсем немного, если вы знаете Brainfuck) и т. Д.

Я хочу вырезать виртуальную машину и сгенерировать собственный машинный код на ней. fly (по сути, JIT-компилятор). Это легко может быть 20-кратным ускорением.

Это будет означать, что шаг 3 будет заменен JIT-компилятором, а шаг 4 - выполнением сгенерированного машинного кода.

Я действительно не знаю, с чего начать, поэтому у меня есть несколько вопросов:

  1. Как это работает, как выполняется сгенерированный машинный код?
  2. Существуют ли какие-либо библиотеки C ++ для генерации собственного машинного кода?
13
задан orlp 13 May 2011 в 01:44
поделиться