Эта статья включает список общих ссылок , но в ней отсутствуют соответствующие встроенные цитаты . ( Август 2010 ) |
В информатике абстрактный синтаксис высшего порядка (сокращенно HOAS ) — это метод представления абстрактных синтаксических деревьев для языков с переменными связями .
Абстрактный синтаксис является абстрактным , потому что он представлен математическими объектами , которые по своей природе имеют определенную структуру. Например, в деревьях абстрактного синтаксиса первого порядка ( FOAS ), которые обычно используются в компиляторах , структура дерева подразумевает отношение подвыражения, что означает, что для устранения неоднозначности программ не требуются скобки (как это происходит в конкретном синтаксисе ). HOAS раскрывает дополнительную структуру: связь между переменными и их сайтами привязки. В представлениях FOAS переменная обычно представлена идентификатором, причем связь между сайтом привязки и использованием указывается с помощью того же идентификатора. В HOAS нет имени для переменной; каждое использование переменной напрямую ссылается на сайт привязки.
Есть ряд причин, по которым эта техника полезна. Во-первых, она делает структуру связывания программы явной: так же, как нет необходимости объяснять приоритет операторов в представлении FOAS, нет необходимости иметь правила связывания и области действия под рукой для интерпретации представления HOAS. Во-вторых, программы, которые являются альфа-эквивалентными (отличающимися только именами связанных переменных), имеют идентичные представления в HOAS, что может сделать проверку эквивалентности более эффективной.
Одним из математических объектов, который можно использовать для реализации HOAS, является граф , в котором переменные связаны с их сайтами связывания через ребра . Другой популярный способ реализации HOAS (например, в компиляторах) — это индексы де Брейна .
Первым языком программирования, который напрямую поддерживал λ-связывания в синтаксисе, был язык логического программирования высшего порядка λProlog . [1] В статье, в которой был введен термин HOAS [2], для его иллюстрации использовался код λProlog. К сожалению, когда термин HOAS переносится из логического программирования в функциональное программирование , этот термин подразумевает идентификацию связываний в синтаксисе с функциями над выражениями. В этом последнем случае HOAS имеет другой и проблематичный смысл. Термин синтаксис λ-дерева был введен специально для обозначения стиля представления, доступного в логическом программировании. [3] [4] Хотя в деталях обработка связываний в λProlog отличается, она похожа на их обработку в логических фреймворках, подробно описанную в следующем разделе.
В области логических структур термин «абстрактный синтаксис высшего порядка» обычно используется для обозначения конкретного представления, которое использует связующие элементы метаязыка для кодирования связующей структуры объектного языка.
Например, логическая структура LF имеет λ-конструкцию, которая имеет тип стрелки (→). В качестве примера предположим, что мы хотим формализовать очень примитивный язык с нетипизированными выражениями, встроенным набором переменных и конструкцией let ( ) let <var> = <exp> in <exp'>
, которая позволяет связывать переменные var
с определением exp
в выражениях exp'
. В синтаксисе Twelf мы могли бы сделать следующее:
exp : тип . var : тип . v : var -> exp . let : var -> exp -> exp -> exp .
Здесь exp
— тип всех выражений и var
тип всех встроенных переменных (возможно, реализованных как натуральные числа , что не показано). Константа v
действует как функция приведения и свидетельствует о том, что переменные являются выражениями. Наконец, константа let
представляет конструкции let формы let <var> = <exp> in <exp>
: она принимает переменную, выражение (связанное переменной) и другое выражение (внутри которого связана переменная).
Каноническое представление HOAS того же языка объектов будет выглядеть следующим образом :
exp : тип . пусть : exp -> ( exp -> exp ) -> exp .
В этом представлении переменные уровня объекта не появляются явно. Константа let
принимает выражение (которое связывается) и функцию метауровня exp
→ exp
(тело let). Эта функция является частью высшего порядка : выражение со свободной переменной представлено как выражение с дырками , которые заполняются функцией метауровня при применении. В качестве конкретного примера мы бы построили выражение уровня объекта
пусть x = 1 + 2 в x + 3
(предполагая естественные конструкторы для чисел и сложения) с использованием сигнатуры HOAS выше как
пусть ( плюс 1 2 ) ([ y ] плюс y 3 )
где [y] e
— синтаксис Twelf для функции .
Это конкретное представление имеет преимущества, выходящие за рамки вышеперечисленных: во-первых, повторно используя метауровневое понятие связывания, кодирование пользуется такими свойствами, как подстановка с сохранением типа без необходимости определять/доказывать их. Таким образом, использование HOAS может радикально сократить объем шаблонного кода, связанного со связыванием в кодировании.
Высший абстрактный синтаксис обычно применим только тогда, когда переменные объектного языка можно понимать как переменные в математическом смысле (то есть как замены произвольных членов некоторого домена). Это часто, но не всегда, так: например, нет никаких преимуществ, которые можно получить от кодирования HOAS динамической области действия , как это появляется в некоторых диалектах Lisp , потому что динамически ограниченные переменные не действуют как математические переменные.