2010-07-22 22 views
5

Chicos ... Chicas, estoy trabajando en un proyecto que creo que podría mejorarse implementando un Lenguaje Específico de Dominio para definir un conjunto de reglas y/o condiciones para algún tipo de flujo de trabajo.Primeros pasos con DSL en Java?

Quiero obtener una comprensión sólida del tema, los fundamentos, las mejores prácticas, etc. especialmente cómo implementarlos de alguna manera con Java.

¿Qué es lo que sugiere?

+2

Sugerencia seria: Implementar utilizando Groovy, Scala o Clojure. – Mike

+0

Eso depende totalmente de cuán complicado le gustaría que fuera el DSL. – NawaMan

+0

+1 por no usar Java para esto. En todo caso, usaría Ruby (o JRuby). – cletus

Respuesta

8

En primer lugar se lo recomendaría leer el capítulo 9 (notación) de The Practice of Programming de Kernighan y Pike.

Cuando haya hecho eso, vuelva aquí con preguntas específicas sobre cómo asignar los conceptos de ese capítulo a diseños específicos para los problemas que desea resolver.

El patrón básico es escribir un intérprete al que se le pasa un argumento 'comando', y posiblemente un argumento 'entorno' y ejecuta el comando (en el entorno). A continuación, tiene la opción de escribir un analizador sintáctico, que toma una cadena de 'secuencia de comandos' y la convierte en un objeto 'comando' válido (es decir, un DSL externo); o proporciona una biblioteca para ayudar a los usuarios a crear el objeto 'comando' explícitamente en el mismo idioma que está usando (DSL interno).

Kernighan y Pike hacen un buen trabajo demostrando cuán trivial y cuán complejo puede ser un intérprete. Si desea más profundidad, le sugiero que lea The Essentials of Programming Languages por Daniel Friedman et al. Que construye al menos un intérprete diferente por capítulo y demuestra cómo implementar características tales como variables, funciones, ámbitos, objetos, clases, tipado estático y continuaciones.

Sin embargo, le sugiero que intente primero con una DSL trivial, de lo contrario, todo es solo teoría; un libro es mucho más interesante cuando lo hace relevante y práctico según su experiencia previa.

+0

En caso de que no fuera claro, mi sugerencia es: 1. Lea el capítulo 9 de The Practice of Programming. 2. Pruebe implementar DSL simple 3. Haga preguntas específicas cuando se encuentre con el problema 4. Lea Lo esencial de los lenguajes de programación cuando comience a querer incluir características en su DSL que sean más 'programación similar', es decir, . variables, funciones, ámbitos, etc ... – Recurse

+0

Es curioso, tengo la página 216 de ese libro abierta ahora, y pensé que haría una búsqueda en Google de 'notación' y los nombres del autor y esto surgió. Estoy muy emocionado de leer este capítulo (¡y solo obtuve el libro por $ 8, jeje!) – Rob

+0

Wow, he estado jugando con el regex y (para mí) hay un pequeño error en la página. 225 y no veo en su errata. En caso de que esté haciendo esto: la llamada a grep debería ser if (grep (argv [1], f, argc> 2? Argv [i]: NULL)> 0)/* NOT argc> 3 */ – Rob

3

Como han comentado otros, Java realmente no es una gran opción para crear una DSL. Scala, Clojure, Groovy, Ruby/JRuby serían excelentes opciones. Sin embargo, considerando que estabas pensando en usar Java, creo que Groovy o Scala parecen ser las opciones más naturales. La curva de aprendizaje para desarrolladores de Java es bastante gradual para ambos idiomas. Aquí hay algunos enlaces que pueden ayudarle a empezar:

+0

Definitivamente echaré un vistazo a Scala y Groovy :) –

0

Una vez que usé openArchitectureware para definir y utilizar una DSL. oAW es un complemento para eclipsar y ahora forma parte del marco de modelado de eclipses, pero, por supuesto, también se puede usar fuera de los campos electromagnéticos.

Me gustó porque era bastante fácil definir un DSL y oAW generará automáticamente un editor con resaltado de sintaxis y comprobación de errores para el DSL.

Y proporciona un motor de plantillas que es bastante cómodo si planea usar documentos escritos en su DSL para autogenerar Java, XML u otros archivos.

(I ha enlazado la URL ÖAW de edad debido a que la página sigue proporciona algunos detalles y todos los enlaces a las páginas del proyecto Eclipse)

0

Sólo una adición a @Recurse.En realidad estoy haciendo el ejemplo de expresiones regulares en el capítulo 9 se refería y no funcionó hasta que cambié una línea en la función principal:

  if (grep(argv[1], f, argc>3 ? argv[i] : NULL) > 0) 

realmente debería ser:

  if (grep(argv[1], f, argc>2 ? argv[i] : NULL) > 0) 

aviso el argc> 2. Me funcionó después de eso. No estaba en la errata de libros (lo cual no es sorprendente dada su edad).

Sí, este es un tesoro denso pero tesoro de un libro, así que tengo que decir que estoy de acuerdo con @Recurse. Honestamente, es un libro sensible al tiempo para el estudiante (probablemente me habría confundido hace un par de años).

Cuestiones relacionadas