Омета
Парадигма | объектно-ориентированный |
---|---|
Разработано | Алессандро Варт Ян Пиумарта |
Разработчик | Научно-исследовательский институт точек зрения |
Впервые появился | 2007 г |
Язык реализации | Комбинированная объектная лямбда-архитектура (COLA), Писк |
Платформа | ИА-32 , х86-64 ; Общеязыковая среда выполнения |
ТЫ | Линукс , Винда |
Основные реализации | |
MetaCOLA , OMeta/Squeak , OMeta/JS , OMeta# , IronMeta , Ом |
OMeta — специализированный объектно-ориентированный язык программирования для сопоставления с образцом , разработанный Алессандро Вартом и Яном Пиумартой в 2007 году в Исследовательском институте Viewpoints . Язык основан на анализе грамматик выражений (PEG), а не на контекстно-свободных грамматиках , с намерением предоставить «естественный и удобный способ для программистов реализовать токенизаторы , парсеры , посетители и преобразователи деревьев». [ 1 ]
Основная цель OMeta — позволить более широкой аудитории использовать методы, обычно доступные только языковым программистам, такие как синтаксический анализ. [ 1 ] Он также известен своим использованием для быстрого создания прототипов, хотя программы, написанные на OMeta, обычно менее эффективны, чем программы, написанные на ванильных реализациях (базовом языке), таких как JavaScript . [ 2 ] [ 3 ]
OMeta известна своим использованием при создании предметно-ориентированных языков и особенно удобством сопровождения своих реализаций (Newcome). OMeta, как и другие метаязыки , требует основного языка; изначально он был создан как реализация 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:
ometa BasicCalc <: Parser
{
Digit = super:d -> d.ToDigit(),
Number = Number:n Digit:D -> (n * 10 + d)
| Digit,
AddExpr = AddExpr:x ‘+’ MulExpr:y -> (x + y)
| AddExpr:x ‘-’ MulExpr:y -> (x - y)
| MulExpr,
MulExpr = MulExpr:x ‘*’ primExpr:y -> (x * y)
| MulExpr:x ‘/’ primExpr:y -> (x / y)
| PrimExpr,
PrimExpr = ‘(‘ Expr:x ‘)’ -> x
| Number,
Expr = AddExpr
}
Также возможно создавать подклассы написанных вами языков:
ometa ExponentCalc <: BasicCalc
{
MulExpr = MulExpr:x ‘^’ PrimExpr:e -> Math.pow(x,e)
| super
}
Ранее письменные языки также можно называть, а не унаследовать:
ometa ScientificCalc <: Parser
{
MathFunc :n = Token(n) Spaces,
AdvExp = MathFunc(‘sqrt’) AdvExp:x -> Math.Sqrt(x)
| FacExp
FacExp = PrimExp:x ‘!’
-> {
var r = 1;
for(; x > 1; x--)
{
r *= x;
}
return r;
}
| PrimExp
PrimExp = foreign(ExponentCalc.Expr):x -> x
Expr = AdvExp
}
Версии
[ редактировать ]OMeta теоретически может быть реализована на любом основном языке, но чаще всего она используется как OMeta/JS, реализация JavaScript. [ 5 ] Варт заявил, что шаблоны в «OMeta/X — где X — некоторый основной язык» лучше оставить под влиянием «X», чем стандартизировать в OMeta, поскольку разные основные языки распознают разные типы объектов. [ 6 ]
МетаКОЛА
[ редактировать ]MetaCOLA была первой реализацией OMeta, использованной во вводной статье языка. MetaCOLA реализовала первые тестовые коды OMeta и была одной из трех форм (остальные — OMeta/Squeak и почти законченная OMeta/JS) языка, созданных до его выпуска. [ 1 ]
ОМета/Скрип
[ редактировать ]OMeta/Squeak — это порт OMeta, использовавшийся во время первоначальной демонстрации системы. OMeta/Squeak используется «для экспериментов с альтернативными синтаксисами для системы Squeak EToys». OMeta/Squeak требует квадратных и «заостренных скобок» (фигурных скобок) в операциях правил, в отличие от OMeta/JS, для которого требуются только квадратные скобки. [ 6 ] Однако OMeta/Squeak 2 имеет синтаксис, более похожий на синтаксис OMeta/JS. [ 7 ] В отличие от реализации OMeta COLA, версия Squeak не запоминает промежуточные результаты (номера магазинов, уже использованные в расчетах). [ 1 ]
ОМета/JS
[ редактировать ]OMeta/JS — это OMeta в форме реализации JavaScript. Известно, что реализации языка с использованием OMeta/JS проще в использовании и более экономичны, чем те, которые написаны с использованием только стандартного JavaScript, но было показано, что первые работают гораздо медленнее. По этой причине OMeta/JS считается очень полезным инструментом для прототипирования, но не является предпочтительным для реализаций рабочих языков. [ 3 ]
Против. JavaScript
[ редактировать ]Использование инструментов разработки DSL, таких как OMeta, считается гораздо более удобным в обслуживании, чем «ванильные реализации» (т. е. JavaScript) из-за низкого количества NCLOC (строк кода без комментариев). Частично это связано с «кодом семантического действия, который создает объекты AST или выполняет ограниченные строковые операции». Отсутствие в OMeta «контекстно-свободного синтаксиса» позволяет использовать его как при создании синтаксического анализатора, так и при создании лексера за счет дополнительных строк кода. Дополнительные факторы, указывающие на удобство сопровождения OMeta, включают высокий индекс ремонтопригодности, «в то время как Halstead Effort указывает на то, что стандартный парсер требует в три раза больше усилий на разработку по сравнению с парсером OMeta». Как и JavaScript, OMeta/JS поддерживает «полную синтаксическую запись Waebric». [ 3 ]
Одним из основных преимуществ OMeta, ответственным за разницу в NCLOC, является повторное использование OMeta своего «механизма обхода по дереву», позволяя средству проверки типов наследовать этот механизм от анализатора, что заставляет средство проверки типов адаптироваться к изменениям в анализаторе OMeta, в то время как JavaScript Механизм обхода по дереву содержит больше кода и должен быть вручную адаптирован к изменениям в парсере. Другой причиной является тот факт, что грамматики OMeta имеют «более высокий уровень абстракции... чем программный код». Ее также можно рассматривать как «результат кода семантического действия, который создает объекты AST или выполняет ограниченные операции со строками», хотя несемантика грамматики создает необходимость в относительно большом количестве строк кода для каждой функции из-за явного определения пробелов - механизма реализовано, чтобы позволить OMeta действовать как единый инструмент для создания DSL. [ 3 ]
Что касается производительности, OMeta работает на более низкой скорости по сравнению с ванильными реализациями. Использование OMeta методов обратного отслеживания является потенциальной основной причиной этого (парсер OMeta «включает семь операторов просмотра вперед... Эти операторы необходимы, чтобы отличать определенные правила друг от друга, и их нельзя исключать из грамматики»); однако более вероятно, что это падение производительности связано с методом запоминания OMeta:
«Хранение промежуточных шагов синтаксического анализа приводит к тому, что размер таблицы синтаксического анализа становится пропорциональным количеству терминалов и нетерминалов (операндов), используемых в грамматике. Поскольку грамматика парсера OMeta содержит 446 операндов, считается, что производительность влияет негативно». [ 3 ]
Однако OMeta выигрывает время в реализации ванильной версии в лексике. Ванильный лексер JavaScript значительно замедляется из-за метода, с помощью которого реализация преобразует всю программу в строку через Java до запуска лексера. Несмотря на это, реализация OMeta в целом работает значительно медленнее. [ 3 ]
OMeta также отстает в плане отчетов об ошибках. В то время как ванильные реализации возвращают правильное сообщение об ошибке примерно в «92% тестовых случаев» с точки зрения местоположения ошибки, OMeta просто возвращает «Сопоставление не удалось!» к любой данной ошибке. Для поиска источника через OMeta требуется «вручную... подсчитать символы новой строки в коде семантического действия, чтобы вывести хотя бы номер строки, в которой синтаксический анализ завершается неудачно». [ 3 ]
Омета#
[ редактировать ]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# написаны на OMeta#, хотя функции языка по-прежнему тесно связаны с C#. [ 9 ] Исходный код OMeta# размещен на Codeplex и останется проектом с открытым исходным кодом. Однако вскоре после начала проекта обновления были приостановлены на неопределенный срок, и сервер возобновил их 1 октября 2012 года. [ 5 ]
ЖелезоМета
[ редактировать ]Гордон Тишер создал IronMeta для .NET в 2009 году, и, хотя он похож на OMeta#, это гораздо более поддерживаемая и надежная реализация, распространяемая по лицензии BSD на GitHub.
Ом
[ редактировать ]Ohm является преемником Ometa, цель которого - улучшить его, (помимо прочего) отделив грамматику от семантических действий. [ 10 ]
См. также
[ редактировать ]- ANTLR (Другой инструмент для распознавания языков), аналогичный метаязык.
- META II Ранний компилятор-компилятор , оказавший влияние на реализацию OMeta.
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с д и ж г час я дж Варт, Алессандро и Ян Пиумарта. « OMeta: объектно-ориентированный язык сопоставления с образцом ». Симпозиум ACM SIGPLAN 2007 по динамическим языкам (DLS '07). 03-е изд. Том. ТР-2007. Глендейл, Калифорния: Исследовательский институт точек зрения, 2007. Технический отчет VPRI. Веб. 30 сентября 2013 г.
- ^ Перейти обратно: а б Клинт, Пол, Тийс Ван дер Шторм и Юрген Винью. « О влиянии инструментов DSL на удобство сопровождения языковых реализаций ». LDTA '10 Материалы десятого семинара по описаниям языков, инструментам и приложениям. Нью-Йорк, штат Нью-Йорк. Нп, 2010. Интернет. 30 сентября 2013 г.
- ^ Перейти обратно: а б с д и ж г час я Хейрбо, Николас. «Сравнение двух методов реализации предметно-ориентированных языков: OMeta/JS и Javascript». Диссертация. Амстердамский университет, 2009. Интернет. 30 сентября 2013 г. < http://dare.uva.nl/document/153293 >.
- ^ Маскареньяш, Фабио, Серхио Медейрос и Роберто Иерусалимский . Анализ грамматик выражений для структурированных данных. Np: np, nd Web.< http://www.lbd.dcc.ufmg.br/colecoes/sblp/2011/003.pdf >.
- ^ Перейти обратно: а б с д и ж г час я Мозер, Джефф. "Moserware.": OMeta#: Кто? Что? Когда? Где? Почему? , Блогер, 24 июня 2008 г. Интернет. 30 сентября 2013 г.
- ^ Перейти обратно: а б с Варт, Алессандро. «[Ometa] О синтаксисе OMeta». [Ometa] О синтаксисе OMeta. Нп, 4 июля 2008 г. Интернет. 16 октября 2013 г. < http://vpri.org/pipermail/ometa/2008-July/000051.html >.
- ^ Варт, Алессандро. «ОМета/Скрик 2». OMeta/Squeak 2. Np, nd Web. 16 октября 2013 г. < http://tinlizzie.org/ometa/ometa2.html >.
- ^ Мозер, Джефф. «Moserware»: Meta-FizzBuzz , Blogger, 25 августа 2008 г. Интернет. 30 сентября 2013 г.
- ^ Мозер, Джефф. «Moserware.»: Создание объектно-ориентированного паразитного метаязыкового блоггера, 31 июля 2008 г. Web. 30 сентября 2013 г.
- ^ «Ом Философия» .