Domain Specific Language Java

Los DSL o Domain Specific Languages es uno de esos conceptos con los que me encuentro regularmente y me suele valer la pena reflexionar. Hace ya algún tiempo Raúl me pasaba éste artículo sobre los DSL´s en Java.

Existen dos tipos:

  • Los Internal DSL: están escritos en el propio lenguaje padre. Son basicamente lo que siempre hemos conocido como “API” aunque utilizando “fluent interface” y atendiendo más a la semántica de los métodos. Un ejemplo en Java sería la generación de SQL por parte de Hibernate:

SQLQuery sql = new SQLQuery();
sql.Select("Id").Select("FirstName").Select("LastName").From("Person").Where("Id = 1").Where("FirstName = 'Chris'").OrderBy("LastName").OrderBy("FirstName");
string strSqlString = sql.ToString();

  • Los External DSL: No están escritos en el mismo Java. Se utiliza un lenguaje externo. En el caso de Java han triunfado especialmente los External DSL escritos en XML. Un caso sería el MVC de Struts, que se declara así:

<action-mappings >
<action path="/listar" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="listar" path="lista.aplicaciones"/>
</action>
<action path="/formularioNuevaAplicacion" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="mostrar" path="nueva.aplicacion"/>
</action>
<action path="/nuevaAyuda" attribute="aplicacionForm" name="aplicacionForm" type="org.springframework.web.struts.DelegatingActionProxy" scope="request" input="nueva.aplicacion">
<forward name="nueva" path="/listar.do"/>
</action>
</action-mappings>

El artículo cuenta cómo la experiencia ha demostrado que los DSL que realmente funcionan son los Internal, que están escritos en el propio Java. Es inviable aprender cincuenta minilenguajes externos. Además compilan y se adaptan muy bien a las estructuras existentes.

Los external en XML tuvieron mucho éxito en Java porque se resolvían en tiempo de ejecución y permitían cambiar cosas sin recompilar. En el caso de lenguajes dinámicos como PHP, Ruby, etc… esto no tiene sentido. Además los XML´s habría que cargarlos en cada request, con la recarga de servidor que supondría eso…

Gracias a Raúl por pasarme el artículo y ayudarme con los ejemplos en Java, que no es mi fuerte.

3 Comentarios

  • 1. Arian Fornaris  |  septiembre 23rd, 2008 at 7:09 am

    Bueno, me resulta gracioso. A mi no me gustan muchos los XML, son un DSL externo falso. Los XML, por supuesto, son externos a Java, pero los DSL diseñados en XML son internos respecto a los XML. Es decir, XML es un lenguaje de propósito general me atrevo a decir.
    Yo me inclino por los DSL externos reales, aquellos que tienen una sintaxis realmente apropiada, legible.
    Es poco práctico diseñar un compilador, por ejemplo, sin utilizar una herramienta que procese una gramática -BNF es un DSL- y genere un alto porciento de las clases del compilador, o almenos, la parte más trabajosa.
    Otro ejemplo son las plantillas de HTML, sin ellas generar páginas Web sería mucho más difícil.
    Conclusión, yo abogo por el multi-lenguaje, cada cual con su propósito específico y bien justificado.

  • 2. Inyección de dependencia&hellip  |  mayo 22nd, 2009 at 9:28 am

    [...] uso de XML para la configuración. Precisamente los DSL (Domain Specific Languages) internos (aquellos que utilizan el propio lenguaje para escribirse, en éste caso PHP) han [...]

  • 3. Tendencias en el desarrol&hellip  |  mayo 29th, 2009 at 4:50 pm

    [...] Estandarización del patrón MVC como arquitectura básica de aplicaciones web, incluso en ASP.NET …. y la inyección de dependencias como forma básico de construir API´s (aunque ahora se usa más el nombre de DSL). [...]

Comenta el articulo:

Requerido

Requerido,