На самом деле существует много общего между сортировками для синтаксиса и типов, как обычно понимают. Но сортировки являются формальной синтаксической концепцией , а деревья AS также являются синтаксисом, а типы - семантической концепцией .
Терминология происходит от термина алгебры (также называемые свободными алгебрами ) и универсальной алгебры . Это, по сути, синтаксические теории алгебраических структур, которые анализируются независимо от каких-либо интерпретаций. Они были разработаны в первой половине 20-го века.
Термин можно рассматривать как дерево, где узлы помечены из конечного набора операторов, причем каждый оператор имеет фиксированную арность, которая определяет количество дочерей в дереве. Arity 0 для листьев. В многосортных алгебрах это уточняется с помощью сортировок, так что каждый оператор принадлежит к сортировке, а арности заменяются упорядоченным списком сортировок, который фиксирует для каждой дочерней функции своего оператора заголовка. Род оператора вместе со списком родов его дочери называется сигнатурой оператора.
В универсальных алгебрах это дополнительно уточняется путем введения эквационально определенных отношений эквивалентности между членами.
Хотя кажется, что они немного поблекли, эти концепции были довольно популярны и широко изучались в компьютерных науках в конце 20-го века как абстрактные алгебры, которые затем рассматривались как основа для абстрактных типов данных, что отчасти является предшественником того, что nos классы в объектно-ориентированном программировании.
Универсальные алгебры связаны с развитием теории категорий, которая также лежит в основе современного видения типов и языков программирования.
Алгебры являются синтаксическим объектом и предназначены для использования с интерпретацией в некоторых семантических областях, соответствующих типам. Интерпретация - это гомоморфизм, который отображает сортировки в области значений (типов) , а операторы - в функции между этими областями, так что сигнатуры соблюдаются, а уравнения - в случае эквациональной алгебры. Вот как вы можете применить результаты теории групп к любой области с помощью операции, которая соответствует определению группы.
Эта организация считалась очень удобной для ранних исследователей языков программирования, особенно тех, которые занимались формализацией языков программирования. Он имел преимущество в том, что изолировал синтаксис и семантику и был хорошо понят математически.
Другой причиной его принятия была озабоченность разработкой инструмента для манипулирования программами, как в средах разработки, так и в формальных системах для проверки свойств программ (что оказалось все более и более двойственной проблемой).
Это привело к появлению концепции абстрактного синтаксического дерева (AST) для языков программирования, которые по сути являются терминами многосортной алгебры (иногда уточняемой с использованием объединения сортировки в некоторых системах). AST является эталонным синтаксисом для языка, из которого семантика может быть определена гомоморфизмом, как в денотационной семантике.
Это не только удобно для изучения семантики языков, но деревья лучше структурированы, чем строки, и, следовательно, являются лучшей основой для разработки инструментов программирования и сред программирования.
Это позволяет выделить синтаксический анализ, который традиционно был беспорядочной частью, поскольку ограничения технологии синтаксического анализа вынуждали использовать искаженные грамматики. Это также учитывает проблемы с презентацией.
Он допускает несколько конкретных (строковых или графических) представлений программ, что иногда может быть удобным (нет причин, по которым использование знаков препинания, а не табуляции или наоборот, в синтаксисе программы должно быть навязано людям).
Это позволяет легко определять многие интерпретации программ и их разновидности для анализа свойств программ с помощью абстрактных интерпретаций.
Это удобно для написания (полу) автоматизированных программных инструментов манипулирования, например, для автоматического преобразования программ или переводов между языками.
Иногда на практике все может быть немного сложнее, потому что некоторые формы абстрактного синтаксиса позволяют некоторым операторам создавать деревья (выражения), принадлежащие к нескольким видам (неформальный взгляд на это). Например, может быть сортировка для синтаксических конструкций, которые представляют переменные (присваиваемые сущности), и другая для выражений. Но любая переменная может быть использована в качестве выражения, обратное значение равно false.
Первые статьи об этом для языков программирования датируются серединой семидесятых. Концептуализация в то время предназначалась для создания синтаксически-ориентированных (затем использовалось слово «направленный») сред программирования. Ищите наставника и кентавра в Европе и синтезатор программ Корнелла в США. Они были первыми двумя системами, которые фактически использовали такие концепции на практике. Многие другие были разработаны впоследствии.
Но абстрактный синтаксис предшествует этим системам. Язык Lisp (1958) имел абстрактный синтаксис, что неудивительно, так как он был разработан логиком, и с целью создания программ, которые манипулируют программами (см. Также ML и LCF ..., которые появились позже). Но Лисп не был отсортирован: все было синтаксически списком, а более утонченная структура была существенно зависима от семантики. Это приводит к тому, что некоторые люди ошибочно полагают, что в Лиспе нет синтаксиса.