52700.fb2
мы. Затем из STG генерируется код языка C–. Это язык низкого уровня, “портируемый ассемблер”. На этом
языке не пишут программы, он предназначен для автоматической генерации кода. Далее из него получают
другие низкоуровневые коды. Возможна генерация C, LLVM и нативного кода (код, который исполняется
операционной системой).
10.2 Язык STG
STG расшифровывается как Spineless Tagless G-machine. G-machine или Г-машина – это низкоуровневое
описание процесса редукции графов (от Graph). Пока мы называли этот процесс редукцией синонимов.
Spineless и Tagless – это термины специфичные для G-машины, которая была придумана разработчиками
GHC. Tagless относится к особому представлению объектов в куче (объекты представлены единообразно, так
156 | Глава 10: Реализация Haskell в GHC
что им не нужен специальный тег для обозначения типа объекта), а Spineless относится к тому, что в от-
личие от машин-предшественников, которые описывают процесс редукции графов виде последовательности
инструкций, STG является небольшим функциональным языком. На (рис. ?? ) представлен синтаксис языка
STG. Синтаксис упрощён для чтения людьми. Несмотря на упрощения мы сможем посмотреть как происходит
вычисление выражений.
Переменные x, y, f, g
Конструкторы
C
Объявлены в определениях типов
Литералы
lit
::=
i | d
Незапакованные целые
или действительные числа
Атомы
a, v
::=
lit | x
Аргументы функций атомарны
Арность функции
k
::=
•
Арность неизвестна
|
n
Арность известна n ≥ 1
Выражения
e
::=
a
Атом
|
f k a 1 . . . an
Вызов функции ( n ≥ 1)
|
⊕ a 1 . . . an
Вызов примитивной функции ( n ≥ 1)