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