project management - specific - ¿Cuándo debo usar un lenguaje específico de dominio?
que es dsl programacion (6)
Me gustaría recibir orientación práctica sobre cuándo debo usar un lenguaje específico de dominio . He encontrado recursos sobre ventajas y desventajas, pero ¿qué tipo de proyecto justificaría su uso?
Parece que hay una gran inversión en tiempo para crear y mantener un DSL, por lo tanto, ¿en qué espacio de la aplicación obtendré un retorno de productividad en mi inversión de tiempo?
Edición: parece que el uso más común de DSL es para formatos de archivo para el estado de datos persistentes, ¿qué hay de usar un DSL para la lógica y estructura del programa (quizás generación de código)? ¿Cuándo es esto factible?
Edición n. ° 2 Me pregunto principalmente cuándo vale la pena crear un DSL específico. Por supuesto, deberíamos usar los DSL existentes tanto como sea posible para ahorrar tiempo.
Bueno, alguien tiene que decirlo, así que aquí va:
Lisp es considerado por algunos como el lenguaje específico del dominio para cualquier dominio. Un DSL bien soportado y muy extensible en eso.
En algunos casos, la configuración de un DSL de Lisp (o un lenguaje similar como Haskell) podría proporcionar mucho poder con un mínimo esfuerzo y, por lo tanto, sería muy valioso. Los DSL no siempre tienen que ser grandes cargas de mantenimiento.
El artículo de ACM Computing Surveys, Cuándo y cómo desarrollar lenguajes específicos de dominio, proporciona consejos sobre este tema, al igual que el libro de Martin Fowler de 2010 Lenguajes específicos de dominio .
En primer lugar, usaría un DSL cuando el dominio del problema contra el que se desarrolla su desarrollo es un dominio ampliamente conocido, y algunos expertos en negocios de ese dominio ya han hecho todo lo posible para crear dicho DSL para que no tenga que pasar por el Haz un esfuerzo para resolver todos los problemas que ya han resuelto.
Si está pensando en crear un DSL, consideraría hacerlo si su negocio se realiza en un área muy particular y dedica la mayor parte de su tiempo a concentrarse en un dominio de problema específico. Si rebotas haciendo aplicaciones para múltiples dominios de problemas, entonces no te aconsejaría que tomes ese enfoque.
Por ejemplo, si su negocio es sólido en la creación de aplicaciones de impuestos, podría ser una buena idea construir un sistema de impuestos DSL. Esto permitiría que su idioma no solo sea utilizable por usted en sus diversas aplicaciones de impuestos, sino que también podría ser comercializado (utilizable) por otras empresas en su industria que desean hacer cosas similares que usted está logrando.
Por supuesto, tiene que ponderar los costos / beneficios de crear un DSL frente a un marco sobre un lenguaje ya existente.
Hay muy pocas buenas razones para crear otro DSL. El mundo es gordo con lenguajes especiales.
Piensa junto con estas líneas.
Resuelva el problema con un lenguaje de propósito general como Python, Java, C ++ ... lo que sea.
Optimice esa solución para factorizar las características comunes y crear una biblioteca de clases realmente agradable, realmente elegante y realmente extensible.
Optimizar esa biblioteca de clases para enfatizar la "ortogonalidad". Asegúrese de que todas las funciones funcionen bien juntas, sin ningún problema.
Si necesita simplificar la sintaxis solamente, cree un contenedor de scripts alrededor de su biblioteca de clases agradable. Este es tu DSL. Para Python, esto es fácil, ya es un lenguaje dinámico. Para Java, hay cosas que puedes aprovechar. Para C ++ puede ser un poco de trabajo construir este entorno de secuencias de comandos flexible.
Si aún necesita más optimización, considere escribir un compilador para su DSL.
Lo más obvio es que definitivamente debes usarlos cuando el idioma ya existe y está bien soportado. Los principales ejemplos de esto son UIL para el desarrollo de GUI basado en Motif y para compilaciones de software.
Si tiene que crear el suyo propio, diría que buscar dominios implica una gran cantidad de esfuerzo en solo especificar las cosas correctamente, y donde su compilador realmente no puede encontrar la mayoría de los errores, pero un compilador específico del dominio podría. Las GUI son un gran ejemplo, ya que la mayor parte del trabajo consiste en configurar el diseño, y generalmente hay muchas formas de realizar llamadas de C ++ sintácticamente válidas que no tienen ningún sentido para su sistema de GUI subyacente (por ejemplo, intentar incrustar un cuadro de diálogo completo). widget dentro de un botón).
Considero que UIL es particularmente una gran ganancia para el desarrollo de GUI porque un compilador de UIL puede encontrar errores en una especificación de GUI que se parece al código compilable normal de un compilador de C ++. El hecho de que esté bien soportado significa que el código es fácil de portar entre plataformas, e incluso constructores de GUI.
Una situación que viene a la mente es cuando los requisitos requieren un nivel muy alto o improbable de personalización / configuración . Por lo tanto, proporcionarías un tipo de modelo de scripting contra un DSL en su lugar.
Toma un "brazo" de ensamblaje de automóvil, por ejemplo, proporcionar un modelo de configuración para admitir varias configuraciones de fábrica sería imposible. (detecte esto, no detecte eso, cuando esto suceda haga esto ... etc.)
Pero compilar una nueva aplicación con lógica especializada para cada cliente probablemente no sea un buen camino. Entonces, en este caso, creas un pequeño marco que se convertiría en un tipo de DSL, y luego, por cada brazo robótico que vendes, escribes una pequeña aplicación en tu DSL y la guardas junto con el software central que compila y ejecuta tu DSL. guiones en su lugar. O mejor aún, las herramientas para programar el DSL se incluyen junto con el brazo robótico para que su cliente pueda "programar" el brazo en el DSL que creó.
Un ejemplo del mundo real que me viene a la mente es Yahoo Pipes (podría pensarlo como un DSL) o la directiva robots.txt para rastreadores web automatizados, por ejemplo. Puede que no sean un DSL completo, pero demuestran dónde puede ser útil el DSL.