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
};
Что можно сделать с этими данными?
- Можно выполнить эти команды последовательно и выдать пользователю результат
- Либо мы могли бы преобразовать (транслировать) эти данные в исходный код на языке программирования C
- Мы могли бы проанализировать эти данные и дать ответ о неких свойствах программы, к примеру, может ли она транслироваться в исходный код на языке C, который будет компилироваться и выполняться корректно
- Всё что угодно, на самом деле. Более того, практически любая программа, обрабатывающая данные, занимается выявлением смысла данных, то есть интерпретацией
Итак,
Интерпретатор это программа, которая берёт данные, определяет их смысл, и что-то с этим делает.
Это не значит, что я пытаюсь убедить читателя, что интерпретатор и программа это синонимы и мы будем писать в этом туториале что попало. Нет, мы всё же будем писать именно интерпретаторы для языков программирования. Тем не менее, мысль о том, что интерпретатор это просто очередная программа, обрабатывающая данные, не лживая. А мысль о том, что можно найти скрытые языки программирования в данных для обычных программ, на мой взгляд, ещё и очень мощная.
Мы в данной главе сконцентрируем своё внимание на первом варианте интерпретации набора команд (то есть, на фактическом их последовательном выполнении). В дальнейшем будут рассмотрены и другие (трансляция в байткод и в код на языке C).