Языки графического моделирования являются предпочтительным выбором при проектировании разрабатываемой системы, когда дело доходит до определения структурных аспектов, а именно: основных понятий, свойств и отношений. Наиболее популярным примером данной графической нотации является UML.
Однако UML-диаграммы, как правило, не предоставляют достаточных инструментов для того, чтобы обеспечить и описать все соответствующие аспекты спецификации. Существует, кроме всего прочего, необходимость описывать дополнительные ограничения на объекты модели. Такие неструктурные ограничения часто описываются на естественном языке. Практика показывает, что это всегда приводит к неоднозначностям. Для описания данных недвусмысленных ограничений были разработаны так называемые формальные языки. Недостаток традиционных формальных языков в том, что они могут использоваться людьми с сильной математической подготовкой, но сложны для остальных.
Для разрешения перечисленных выше проблем был создан язык задания ограничений Object Constraint Language (OCL). Это формальный язык для описания не структурных ограничений, а условий, накладываемых на состояние системы [5].
OCL-выражения гарантированно не несут за собой «скрытых эффектов», то есть в процессе вычисления конструкций на данном языке объекты модели не изменяются. OCL используется в первую очередь для проверки конкретного состояния системы на согласованность. Например, с помощью диаграмм классов UML мы не можем указать какие значения может принимать конкретное поле класса и как значение данного поля вычисляется. В случае с OCL достаточно написать набор ограничений и в процессе работы системы проверять их выполнение, если хоть одно из ограничений нарушено - система находится в несогласованном (ошибочном) состоянии. Использование данной информации остаётся на откуп программистам, можно выдать сообщение об ошибке, либо в случае серьёзных нарушений прервать работу системы.
Также OCL-ограничения могут использоваться в качестве дополнительной документации к системе. Более того, в нынешних реалиях программирования часто используется смесь языков, на которых ведётся разработка, поэтому описание ограничений на специализированном для этого языке является очевидным преимуществом. Нет необходимости прятать проверку ограничений глубоко в коде, когда есть возможность хранить их в специально отведённом месте.
На кафедре системного программирования СПбГУ разрабатывается проект WMP (Web modeling project) [9] - онлайн-платформа предметно-ориентированного моделирования, представляющая собой объединение редакторов диаграмм различных языков, она имеет возможность связи с роботом и возможность отправлять ему диаграммы на исполнение, а так же функционал 2D модели [11]. Также в ней идёт разработка поддержки метаредактора и стандарта BPMN.
Хотелось бы иметь возможность задавать ограничения в проекте WMP, например, для диаграмм поведения роботов можно ввести ограничения следующего вида: после блока «Моторы вперёд» не может сразу идти блок «Моторы стоп», на диаграмме обязан быть только один блок «Начало» и т.д. Это были всего лишь одни из немногих примеров возможных ограничений на состояние системы, в действительности их может быть огромное количество.
В рамках данной работы была реализована возможность задания ограничений в проекте WMP. Были выполнены следующие задачи:
• создан парсер таких подножеств языка OCL как The Essential OCL и The Complete OCL;
• создан интерпретатор OCL-выражений, для интерпретации поддержаны выражения из The Essential OCL и выражения объявления контекста ClassifierContextDecl из The Complete OCL, включающие в себя конструкции inv и def, также частично поддержаны операции и итераторы из OCL Standard Library (подробнее см. раздел 4.3);
• реализованные парсер и интерпретатор тщательно протестированы;
• реализованнью парсер и интерпретатор апробированы в проекте WMP.
Исходные коды опубликованы в репозитории проекта на GitHub2.