Преимущества Jetbrains MPS над Xtext - PullRequest
0 голосов
/ 03 августа 2020

Я хочу спросить о преимуществах mps и xtext друг над другом и об основных функциях при написании языка. Я знаю, что при работе с mps вы напрямую редактируете AST, а xtext использует парсер. Я прочитал о преимуществах использования AST, позволяющих расширять несколько языков для языка, который вы создаете, я действительно не понимаю, что это означает, можно ли это объяснить дальше и зачем кому-то расширять несколько языков?

Также я читал, что AST вырезал неоднозначный код, как он это делает?

Я знаю, что и MPS, и xtext имеют такие функции, как подчеркивание и выделение кода, это их любая другая функция, связанная с кодом проверка?

Приветствуются любые другие основные отличия и общие особенности?

1 Ответ

1 голос
/ 13 августа 2020

У меня нет практического опыта работы с Xtext, поэтому я буду говорить в основном о MPS. собственная схема, используемая для метамоделирования абстрактного синтаксиса (структура понятий), некоторый способ определения конкретного синтаксиса (нотации) и некоторый способ определения генераторов (преобразования M2M или M2T) или, реже, интерпретаторы. Затем они предоставили самой среде IDE выделение, интеллектуальные действия, такие как рефакторинг и исправление контекстных ошибок, расширенный поиск и навигацию (go до объявления и c.), Проверку ошибок (ошибки типов, анализ кода c, проверка определенных ограничений и правил, проверка количества элементов, анализ потока данных), ... Так что да, множество вариантов проверки. Я упомянул вещи, которые есть в MPS, не уверен, что Xtext предоставляет все. Однако все эти функции организованы в так называемые аспекты , которые вы можете проверить в сводной таблице , которая кратко описывает каждый аспект .

Редактор проекций

Как вы упомянули, MPS использует редактор проекций . Вы напрямую манипулируете AST, интеллектуальные IDE пост-IntelliJ на основе парсера могут предоставить вам интеллектуальные действия, такие как восстановление и go для объявления et c. только потому, что они анализируют язык в памяти и в любом случае создают AST за кулисами. Проекционные редакторы пропускают этап синтаксического анализа.

Уклонение от неоднозначности

Он вообще не использует синтаксический анализатор, поэтому все недостатки наличия синтаксического анализатора исчезли. Прежде всего, разработчику языка не нужно быть экспертом в синтаксическом анализе, поэтому вам не нужно нанимать его специально. Но лучшая победа - это иметь бесконечную языковую композицию . Как вы упомянули, это достигается за счет полного исключения двусмысленностей, которые могут возникнуть в грамматиках (MPS использует не грамматику, а модель). Допустим, вы используете язык A и язык B. Для демонстрации предположим, что оба языка расширяют BaseLanguage (сокр. BL, MPS-эквивалент Java), и оба они определили оператор для регистрации. Concept a ведет журнал в stderr, а b ведет журнал в файл. Однако и a, и b имеют идентичный конкретный синтаксис (то есть определение редактора в MPS), который просто говорит log. Теперь, если у вас есть синтаксический анализатор и он встречает токен log, он не может решить, на каком языке используется концепция, поэтому это неоднозначно - даже упреждающий синтаксический анализатор не может этого сделать. В проекционном редакторе этого не может произойти, потому что идентична только проекция, а под капотом AST есть экземпляр a или b (вы можете думать об этом как всегда, используя весь FQN класса в Java, только пакет скрыт в среде IDE, поэтому вы можете использовать классы с одинаковыми именами из разных пакетов). «Двусмысленность» устраняется во время написания пользователем: когда он пишет log, появляется раскрывающееся меню, ясно показывающее, что одно из них - a, а другое - b (возможно, даже показывает описание, которое скажите «Записать в файл» / «Записать в stderr»).

Модульность

Следовательно, MPS имеет очень хорошую модульность, компоновку и расширяемость языков . Вы упомянули, что

позволяет расширять несколько языков для языка, который вы делаете [...] зачем кому-то расширять несколько языков

