152
Глава 4. Системы исполнения функциональных
программ
4.1. Промежуточный язык программирования
В этой главе мы построим несколько программ для исполнения кода,
написанного на функциональных языках, для того, чтобы более тщательно
исследовать вопрос о том, как исполняются функциональные программы.
До сих пор мы лишь на словах описывали, как следует понимать те или
иные конструкции языка Haskell или иного языка функционального
программирования. Для того
чтобы более точно описать семантику
исполнения, следует написать какую-либо программу, способную
исполнять предъявленный ей функциональный код. Разумеется, такие
программы мы будем описывать на языке Haskell, этот язык достаточно
удобен для того, чтобы на нем записывать сложные алгоритмы. Однако в
качестве исходного, интерпретируемого языка язык Haskell не очень
хорошо приспособлен
для демонстрационных целей. В нем слишком
много различных конструкций, многие из которых являются просто
удобными синтаксическими сокращениями для других, может быть, более
общих конструкций (это то, что системные программисты обычно
называют «синтаксическим сахаром»). Чтобы не перегружать наши
программы излишними деталями, мы возьмем в качестве исходного языка
расширенное лямбда-исчисление, достаточно простое
и в то же время
достаточно мощное для того, чтобы можно было на нем выразить любые
конструкции функциональных языков программирования.
Прежде всего, поскольку в наших построениях программы,
записанные на языке расширенного лямбда-исчисления, являются
предметом обработки других программ, следует подумать о том, как
удобнее всего представлять конструкции расширенного лямбда-
исчисления
в наших программах.
Конечно, можно просто считать, что программа на языке
расширенного лямбда-исчисления будет представлена строкой текста,
однако такое представление, несмотря на его большую общность, является
очень неудобным для обработки. Обычно перед тем, как начать
исследовать или исполнять некую программу, ее переводят в некоторую
промежуточную форму, представляющее собой синтаксическое дерево
исходной программы. Мы не будем описывать процесс перевода текста
программы в синтаксическое дерево, интересующиеся этим процессом
студенты могут обратиться к многочисленной литературе по устройству и
построению синтаксических анализаторов в компиляторах языков
программирования. Мы же опишем только само синтаксическое дерево –
результат синтаксического анализа выражения, записанного в
расширенном лямбда-исчислении.