Я написал реализацию Brainfuck (C ++), которая работает следующим образом:
- Прочитать входной файл brainfuck
- Сделайте тривиальную оптимизацию
- Преобразование brainfuck в машинный код для виртуальной машины
- Выполните этот машинный код в виртуальной машине
Это довольно быстро, но теперь узким местом является виртуальная машина. Он написан на C ++ и читает токен, выполняет действие (которого совсем немного, если вы знаете Brainfuck) и так далее.
Что я хочу сделать, так это вырезать виртуальную машину и на лету сгенерировать собственный машинный код (то есть, в основном, JIT-компилятор). Это легко может быть 20-кратное ускорение.
Это означало бы, что шаг 3 заменяется JIT-компилятором, а шаг 4 - выполнением сгенерированного машинного кода.
Я действительно не знаю, с чего начать, поэтому у меня есть несколько вопросов:
- Как это работает, как выполняется сгенерированный машинный код?
- Существуют ли библиотеки C ++ для генерации машинного кода?