Вам нужно различать с использованием языка и его расширения (если вас интересует больше, Völter говорит о 4-х видах техники композиции в отношении языков: ссылки, расширение, повторное использование и встраивание ). Использование языка - это просто возможность писать на нем программы. Если вы расширяете язык, это похоже на наследование, вы добавляете в него новые концепции, например, создаете новый тип оператора Java (BL). И это было сделано на стандартных языках, поставляемых с MPS. У вас есть, например, язык checkedDots, который расширяет BL с помощью операции .?, которая является нулевой безопасностью (аналогично нулевой условной операции ?. в C#). Итак, зачем расширять язык? Поскольку вы можете использовать новые конструкции, добавлять новые функции или синтаксис c сахар. Еще один готовый к использованию язык в BL - это язык кортежей, в котором есть как индексированные, так и именованные кортежи. Затем есть язык коллекций, который как бы заменяет Java Stream API. Все эти маленькие языки являются расширениями, которые вы можете начать использовать с помощью простого Ctrl + L. Вы также можете встроить другой язык в свой язык - используйте регулярное выражение внутри оператора SQL внутри вашего Java кода.

Generation

Другой вид языковой зависимости в MPS - это наличие "целевой" язык поколения. Генераторы в MPS работают таким образом, что вы преобразуете свое языковое предложение (т.е. модель) в другой язык MPS. Вы можете изобрести свой собственный маленький язык или реализовать LOLcode и настроить генератор, чтобы преобразовать его в действительный код Java. Однако этот язык уже должен существовать в MPS, поэтому вы не можете сгенерировать его в Python, если в MPS нет реализации Python. Другой альтернативой является создание текста (M2T), таким образом вы теоретически можете сгенерировать Python исходный код или просто распечатать LOLcode как есть.

Множественные обозначения

Второе большое отличие в проекционных редакторах и редакторах на основе синтаксического анализатора заключается в том, что последний по своей сути поддерживает только текстовую нотацию. Может быть, вы можете использовать какие-то внешние инструменты. С другой стороны, MPS предоставляет текстовые, табличные, символьные c (математические символы) и графические (диаграммы) обозначения . Есть возможность поменять вид с одной нотации на другую, для каждой концепции или для всего «файла» (программы).

Недостатки

Но это еще не все. У проекционных редакторов есть некоторые ограничения или проблемы, которые необходимо решить. Существует анализ проблем в проекционных редакторах , который в основном указывает на удобство использования и интеграцию инфраструктуры . Они в основном решаются в MPS, например, что касается инфраструктуры, у вас есть хороший инструмент VCS diff / merge. Для автоматических сборок / cmd существует язык, генерирующий Ant. Gradle или Maven не работают с MPS напрямую, а через Ant. Что касается удобства использования, «MPS нужно время, чтобы привыкнуть, но тогда его удобство использования сопоставимо с ParEs». 3 Вы должны использовать язык под названием GrammarCells (доступен через MPS-extension или mbeddr.platform ), что упрощает создание хороших редакторов (в основном для arithemti c выражений), в противном случае по умолчанию вы должны вводить концепции в порядке префикса (+ сначала, а не номер). Комментарии в MPS не могут быть размещены добровольно. Невозможно установить sh ссылки на несуществующие узлы ... (см. Таблицу 1. в 3 )

MPS в настоящее время не имеет веб-версия . Хотя есть некоторые запланированные. Jetbrains работает на WebMPS, есть modelix .

Переносимость

Как правило, вы вынуждены работать в MPS. По умолчанию он не является переносимым, если вы явно не определите генераторы, которые производят переносимый вывод. Если вы хотите ввести программу , вы можете закодировать обработчик вставки, куда вы можете поместить свой синтаксический анализатор, или вы можете изменить формат, в котором хранится AST (с XML, возможно, непосредственно на ваш язык , но для этого снова потребуется синтаксический анализатор). В настоящее время я работаю над решением , которое позволяет импортировать язык MPS из модели YAJCo (генератор синтаксического анализатора на основе модели, где входными данными является не грамматика, а классы Java представляющий модель semanti c). Затем вы можете импортировать предложение (файл), которое создает и заполняет модель (AST). Из программы в MPS вы можете сгенерировать исходный код Java, который заполняет исходные классы Java, если вам это нужно.

Кстати, в проекте mbeddr реализован импорт из ECore проверьте здесь

Словарь

  • M2M = модель в модель
  • M2T = модель на текст
...