I. 2. Рецепт интерпретатора - madwareru/drafting-interpreters GitHub Wiki

Итак, мы разобрались, что программа на языке с обратной польской записью представляет собой линейный набор простых команд. Этот набор команд сам по себе является ни больше ни меньше чем просто данными, которые можно было бы записать как-то так:

var myProgramData = new[] { 
    Operation.Put(3), 
    Operation.Put(4), 
    Operation.Put(9), 
    Operation.Add, 
    Operation.Div, 
    Operation.Put(-7), 
    Operation.Add,
    Operation.Sqrt
};

Что можно сделать с этими данными?

  1. Можно выполнить эти команды последовательно и выдать пользователю результат
  2. Либо мы могли бы преобразовать (транслировать) эти данные в исходный код на языке программирования C
  3. Мы могли бы проанализировать эти данные и дать ответ о неких свойствах программы, к примеру, может ли она транслироваться в исходный код на языке C, который будет компилироваться и выполняться корректно
  4. Всё что угодно, на самом деле. Более того, практически любая программа, обрабатывающая данные, занимается выявлением смысла данных, то есть интерпретацией

Итак,

Интерпретатор это программа, которая берёт данные, определяет их смысл, и что-то с этим делает.

Это не значит, что я пытаюсь убедить читателя, что интерпретатор и программа это синонимы и мы будем писать в этом туториале что попало. Нет, мы всё же будем писать именно интерпретаторы для языков программирования. Тем не менее, мысль о том, что интерпретатор это просто очередная программа, обрабатывающая данные, не лживая. А мысль о том, что можно найти скрытые языки программирования в данных для обычных программ, на мой взгляд, ещё и очень мощная.

Мы в данной главе сконцентрируем своё внимание на первом варианте интерпретации набора команд (то есть, на фактическом их последовательном выполнении). В дальнейшем будут рассмотрены и другие (трансляция в байткод и в код на языке C).