Los DSLs son lenguajes de programación especialmente diseñados para desarrollar software restringido a un dominio determinado. A diferencia de los lenguajes llamados de propósito general como Java, C++ o C#, los DSLs cuentan con un universo limitado de aplicación. No obstante, gracias precisamente a esta especialización, presentan facilidades y ventajas a la hora de abordar los problemas de software para los que fueron diseñados y desarrollados.
Java usa muchos DSL basados en xml, por ejemplo struts usa un dsl para definir el workflow de sus paginas, es mucho más fácil y flexible que hacerlo con java. Los archivos .properties tambien son un ejemplo dsl, con un universo muy limitado pero que resulta mucho más facil que hacerlo con XML o java.
Para definir e implementar lenguajes DSL es posible basarnos en un lenguaje de propósito general que sirva como contenedor, o bien partir de cero, requiriendo en este caso de específicos compiladores o intérpretes. Los DSLs del primer tipo citado suelen denominarse DSLs internos dejando la categoría de externos para los del segundo tipo.
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>
Usamos DSL todo el tiempo y ni sabia :|