LINUX.ORG.RU

на чём реализовать DSL?


1

5

Имеется DSL, простой императивный язык с LL(1) грамматикой. Задача: реализовать его на практике.

Я читал что-то про lex+yacc, CL/Scheme/Clojure, MPS, ANTLDR, LLVM, xText и Meta Platform им. Луговского. Но никакого опыта с созданием DSL не имел.

Кроме собственно компилятора/интерпретатора, хочется получить:

  1. Что-то похожее на отладчик. Не грамматики, а собственно языка. Пройти программу по шагам, посмотреть переменные, всё такое.
  2. Динамичность для пользователя. Чтобы он мог, например, добавить в язык новое ключевое слово, или переопределить существующее, и одной кнопкой перегенерировать все инструменты.

Технологических ограничений нет, кроме того, что нужна кроссплатформенность (Windows+Linux).

Какое средство наиболее подходит? Будет интересно узнать, кто чем пользовался при создании DSL. Спасибо.


Ответ на: комментарий от anonymous

Посмотрел Bigloo. Интересная реализация с упором на перфоманс, и средства для изменения грамматики есть. Но нигде не сказано, что отладчик Bigloo (и тем более его Emacs-обёртка) будет нормально работать с другими грамматиками. Скорее всего, не будет, т.к. никто в Bigloo этим вопросом не занимался. Кроме того, в Bigloo есть объективные риски, связанные с поддержкой: команда разработчиков из одного человека, отладчик, не адаптированный к свежему Emacs (и с устаревшей документацией), глюки инсталляции, отсутствие пакетов для современных линуксов, порт для Win32 вообще в отдельном проекте. Похожие проблемы у Helvetia.

Другое дело Racket, который поддерживается в прекрасном состоянии. Отладчик в DrRacket работает с грамматикой Algol60 (сам проверял). Кроме того, DrRacket написан на Racket же, что позволит относительно безболезненно запихнуть отладчик в поставляемый продукт с DSL. Автор Helvetia, кстати, именно по этому критерию в 2009 году выбрал Smalltalk в качестве хост-языка (и из-за поддержки on-the-fly programming). DrRacket в то время был наполовину на C++, его переписали на чистом Racket только в феврале 2011.

ringill
() автор топика
Ответ на: комментарий от antares0

> Если знаешь CL то берешь и делаешь. Никаких особенных трудностей здесь нет. Это вполне реальная для CL задачка.

Не нашёл ни одного свидетельства, чтобы этим кто-то в мире занимался на CL. Есть loop, есть всякие мелкие макросы вида #$(blah blah), и всё. Ни одного случая, чтобы кто-то настроил reader на приципиально другую (и нетривиальную) граматику и привязал бы к этому yacc-подобное средство. И чтобы у него отладчик работал потом.

С другой стороны, авторы Racket и Helvetia заморочились на эту тему конкретно, и представили результаты.

ringill
() автор топика

> Ни одного случая, чтобы кто-то настроил reader на приципиально другую (и нетривиальную) граматику

Ссылка на левый (применительно к CL) ресурс, где половина участников опыта CL не имеют, но мнение высказывают. Это, по крайней мере для меня, не серьезно.

reader, как он реализован по стандарту, заточен на встраивание левых синтаксисов (и нетривиальных тоже) в стандартный синтаксис, а не на полную перенастройку. С другой стороны никто мешает перекрыть read c применением esrap или yacc. Я собственно и не предлагал ничего перенастраивать, это чисто технический момент. Полный доступ к read-time есть и этого достаточно.

И чтобы у него отладчик работал потом.

А отладчик работает только с окружениями и формами, и кругло-квадратность скобок в частности, и граматики CL и других языков вобще на его работу не влияют. Только объект condition который вывалится при ошибке будет собирать информацию о номерах строк, операторах и прочих прдметных вещах, а поскольку он будет собираться в контексте той формы которая реализует поведние того элемента предметной области (далее ПО), который был прочитан из тектового представления с помощью граматики ПО, то и собрать информацию несложно. Если конечно реализатор DSL догадался ее там оставить.

antares0 ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.