Здравствуйте, не могу найти ссылку на скачивание курса «Визуальное моделирование: теория и практика»
Номер платежа 6400454020565 |
Пример предметно-ориентированного визуального языка
Описание семантики
Основной семантикой SCL является исполняемая семантика, в частности, механизм приема/посылки сигналов. Этот механизм содержит глобальные часы и глобальную очередь сигналов. Через равные промежутки времени, отсчитываемые по глобальным часам, происходит передача следующего сигнала из очереди на обработку компоненте, готовой к этому. Некоторая компонента готова к обработке данного сигнала, если она находится в состоянии, в котором такая обработка предусмотрена ее конечным автоматом. Если таких компонент несколько, то выбирается единственная произвольным способом - алгоритм выбора не специфицируется семантикой SCL. Перед отправлением сигнала на обработку список текущих состояний, в которых пребывают компоненты, обновляется. Компонента может находиться не только в состоянии, но и в переходе. Тогда она не готова к приему сигналов. Переход может обрабатываться произвольное количество времени по абсолютным часам, имеющимся в системе. Все компоненты "живут" параллельно. Детали этого параллелизма семантикой не определяются и оставлены на усмотрение реализации, например:
- псевдопараллельная модель (все компоненты отрабатывают по одному переходу в порядке некоторой очереди);
- каждой компоненте соответствует отдельная нить, но все происходит в рамках одно процесса;
- каждой компоненте выделено по отдельному процессу операционной системы (хотя это очень расточительно).
Предполагается, что код методов компонент описывается на языке C# и не входит в SCL. Предполагается также, что типы атрибутов описываются в соответствии с тем, как это принято в языке C#. Это же язык является целевым для генерации кода по модели, выполненной с использованием SCL.
Прагматика
Назначение языка SCL - учебное. Предполагается, что его пользователи - это слушатели данного курса лекций, а также студенты-исследователи, изучающие визуальное моделирование. В следующей лекции будет показано, как этот язык будет реализован в рамках Microsoft DSL Tools.
Практические рекомендации по созданию абстрактного синтаксиса языка
При разработке и реализации предметно-ориентированных языков главным рабочим артефактом, как правило, является метамодель. Напомню, что метамодель определяет абстрактный синтаксис визуального языка - его конструкции и связи между ними. Конечно, важна также и нотация (конкретный синтаксис) языка, и многое другое. Однако с метамодели начинают разрабатывать DSL, и все остальные модели, настройки и пр. артефакты "вешаются" на нее. Всегда удобно, когда есть компактное, наглядное и точное изображение сути - остальные детали можно вообразить, домыслить, вспомнить. А такую спецификацию легко поддерживать (потому что она маленькая!), к ней привыкают и легко различают нововведения. Это особенно удобно, когда команда разработчиков распределена географически, когда разработка, реализация и сопровождение языка происходят с перерывами, во время которых часть команды может смениться, а оставшаяся часть - основательно забыть детали. В этой ситуации метамодель является тем важным носителем знаний, который способен связывать разработку и реализацию предметно-ориентированного языка в единый процесс.
Итак, спецификация метамодели должна выполняться особенно тщательно. В связи с этим ниже сформулированы некоторые практические правила по разработке метамоделей.
Правило 1. Помните, что метамодель должна получиться не только точной, но и понятной для людей. Она служит материалом для передачи знаний между различными участниками проекта, а также специалистами предметной области. Она является "долгоживущей", то есть существует почти столько же, сколько и сам язык, к ней часто обращаются, ее исправляют и дополняют. Для улучшения читаемости:
- используйте разбиение сложных метамоделей на разные диаграммы по семантическим критериям;
- снабжайте метамодель кратким хорошим текстовым документом (в частности, для описания ограничений);
- используйте хорошие идентификаторы для имен, тратьте время на красивую "ручную" раскладку диаграмм (положение надписей, "этажность" диаграмм, различные дополнительные, вами изобретенные критерии для повышения читаемости);
- давайте имена концам ассоциаций там, где это повышает читаемость, а там, где не повышает, оставляйте их безымянными;
- избегайте отображения ненужной информации на диаграмме: видимости атрибутов и методов классов, если это вам не нужно, типов атрибутов, если они не несут очень важной информации, множественности типа единица (диаграмма сразу "очищается", так как очень много концов ассоциаций имеют такую множественность и ее можно считать задаваемой по умолчанию) и т. д.
Правило 2. Все классы метамодели должны иметь либо предка по иерархии наследования, либо "отца" в иерархии агрегирования. Это, как можно было увидеть выше, помогает создавать компактные спецификации служебного синтаксиса в виде XML, а также упрощает процедуры программного обхода моделей.
Правило 3. Необходимо избегать повторяющихся фрагментов в метамодели, выделяя абстрактные классы и определяя для них атрибуты и ассоциации. Это позволяет сделать метамодель более концептуальной, легкой в сопровождении.
Правило 4. Не все абстракции предметной области нужно "укладывать" в метамодель. Например, очень разные классы могут иметь некоторые одинаковые свойства, выражаемые через связи с другими классами. Попытка использовать здесь наследование или что-то еще сильно усложнит спецификацию, сделает ее запутанной и трудно воспринимаемой. В таких случаях целесообразно пользоваться языком OCL.
Правило 5. Если у вас появилась ассоциация с множественностями на концах, равными по единице, то вы, скорее всего, что-то неправильно сделали. Два класса, соединенные такой ассоциацией, фактически составляют один класс. Ведь время жизни их экземпляров в точности совпадает, так что для них обоих можно определить один единственный класс. Правда, бывают исключения, но они в данном случае лишь подтверждают это правило.
Правило 6. Будьте аккуратны с заданием множественности. Точно определяйте, например, что имеется в виду под множественностью "*" - 1..* или 0..*.
Правило 7. Метамодель должна быть небольшой. Во-первых, потому, что предметно-ориентированные языки не бывают большими (большие языки разрабатывать дорого и долго, еще дольше и дороже их реализовывать: компаниям-разработчикам ПО - главным пользователям DSM-подхода - это не под силу). Во-вторых, большие метамодели теряют компактность и, вследствие этого, наглядность и понятность. Взгляните на метамодель языка UML и вы поймете, о чем я говорю. А если, кроме того, вы попытаетесь в ней разобраться, то, думаю, окончательно со мной согласитесь.
Контрольные вопросы
- Что дает формальное определение синтаксиса языка?
- Дайте определение терминалу и нетерминалу. Приведите примеры.
- Что означает, что нетерминалы являются составными конструкциями в грамматике?
- Расширьте грамматику SCL, задав структуру идентификатора и ссылки.
- Чем отличаются операторы '+' и '*'? Приведите свои примеры.
- Удобно ли средствами метамодели задавать: (i) строение идентификаторов языка; (ii) ограничения на значения атрибутов у классов метамодели; (iii) связи между разными элементами языка? Приведите примеры.
- Определите с помощью грамматики в форме Бэкуса-Науэра все допустимые символы в идентификаторах языка С++.
- Что такое ссылочная целостность? Расскажите о статическом и динамическом способе реализации целостности.
- Во что в метамодели переходят операторы грамматики '[]', '+', '*', '|'?
- Попробуйте выразить ограничения на метамодель SCL, заданные в лекции с помощью с помощью OCL, средствами метамодели.
- Какова структура OCL-утверждения? Приведите свои собственные примеры.
- Объясните назначение основных операторов графической грамматики.
- Почему в графической грамматике конструкция <next_state_area> является самостоятельной, а в грамматике абстрактного синтаксиса ее двойник, конструкция <target_state>, является всего лишь ссылкой?
- Соедините грамматику абстрактного синтаксиса SCL и фрагменты графической грамматики, представленные в этой лекции, в единую формальную спецификацию.
- Попробуйте с помощью графической грамматики, представленной в этой лекции, определить основные сущности диаграмм последовательностей и временных диаграмм UML, а также класс с секциями для имени, атрибутов и операций.
- Как в XML-схеме задать наследование и ассоциацию?
- Приведите пример фрагмента метамодели какого-нибудь языка, где используется наследование с полиморфизмом. Попробуйте задать этот фрагмент в грамматиках в форме Бэкуса-Наура и в XML Schema.
- Дайте определение XML-схеме и XML-докуменнту.
- Чем похожи и чем отличаются теги-типы и теги-значения?
- Расскажите о разных тегам-типах.
- Как в XML-схеме реализовано наследование?
- Как в XML-схеме реализовано агрегирование?
- Опишите семантику языка SCL. Расскажите, что в нее не вошло, то есть осталось на усмотрение реализации языка.
- Перечислите возможные варианты реализации параллелизма для SCL. Охарактеризуйте их достоинства и недостатки.
- Опишите прагматику SCL.