В качестве упражнения, которое поможет мне узнать об интерпретаторах и оптимизации, ни о которых я ничего не знаю, я написал мозговой интерпретатор на C. Похоже, что до сих пор он работает безупречно, хотя он не очень хорошо конкурирует по скорости выполнения по сравнению с другими быстрыми интерпретаторами.
Какими способами я могу изменить этот интерпретатор, чтобы улучшить производительность (или иначе)?
Один интересный аспект моего интерпретатора (хотя большинство других, вероятно, так делают это также) заключается в том, что я запускаю один цикл, который читает исходный ввод и преобразует каждую инструкцию в
struct { long instruction; long loop; }
. Значение цикла
является индексом соответствующей инструкции ]
, если инструкция имеет вид [
, а индекс соответствующей инструкции [
, если инструкция является ]
, что позволяет быстро переходить. Я полагаю, что этот процесс «синтаксического анализа» (который не занимает много времени) улучшает время выполнения по сравнению с повторным повторным анализом, чтобы находить подходящие квадратные скобки каждый раз, когда они необходимы.
Интересный тест скорости интерпретатора мозговой деятельности - это программа:
++++++++[->-[->-[->-[-]<]<]<]>++++++++[<++++++++++>-]<[>+>+<<-]>-.>-----.>
инструкция
прямой указатель на функцию операции - работает медленнее, чем в предыдущей версии (накладные расходы на вызов функции?)