Люди из одной сферы деятельности общаются на профессиональном жаргоне, который помогает эффективно передавать информацию уникальную для этой предметной области. MPS приносит такую же гибкость в мир языков программирования. Традиционные языки программирования обладают строгим синтаксисом и семантикой, а MPS позволяет создавать с нуля, изменять и расширять языки по желанию самих пользователей.
Основная проблема расширения языков заключается в синтаксических анализаторах, которые анализирут строки для построения структур данных. Синтаксические анализаторы ограничивают код визуальным представлением, поэтому их нелегко объединить с другими парсерами, что препятствует модульной организации языков.
Наиболее популярной альтернативой для решения этой проблемы является нетекстовое представление программного кода. Основное преимущество такого подхода — отсутствие необходимости синтаксического анализа. Однако MPS предлагает другое решение. Оно состоит в том, чтобы всегда поддерживать код в абстрактном синтаксическом дереве (АСД), которое состоит из узлов с определенными атрибутами (свойствами, дочерними элементами, ссылками на другие концепты) и полностью описывает программный код.
Задача редактора MPS — визуализировать АСД в удобной форме и предоставить эффективные средства для его редактирования. Например, если вы создаете язык, имитирующий классические текстовые языки, редактор MPS должен дать вам возможность почувствовать себя пользователем текстового редактора; если создаете графический язык — полностью погрузить вас в мир редактирования диаграмм и т. д.
При создании языка в MPS правила редактирования и визуального представления кода определяются его автором. Вы также можете описать систему типов языка и ограничения в виде набора правил, применимых к вашему языку. Это позволяет MPS проверять код на лету и предотвращать возникновение различных ошибок при программировании на новом языке.
В MPS используется генерационный подход. Вы можете создавать генераторы для преобразования данных, вводимых пользователем, в код, написанный на более привычном языке общего назначения. На данный момент MPS особенно хорошо генерирует Java-код. Можно также генерировать код на C, C#, XML, FHTML, PDF, LaTeX, JavaScript и других языках.
«Языки программирования, выводящие уровень абстракции за рамки программирования, задавая решение, в котором непосредственно используются концепции и правила из конкретной предметной области».
Келли и Толванен (2008)
С помощью MPS вы можете самостоятельно создавать редакторы для DSL, чтобы упростить использование нового языка. Даже специалисты, которые не знакомы с традиционным программированием, могут легко работать в MPS, используя языки, созданные на основе специализированной терминологии конкретной предметной области.
Проекционный редактор позволяет эффективно редактировать код, представленный в виде абстрактного синтаксическго дерева (АСД). Он может имитировать поведение текстового редактора для текстовых нотаций, редактора диаграмм для графических языков, табличного редактора для редактирования таблиц и так далее. Пользователь взаимодействует с кодом через понятные визуальные представления и может переключаться между несколькими представлениями одного и того же кода.
Компания JetBrains известна своими производительным IDE и инструментами для разработки, и MPS не исключение.
MPS — это мощная среда разработки, в которой есть все, что нужно для полноценного использования предметно-ориентированных языков программирования. Возможности IDE включают автодополнение, навигацию, рефакторинги, проверку кода на ошибки, автоматические исправления, отладку, управление версиями языка с поддержкой автоматических миграций и интергацию с популярыми системами контроля версий.
Генератор MPS соединяет предметную область с конкретной реализацией.
Генератор пошагово преобразует исходную модель предметной области в модель, представленную на низкоуровневом языке общего назначения, таком как Java, C, JavaScript или XML. Полученную модель можно преобразовать в текстовые файлы исходного кода, из которых традиционные компиляторы могут создавать исполняемые двоичные файлы.
В то время как DSL формализует экспертные знания в предметной области, генератор транслирует эти знания с помощью средств выбранной технологии. Генератор позволяет другим людям переиспользовать накопленные знания и опыт профессиональных разработчиков.
Четкое разграничение знаний предметной области, содержащихся в языке, и знаний о реализации, хранящихся в генераторе, позволяет пользователям выбирать несколько целевых платформ, используя разные генераторы для одного и того же языка. Это также экономит усилия при смене целевой технологии: нужно изменить только генератор. Специальные знания, содержащиеся в существующих предметно-ориентированных моделях, могут оставаться неизменными.
MPS включает в себя готовый к использованию универсальный язык BaseLanguage, который является полнофункциональной реализацией Java. Со временем мы добавили другие языки: XML, C и JavaScript. Их можно использовать для создания программ. Однако настоящее преимущество MPS — это возможность расширять BaseLanguage и другие универсальные языки, а также создавать новые языки на основе существующих. MPS предоставляет специальные расширения BaseLanguage для работы со строками, коллекциями, датами, регулярными выражениями и т. д. Их также можно использовать в качестве основы для разработки новых языков. Таким образом, MPS обеспечивает необходимый инструментарий для создания предметно-ориентированных языков.