Для каких проблем вы пишете DSL?
Мне просто интересно узнать о предметно-ориентированных языках. Я видел их несколько раз в статьях, и кажется, что они могут быть использованы вне проблем с гарантированием или определением банковских данных.
Поэтому я прихожу в ТАК, чтобы получить конкретный вклад.
Вы когда-нибудь использовали DSL? Напиши один. Если да, каково это?
Как вы думаете, один из ваших проектов может быть лучше (более продуктивным, более обслуживаемым, ...) с DSL?
Изменить: извините, чтобы поставить это после, но я имел в виду конкретный DSL, который вы написали сами. Это исключает Tex, HTML, Make, SQL. На самом деле вопрос был больше: "написание DSL"
12 ответов
Я был одним из тех, кто работал над NUnit версии 2.0 и выше в течение нескольких лет. Это DSL, написанный с использованием атрибутов C# для описания модульных тестов. Это не самый очевидный пример DSL, но я начал думать о нем как об одном. Я написал несколько других, используя ANTLR и даже MGrammar. Опыт часто одинаков. Как только вы покажете это кому-то еще, они захотят сделать кучу вещей, о которых вы никогда не задумывались. Это хорошо, но вы должны быть готовы продолжать работу и добавлять функциональность.
Сейчас я привык думать и писать DSL довольно часто. Текущий объектный реляционный маппер, который я использую - это dsl. Это не новый язык. Это чистый C#, но, думая о языке Домена, и этот Домен - больше, чем просто Бизнес-домен, мы создали мини-язык для отображения объектов. Мышление с точки зрения DSL изменило наш подход к API и созданию инфраструктуры.
Я бы сказал, что между очень читаемым API-интерфейсом как слабой формой DSL (то, что некоторые называют свободным интерфейсом), внутренним DSL как чем-то промежуточным и полностью определенным грамматическим внешним DSL на другом конце, существует целый континуум.
Самая слабая форма - это то, чего я всегда стараюсь достичь (т.е. сделать API как можно ближе к проблемной области). DSL на другом конце континуума имеет большой смысл, если непрограммисты будут использовать программное обеспечение, например, для ввода данных.
А с такой инфраструктурой, как Xtext, даже полностью внешний DSL, включая редактор, поддерживающий раскраску синтаксиса и проверку ошибок, реализовать гораздо проще, чем может показаться на первый взгляд.
SQL хороший пример Michael Dorfman. Другие, которые я широко использовал:
- UIL - GUI здание
- Make - сборка и установка программы
- regexp - сопоставление с образцом строки
- lex и yacc - создание лексического анализатора и компилятора
Что касается того, как это работает, я думаю, что это зависит от языка и области. UIL отлично подходит для определения GUI. Если вы делаете то же самое во встроенном коде Motif, ошибки спецификации GUI, которые ловит компилятор UIL, выглядят как идеально компилируемый код для компилятора C или Ada. Это приводит к потере времени на отладку. Кроме того, в общем коде, использующем вызовы Motif API, это выглядит просто ужасно.
Make может стать настоящим кошмаром, но существует не так много инструментов, которые могут делать то, что он делает, и я подозреваю, что у них всех одна и та же проблема.
Регулярные выражения не нужны для очень простых задач и кошмар для действительно сложных задач. Для тех, кто посередине, они замечательный инструмент.
Лекс и Як могут быть весьма полезны. Тем не менее, человек, который знает, что делает, может создавать парсеры и лексические анализаторы вручную, выполняя примерно одинаковое количество работы.
Ваш вопрос достаточно вовремя. Я недавно написал DSL, используя инструмент Antlr. Antlr является генератором парсера / лексера.
Это позволяет легко создавать DSL (и многие другие) и в сочетании с StringTemplate (написанным одним и тем же человеком) становится очень мощным средством генерации кода. Он также может ориентироваться на несколько языков. Наш парсер и лексер находятся в C# (одна из целей), хотя по умолчанию используется Java.
Одним из многочисленных преимуществ Antlr являются описательные сообщения об ошибках и IDE/ отладчик (AntlrWorks), который позволяет пошагово просматривать грамматику и визуально видеть деревья AST.
Джон Сондерс предложил ниже использовать встроенный инструментарий Visual Studio DSL. В конечном итоге я обнаружил, что эти инструменты слишком далеки от ограничения. Требовать графический интерфейс без какой-либо возможности легко описать основную текстовую грамматику просто кажется неадекватным для моих нужд.
Наряду с DSL-парсером / лексером я также написал службу Visual Studio Language, которая обеспечивает intellisense, подсветку ошибок, завершение кода и элементы шаблона / проекты.
Даже если вы не реализуете дополнительные функции, DSL может упростить повторяющуюся работу. Мой DSL специально нацелен на инфраструктуру CSLA, легко генерируя бизнес-объекты со всей сантехникой, позволяя разработчикам беспокоиться только о бизнес-логике.
Вот небольшой пример DSL:
datadef Object1Datadef
{
tables
{
MyTable:PK[MyTableID], column1, column2;
}
}
root MyObject
{
datadef Object1Datadef;
read "all";
write "admin", "superusers";
int _Myvariable;
}
Если ваш DSL позволяет описывать ваш домен быстрее, проще и повышает производительность, то это того стоит.
Я думаю, что DSL, который большинство из нас использует чаще всего, это SQL, немного язык для манипулирования данными и извлечения.
Два недавних использования DSL:
- Использование библиотеки конструкций - которая в основном определяет DSL для описания двоичных структур данных (таких как форматы файлов) и протоколов.
- Реализация DSL на основе Python для проверки оборудования. Этот DSL представляет всю инфраструктуру, необходимую для написания тестов, как "функции сценария", которые могут использовать базовые компоненты DSL.
Это может быть старый вопрос, но никто не ответил на вопрос в названии (а не в теле):
Есть два (двойных) экземпляра, в которых имеет смысл написать DSL:
- Когда проблемная область очень хорошо понята и имеет уже существующий словарь существительных (объектов), глаголов (действий, комбинаторов и т. Д.) И прилагательных (атрибутов, модификаторов).
- Когда домен решения очень хорошо понятен и...
Регулярные выражения являются хорошим примером первого, а ассемблер-генератор - вторым. Для остальных есть язык программирования общего назначения: когда ни проблемная область, ни область решения не так хорошо поняты, и поэтому необходимо использовать общие инструменты.
На самом деле, вы используете DSL почти каждый день, не зная об этом... HTML, make, XML, latex и многие другие языки конфигурации...
Мне нравится иметь декларативный DSL, который генерирует кучу вещей... Это хорошо...
Какое влияние оказывает DSL, но оценить его действительно сложно... Если ваш DSL хорошо разработан для целевого сообщества (целевое сообщество - действительно важный момент...) с точки зрения того, что ожидает это сообщество, и хорошо справляется со своей работой, будет хорошо...
Тем не менее, если вы разрабатываете DSL, не зная сообщества, или если им необходимо постоянно бороться с ограничениями языка (DSL все еще может быть завершен до конца...), это повредит...
По моему опыту, любая организация, занимающаяся разработкой программного обеспечения, будет создавать DSL в ответ на повторяющиеся проблемы и слишком много написанного шаблонного кода. Краткая выдержка из моего личного опыта:
- Генераторы перезаписывающей системы компилятора снизу вверх
- Ассемблерные генераторы
- Генераторы объектного кода (реализованы в виде библиотеки C++ с перегрузкой операторов)
- Генератор симулятор процессора
- Генератор модели симулятора устройства
- Языки командной строки для интерактивных инструментов
Также обратите внимание, что многие форматы файлов можно считать DSL, если вы посмотрите внимательно.
Недавно в ACM Queue была хорошая статья Марка Шапиро об этом явлении.
Еще один пример - это способ, которым пользователи в конечном итоге пишут большие программы в вещах, не предназначенных для этого... например, на испытательных стендах с использованием старого языка сценариев отладчика "SNIFF".
DSL, созданные с помощью Visual Studio DSL Toolkit, можно использовать для создания любого текстового артефакта из экземпляра модели домена, определенной DSL. Конечно, находясь внутри Visual Studio в то время, если для текстового артефакта есть компилятор или другой процессор, он может запускаться автоматически.
Некоторые примеры
- NORMA, DSL для концептуального моделирования предметной области на основе нотации объектно-ролевого моделирования (ORM2)
- Фабрика программного обеспечения веб-сервисов, которая использует три DSL для моделирования веб-сервисов
- Конфигуратор разделов конфигурации - используется для определения схемы для файлов конфигурации XML и для генерации классов для предоставления данных из них.
И, конечно же, вы можете создать свой собственный.
Я все еще студент, но я действительно очарован духом
Я немного использовал его в курсе "Языки программирования". Вот как это работает, в основном вы пишете EBNF.
http://img6.imageshack.us/img6/1461/reala.png
становится это в C++;)