2011-01-24 2 views
8

У нас есть требование создать сложные строки с фиксированной длиной и переменной длиной. Эти строки могут представлять собой профиль клиента, заказ и т. Д. Какой язык программирования на основе JVM вы предлагаете?Какой язык (который работает на JVM) лучше всего подходит для создания DSL?

Идея заключается в том, чтобы конечный пользователь создавал строки, используя этот DSL. Поэтому я ищу подтверждение, завершение кода и т. Д.

+0

Как быстро это должно быть? Как скоро вам нужно это сделать? – EnabrenTane

+0

@EnabrenTane - Не может быть супер быстро –

+0

как насчет очень быстрого? будет очень быстро делать? или только супер быстро? j/k: p – hhafez

ответ

5

С Xtext (http://www.eclipse.org/Xtext/) вы получаете бесплатный редактор бесплатно при указании своего DSL.

+0

Мы много ue oAW для наших метамоделей и генерации кода. Из того, что я испытал, редакторы слабы. Они не готовы к работе с клиентами. –

+1

@ Pangea: возможно, потому, что oAW уже два года не поддерживается. Xtext - это переписывание, оно достигло 1.0 в последнем выпуске Eclipse (Galileo). Инструмент идеально подходит для использования - он предлагает проверки и автоматическое заполнение, наброски, гиперссылки, быстрые исправления, подсветку и многое другое. Большинство из этих вещей никогда не будет возможно сделать как внутренняя DSL, используя любой из предложенных языков. –

+0

@Gabriel thx для этого обновления. Я сейчас рассмотрю это. Оцените, можете ли вы указать мне статьи и примеры DSL, созданных с использованием нового Xtext. –

-2

Звучит как проблема для движка шаблонов скорости Apache. Это Java-библиотека с синтаксисом шаблонов или DSL, если хотите.

+2

Мне нужен DSL. Шаблонный двигатель не является вариантом. Идея заключается в том, чтобы пользователь мог создавать строки, используя этот DSL. Я уже посмотрел на Velocity, StringTemplate и т. Д. –

+0

Так что же цифра DSL? Velocity имеет язык, который особенно хорош для генерации текстового контента. Это язык, специфичный для домена. Если у вас есть особые требования, которые не выполняются механизмами шаблонов и их языками, вы можете лучше описать, что это за требования. –

7

Use a Lisp, который работает на JVM. Некоторые варианты у вас есть:

  1. Clojure
  2. JScheme
  3. SISC
  4. ABCL
  5. Bigloo (не работает на JVM, но имеет хорошую совместимость Java).

Существует a good free book, что объясняет, как использовать Lisp для проектирования программного обеспечения снизу вверх, то есть как расти Лисп в язык, который идеально подходит для решения проблемы под рукой.

Языки семейства Forth также отлично подходят для определения DSL. Есть несколько, что работает на JVM:

  1. Niue
  2. Misty Beach Forth
+0

Вот список DSL, созданных с помощью Clojure: http://stackoverflow.com/a/3968289/410652 –

4

Scala весь путь! Scala особенно подходит для внутренних DSL (см. this).

6

Существует два типа DSL; внешний и встроенный.

Внешняя DSL полностью отделена от вашего основного языка, то есть вы пишете ее вне языка, но обычно используется для генерации кода на языке хоста. Для этого подхода XText с XPand, вероятно, является лучшим инструментом, поскольку простой файл грамматики генерирует полный редактор Eclipse для нового DSL, и вы можете использовать шаблоны кода в XPand для генерации фактического кода Java. XTend и XPand написаны на Java, но это случайно, поскольку они могут быть написаны во всем, пока вы заканчиваете Java-код в конце процесса.Недостатком такого подхода является то, что для любой достаточно сложной проблемы язык станет довольно сложным, и потребуется много работы в грамматике и даже больше в шаблонах генерации кода. Вы не можете использовать любые функции языка хоста, такие как оценка выражения, поэтому все это требует восстановления в DSL, если вам это нужно. XText скоро включит XBase, который является частичным языком, который будет включать выражения, которые помогут здесь.

Другой подход - это встроенная DSL, где высокоуровневые функции домена выражаются на языке хоста либо с помощью конструкций более высокого порядка (например, HOF и monads), обычно встречающихся на функциональных языках, либо через объекты метапрограммирования, такие как макросы (например, Lisp). Java ни один из них не является плохим выбором для работы DSL (или большинства других форм абстрактного программирования). Spring Roo предлагает средство метапрограммного типа для Java с использованием поколения, поэтому может быть вариант. В противном случае Scala, вероятно, является наиболее популярным на Java, как JVM-язык, и обладает теми возможностями, которые вам нужны.

Встраиваемые DSL обычно намного проще, чем внешние DSL, потому что у вас есть полная поддержка основного языка, поэтому моя рекомендация - попробовать Scala.

+0

спасибо за подробные «за» и «против», а не только за то, что вы делаете это на моем фанки любимом языке jvm * –

Смежные вопросы