WikiDer > OMeta
OMeta это специализированный объектно-ориентированный язык программирования для сопоставление с образцом, разработанный Алессандро Вартом и Яном Пиумартой в 2007 году под Точки зрения научно-исследовательский институт. Язык основан на Анализ грамматик выражений (ПЭГ), а не Контекстно-свободные грамматики с целью предоставить программистам «естественный и удобный способ реализации токенизаторы, парсеры, посетители, и дерево-трансформеры ».[1]
Основная цель OMeta - позволить более широкой аудитории использовать методы, обычно доступные только языковым программистам, такие как синтаксический анализ.[1] Он также известен своим использованием для быстрого создания прототипов, хотя программы, написанные на OMeta, как правило, менее эффективны, чем программы, написанные на ванильных (базовых) реализациях, таких как JavaScript.[2][3]
OMeta известна своим использованием в создании предметно-ориентированные языки, и особенно из-за ремонтопригодности его реализаций (Newcome). ОМета, как и другие метаязыки, требуется основной язык; изначально он был создан как реализация COLA.[1]
Описание
OMeta - это метаязык, используемый при прототипировании и создании предметно-ориентированные языки. Он был представлен как «объектно-ориентированный язык для сопоставления с образцом».[1] Оно использует анализ грамматик выражений (описания языков, «основанные на распознавании строк, а не на их генерации»[4]) разработан «для обработки произвольных типов данных», таких как символы, числа, строки, атомы и списки. Это увеличивает его универсальность, позволяя работать как со структурированными, так и неструктурированные данные.[1]
Основное преимущество языка перед аналогичными языками - это возможность использовать один и тот же код для всех этапов компиляции (например, лексирования и синтаксического анализа). OMeta также поддерживает определение производственных правил на основе аргументов; это можно использовать для добавления таких правил к самой OMeta, а также к основному языку, на котором работает OMeta. Кроме того, эти правила могут использовать друг друга в качестве аргументов, создавая «правила более высокого порядка», и наследовать друг друга для повышения производительности. правила из существующего кода. OMeta может использовать логические значения основного языка (True / False) при сопоставлении с образцом; они называются «семантическими предикатами». OMeta использует обобщенное сопоставление с образцом, чтобы позволить программистам более легко реализовывать и расширять этапы компиляции с помощью одного инструмента.[1]
OMeta использует грамматику для определения правил, по которым она работает. Грамматики могут содержать неопределенное количество переменных благодаря использованию функции __init__, вызываемой при создании грамматики. Грамматики могут наследовать друг друга, а также вызывать друг друга (с использованием «механизма вызова внешнего производства», позволяющего грамматикам «заимствовать» входные потоки друг друга), во многом подобно классам в полных языках программирования.[1] OMeta также отдает приоритет параметрам в рамках данной грамматики, чтобы устранить двусмысленность, в отличие от большинства метаязыков. После сопоставления входных данных с заданной грамматикой с шаблоном OMeta затем назначает каждый компонент шаблона переменной, которую затем передает на основной язык.[5]
OMeta использует сопоставление с образцом, чтобы самостоятельно выполнить все шаги традиционной компиляции. Сначала он находит шаблоны в символах для создания токенов, а затем сопоставляет эти токены со своей грамматикой для создания синтаксических деревьев. Затем средства проверки типов сопоставляют шаблоны в синтаксических деревьях для создания аннотированных деревьев, а посетители делают то же самое для создания других деревьев. Затем генератор кода сопоставляет деревья по образцу для создания кода.[3] В OMeta легко «перемещаться по дереву синтаксического анализа, поскольку такая функциональность изначально поддерживается».[3]
Мета-язык отличается удобством использования на большинстве языков программирования, хотя чаще всего он используется в языке его реализации - например, OMeta / JS используется в JavaScript.[5] Поскольку для этого требуется язык-носитель, создатели OMeta называют его «языком-паразитом».[6]
Развитие
Алессандро Варт и Ян Пиумарта разработали OMeta в Исследовательском институте Viewpoints, организации, призванной улучшить исследовательские системы и персональные вычисления, в 2007 году. Они впервые использовали комбинированную объектную лямбда-архитектуру, или COLA (язык с самоописанием, исследованный в Исследовательском институте Viewpoints) в качестве основного языка OMeta, а затем с помощью Йошики Осима перенес его на Squeak Smalltalk, чтобы проверить его пригодность для использования с несколькими языками-носителями. OMeta также использовалась «для реализации почти полного набора… Javascript» в качестве примера во вводной статье.[1]
Применение
OMeta, как и другие метаязыки, в основном используется для создания предметно-ориентированные языки (Короче DSL); в частности, он используется для быстрого прототипирования DSL - низкая скорость работы OMeta и нечеткие отчеты об ошибках лишают его функциональности как полноценного языка программирования (Heirbaut 73-74). OMeta полезна благодаря своей способности использовать один синтаксис для каждого этапа компиляции, что позволяет использовать его, а не несколько отдельных инструментов при создании компилятора.[5] Кроме того, OMeta ценится как за скорость, с которой ее можно использовать для создания DSL, так и за значительно меньший объем кода, который требуется для выполнения такой задачи, по сравнению с обычными реализациями: отчеты показывают примерно на 26% больше строк функционального кода. как ваниль.[2]
Примеры
Ниже приведен пример базового языка калькулятора на C # с использованием OMeta:
ометаBasicCalc<:Парсер{ Цифра = супер:d -> d.ToDigit(), Число = Число:п Цифра:D -> (п * 10 + d) | Цифра, AddExpr = AddExpr:Икс ‘+’ MulExpr:y -> (Икс + y) | AddExpr:Икс ‘-’ MulExpr:y -> (Икс - y) | MulExpr, MulExpr = MulExpr:Икс ‘*’ primExpr:y -> (Икс * y) | MulExpr:Икс ‘/’ primExpr:y -> (Икс / y) | PrimExpr, PrimExpr = ‘(‘ Expr:Икс ‘)’ -> Икс | Число, Expr = AddExpr }
Также возможно создавать подклассы написанных вами языков:
ометаExponentCalc<:BasicCalc{ MulExpr = MulExpr:Икс ‘^’ PrimExpr:е -> Математика.пау(Икс,е) | супер }
Ранее написанные языки также могут называться, а не унаследоваться:
ометаScientificCalc<:Парсер{ MathFunc :п = Токен(п) Пространства, AdvExp = MathFunc(‘sqrt’) AdvExp:Икс -> Математика.Sqrt(Икс) | ФакЭксп ФакЭксп = PrimExp:Икс ‘!’ -> { вар р = 1; для(; Икс > 1; Икс--) { р *= Икс; } вернуть р; } | PrimExp PrimExp = иностранный(ExponentCalc.Expr):Икс -> Икс Expr = AdvExp }
Версии
OMeta теоретически может быть реализована на любом основном языке, но чаще всего она используется как OMeta / JS, реализация JavaScript.[5] Варт заявил, что шаблоны в «OMeta / X --- где X - это некоторый хост-язык» лучше оставить для влияния «X», чем стандартизировать в OMeta, из-за того, что разные хост-языки распознают разные типы объектов.[6]
MetaCOLA
MetaCOLA была первой реализацией OMeta, использованной во вводной статье языка. MetaCOLA реализовала первые тестовые коды OMeta и была одной из трех форм (другие - OMeta / Squeak и почти законченная OMeta / JS) языка, созданного до его выпуска.[1]
OMeta / Писк
OMeta / Squeak был портом OMeta, который использовался во время первоначальной демонстрации системы. OMeta / Squeak используется «для экспериментов с альтернативными синтаксисами для системы Squeak EToys». OMeta / Squeak требует квадратных скобок и «заостренных скобок» (фигурных скобок) в операциях правил, в отличие от OMeta / JS, для которых требуются только квадратные скобки.[6] OMeta / Squeak 2, однако, имеет синтаксис, более похожий на OMeta / JS.[7] В отличие от реализации OMeta COLA, версия Squeak не запоминает промежуточные результаты (сохраняют числа, уже использованные в вычислениях).[1]
OMeta / JS
OMeta / JS - это OMeta в форме реализации JavaScript. Отмечено, что языковые реализации с использованием OMeta / JS проще в использовании и занимают меньше места, чем те, которые написаны с использованием только ванильного JavaScript, но было показано, что первые работают намного медленнее. Из-за этого OMeta / JS рассматривается как очень полезный инструмент для создания прототипов, но не является предпочтительным для реализаций рабочего языка.[3]
Vs. JavaScript
Использование инструментов разработки DSL, таких как OMeta, считается гораздо более удобным в обслуживании, чем «обычные реализации» (например, JavaScript) из-за их низкого количества NCLOC (Non-Comment Lines of Code). Частично это связано с «кодом семантического действия, который создает объекты AST или выполняет ограниченные строковые операции». Отсутствие в OMeta «контекстно-свободного синтаксиса» позволяет использовать его как при создании синтаксического анализатора, так и при создании лексера за счет дополнительных строк кода. Дополнительные факторы, указывающие на ремонтопригодность OMeta, включают высокий индекс ремонтопригодности, «в то время как усилия Холстеда указывают на то, что ванильный синтаксический анализатор требует в три раза больше усилий по разработке по сравнению с анализатором OMeta». Как и JavaScript, OMeta / JS поддерживает «полную синтаксическую нотацию Waebric».[3]
Одним из основных преимуществ OMeta, ответственных за различие в NCLOC, является повторное использование OMeta своего «механизма обхода дерева», позволяя контроллеру типов наследовать механизм от парсера, что заставляет проверку типов адаптироваться к изменениям в парсере OMeta, в то время как JavaScript Механизм обхода дерева содержит больше кода и должен быть вручную адаптирован к изменениям в парсере. Во-вторых, грамматики OMeta имеют «более высокий уровень абстракции ... чем программный код». Его также можно рассматривать как «результат кода семантического действия, который создает объекты AST или выполняет ограниченные строковые операции», хотя несемантика грамматики создает потребность в относительно большом количестве строк кода для каждой функции из-за явного определения пробелов - механизма реализовано, чтобы позволить OMeta действовать как единый инструмент для создания DSL.[3]
Что касается производительности, OMeta работает на медленных скоростях по сравнению с ванильными реализациями. Использование OMeta методов поиска с возвратом является потенциальной основной причиной этого (синтаксический анализатор OMeta «включает семь опережающих операторов ... Эти операторы необходимы, чтобы отличать определенные правила друг от друга, и их нельзя исключать из грамматики»); однако более вероятно, что это падение производительности связано с методом мемоизации OMeta:
«Сохранение промежуточных шагов синтаксического анализа приводит к тому, что размер таблицы синтаксического анализа пропорционален количеству терминалов и нетерминалов (операндов), используемых в грамматике. Поскольку грамматика синтаксического анализатора OMeta содержит 446 операндов, считается, что это отрицательно сказывается на производительности ».[3]
Однако, где OMeta выигрывает от ванильной реализации, так это в лексировании. Ванильный лексер JavaScripts значительно замедляется из-за метода, с помощью которого реализация преобразует всю программу в строку через Java до запуска лексера. Несмотря на это, реализация OMeta в целом работает значительно медленнее.[3]
OMeta также отстает в отношении отчетов об ошибках. В то время как обычные реализации возвращают правильное сообщение об ошибке примерно в «92% тестовых случаев» с точки зрения местоположения ошибки, OMeta просто возвращает «Match failed!» к любой данной ошибке. Для поиска источника через OMeta требуется «вручную ... подсчитать символы новой строки в семантическом коде действия, чтобы вывести хотя бы номер строки, на которой анализ не удался».[3]
OMeta #
OMeta # - это проект Джеффа Мозера, предназначенный для перевода OMeta / JS в функциональность C #; Таким образом, дизайн OMeta # основан на дизайне OMeta / JS Алессандро Варта. Цель проекта - дать пользователям возможность создавать рабочие языки с высокой простотой. В частности, OMeta # предназначена для работы в качестве единого инструмента для разработки языка .NET, сокращения крутой кривой обучения языковой разработке, превращения в полезный учебный ресурс и практического применения в реальных приложениях.[5] OMeta # в настоящее время использует C # 3.0 в качестве основного языка OMeta, а не 4.0; Поскольку C # 3.0 является статическим языком, а не динамическим, распознавание основного языка в OMeta # «в два-три раза уродливее и больше, чем могло бы быть» в динамически типизированном языке.[8]
OMeta # использует классы .NET или типы в качестве грамматик и методов для внутренних «правил» грамматик. OMeta # использует фигурные скобки ({и}) для распознавания своего основного языка в грамматиках. Этот язык ориентирован на строгую, чистую, статическую типизацию, как и его основной язык, хотя это добавляет сложности к созданию языка. Новые реализации на C # также должны быть совместимы с метаязыком .NET, что еще больше усложняет создание. Кроме того, чтобы предотвратить случайное неправильное использование пользователями метаправил в OMeta #, Мозер решил реализовать их как «явный интерфейс, предоставляемый через свойство (например, вместо« _apply »у меня есть« MetaRules.Apply »)». Более поздние части OMeta # написаны на самом языке, хотя функциональность языка остается в значительной степени привязанной к C #.[9] Исходный код OMeta # размещен на Codeplex и предназначен для использования в качестве проекта с открытым исходным кодом. Однако вскоре после начала проекта обновления были приостановлены на неопределенный срок, а 1 октября 2012 г. сервер возобновил их.[5]
IronMeta
Гордон Тишер создал IronMeta для .NET в 2009 году, и хотя он похож на OMeta #, это гораздо более поддерживаемая и надежная реализация, распространяемая по лицензии BSD на Github.
Ом
Ом является преемником Ometa, который стремится улучшить его, (среди прочего) отделив грамматику от семантических действий.[10]
Смотрите также
- ANTLR (Другой инструмент для распознавания языков), аналогичный метаязык
- МЕТА II Рано компилятор-компилятор, влиятельная в реализации OMeta
- Репозиторий OMeta / JS на github.
использованная литература
- ^ а б c d е ж г час я j Варт, Алессандро и Ян Пиумарта. "OMeta: объектно-ориентированный язык для сопоставления с образцом. »ACM SIGPLAN 2007 Симпозиум по динамическим языкам (DLS '07). 03-е изд. Том TR-2007. Глендейл, Калифорния: Институт исследований точек зрения, 2007. Технический отчет VPRI. Интернет. 30 сентября 2013 г.
- ^ а б Клинт, Пол, Тийс Ван Дер Шторм и Юрген Винью. "О влиянии инструментов DSL на ремонтопригодность языковых реализаций. "LDTA '10 Proceedings of the Tenth Workshop on Language Description, Tools and Applications. New York, NY. N.p., 2010. Web. 30 сентября 2013.
- ^ а б c d е ж г час я Хейрбаут, Николас. «Сравнение двух методов реализации для языков, специфичных для предметной области: OMeta / JS и Javascript». Тезис. Амстердамский университет, 2009. Интернет. 30 сентября 2013 г. <http://dare.uva.nl/document/153293>.
- ^ Маскареньяс, Фабио, Серхио Медейрос и Роберто Иерусалимши. Анализ грамматик выражений для структурированных данных. N.p .: n.p., n.d. Интернет. <http://www.lbd.dcc.ufmg.br/colecoes/sblp/2011/003.pdf>.
- ^ а б c d е ж г час я Мозер, Джефф. "Moserware". : ОМета #: Кто? Какая? Когда? Куда? Зачем?, Blogger, 24 июня 2008 г. Web. 30 сентября 2013 г.
- ^ а б c Варт, Алессандро. «[Ometa] О синтаксисе OMeta». [Ometa] О синтаксисе OMeta. N.p., 4 июля 2008 г. Web. 16 октября 2013 г. <http://vpri.org/pipermail/ometa/2008-July/000051.html>.
- ^ Варт, Алессандро. "ОМета / Писк 2." OMeta / Squeak 2. N.p., n.d. Интернет. 16 октября 2013 г. <http://tinlizzie.org/ometa/ometa2.html>.
- ^ Мозер, Джефф. "Moserware". : Мета-FizzBuzz, Blogger, 25 августа 2008 г. Web. 30 сентября 2013 г.
- ^ Мозер, Джефф. "Moserware". : Создание объектно-ориентированного блоггера-паразитического метаязыка, 31 июля 2008 г. Web. 30 сентября 2013 г.
- ^ "Философия Ома".