Оптимизация для мозгового интерпретатора

В качестве упражнения, которое поможет мне узнать об интерпретаторах и оптимизации, ни о которых я ничего не знаю, я написал мозговой интерпретатор на C. Похоже, что до сих пор он работает безупречно, хотя он не очень хорошо конкурирует по скорости выполнения по сравнению с другими быстрыми интерпретаторами.

Какими способами я могу изменить этот интерпретатор, чтобы улучшить производительность (или иначе)?

Один интересный аспект моего интерпретатора (хотя большинство других, вероятно, так делают это также) заключается в том, что я запускаю один цикл, который читает исходный ввод и преобразует каждую инструкцию в

struct { long instruction; long loop; }

. Значение цикла является индексом соответствующей инструкции ] , если инструкция имеет вид [, а индекс соответствующей инструкции [, если инструкция является ] , что позволяет быстро переходить. Я полагаю, что этот процесс «синтаксического анализа» (который не занимает много времени) улучшает время выполнения по сравнению с повторным повторным анализом, чтобы находить подходящие квадратные скобки каждый раз, когда они необходимы.

Интересный тест скорости интерпретатора мозговой деятельности - это программа:

++++++++[->-[->-[->-[-]<]<]<]>++++++++[<++++++++++>-]<[>+>+<<-]>-.>-----.>
  1. первая версия интерпретатора
  2. интерпретатора после реализации ответа Джерри Коффина , который удаляет гигантский переключатель в цикле выполнения, создавая структуру инструкции инструкция прямой указатель на функцию операции - работает медленнее, чем в предыдущей версии (накладные расходы на вызов функции?)
  3. интерпретатор после отмены предыдущего изменения и добавление оптимизации для «свертывания» нескольких последовательных операций без цикла, сокращение циклов цикла - это работает немного быстрее, чем исходный

32
задан Community 23 May 2017 в 12:09
поделиться