¿Es apropiado inventar su propio idioma para un proyecto corporativo?

Sí, a veces vale la pena el esfuerzo, incluso si el esfuerzo es grande.

Lo hemos hecho varias veces con nuestro sistema de transformación de programas de propósito general, el kit de herramientas de reingeniería de software de DMS.

Dicha herramienta es necesaria para manipular el código fuente del lenguaje de programación, que es una tarea muy difícil, y lo usamos para procesar grandes cantidades de código fuente, lo que hace que la tarea también sea computacionalmente costosa.

Para manejar la manipulación de código, diseñamos un conjunto de lenguajes especiales específicos de dominio que facilitan la descripción de las tareas de manipulación de código. Estos idiomas cubren los siguientes temas:

  • Descripción de los elementos del lenguaje del código fuente (tradicionalmente conocido como “lexing”). Este lenguaje tiene mucho en común con otras descripciones léxicas de parser-generador, pero incluye expresiones regulares muy fuertes y autómatas de empuje hacia abajo, así como el manejo de diferentes dialectos de idiomas (¿tiene alguna idea de cuántos sabores de C existe realmente?) .
  • Descripción de la gramática del lenguaje, por ejemplo, BNF. (Extrañamente, nuestro BNF es muy simple en comparación con la mayoría, por ejemplo, no es “EBNF” y funciona extremadamente bien). Con solo la gramática, DMS y su analizador GLR libre de contexto completo, pueden analizar programas y construir automáticamente árboles de sintaxis. Esta es una enorme ventaja cuando se crean interfaces de lenguaje para lenguajes desagradables como C ++.
  • Descripciones de prettyprinters, por ejemplo, cómo regenerar el código fuente completamente a partir de los AST. Esto significa que DMS puede analizar código a AST, modificar los AST y luego imprimir AST modificados como código fuente compilable completo con los comentarios originales.
  • Descripciones de patrones y transformaciones, escritas en la sintaxis de origen del lenguaje de interés (por ejemplo, si está manipulando C ++, quiere escribir patrones que parecen fragmentos de C ++). El DMS puede usar patrones para encontrar lugares interesantes en el código, y transformaciones para reemplazar patrones encontrados por código mejorado o código para otro idioma.
  • Varios otros DSL (ya he hecho el punto).

Estos DSL permiten que nosotros (y otros usuarios de DMS) definamos idiomas arbitrarios y los manipulemos, con 1 persona en 3-6 meses. Sin ellos, probablemente llevaría varios años y ningún proyecto de análisis masivo / migración sería práctico.

La escala total de estas tareas (a menudo aplicadas a millones de líneas de código) significa que son computacionalmente caras. Para reducir ese costo, decidimos ejecutar tanto DMS como sea práctico en paralelo. Lo hicimos diseñando un lenguaje de programación paralelo, PARLANSE, que utiliza un paralelismo irregular (por ejemplo, que puede obtener al procesar árboles y gráficos) en máquinas de varios núcleos. Nuestro Java Front End analiza 1MSLOC aproximadamente 6 veces más rápido en un sistema de 8 núcleos que en un sistema de 1 núcleo, por lo que estamos viendo los beneficios.

Los costos de diseño, implementación, documentación, mantenimiento y capacitación de ingenieros para usarlos son bastante altos; hemos estado creando / mejorando DMS desde 1995 con un equipo de 10 ingenieros de nivel MS / PhD. (Afortunadamente, podemos usar el propio DMS para ayudarnos a hacer esto). Esto sería mucho más allá de lo que es práctico para la mayoría de las tiendas. En nuestro caso, los beneficios de estos lenguajes personalizados son bastante enormes para lo que hacemos, y creemos (en virtud de ser capaces de proyectos bastante espectaculares) que obtenemos mucho valor por las inversiones.

Voy a llamar a esto un condicional sí.

Las herramientas son importantes.
Con frecuencia, hay marcos genéricos que te dan el 80% del camino, en un dominio, y marcos que te dan el 90% del camino en otro …

… Pero cuando combina los dos, descubre que el trabajo de integración más allá de eso lo deja a usted en un 60% de la forma de enviar su producto, solo por los “estándares” en competencia en la sección de idiomas / tecnología en la que necesita trabajar. en.

Los primeros días de la interfaz de usuario Angular + Bootstrap, por ejemplo: los ahorros de tiempo de la interfaz de usuario fueron consumidos por todo el envoltorio de la directiva (o, lo que es peor, del controlador), para propagar jQuery / jQuery.UI cambia a su sistema.

Si te encuentras con ganas de un sistema que pueda trasladar funciones para etiquetarlos con metadatos, está bien, si esa es la pieza que falta.

Para ese fin, por supuesto, lo más sensato sería usar el sistema Babel para sus necesidades de transpilado AST +.

… y si está buscando etiquetar funciones, suena como un buen momento para mirar el complemento Decorator, sugerido por los miembros del equipo Ember.
Debe estar disponible en preset-stage-0 o preset-stage-1 (según su posición en la especificación).

Los decoradores hacen mucho más que etiquetar.
Pero también son súper útiles para hacer el etiquetado.
Hacer un decorador de anotaciones no llevaría mucho trabajo.

Este es un gran ejemplo de ambos:

  1. escribir una extensión de sintaxis para un idioma, para dar soporte a un producto
  2. prueba de que es muy probable que no tenga que escribirlo usted mismo, porque alguien ya ha pasado por el problema

¡No solo es apropiado, es inevitable!

Cuando nombras tus clases, tus variables, tus funciones, estás creando un idioma . Por ejemplo:

var bigCustomers = db.customers.where ((c) => c.totalSales> 9000);

Sé que esto no es lo que quiere decir, pero espero que entienda por qué podría estar llamando al “lenguaje” anterior. Podría decirse que es solo JavaScript, pero observe que los nombres de los métodos y las colecciones se seleccionaron de una manera específica. , ¡para que puedas deletrear “oraciones” así!

Sobre su verdadera pregunta, por supuesto, debe verificar si algo existente puede hacer el trabajo primero; si no, entonces creo que definir su propio idioma solo es apropiado si tiene la intención de hacerlo bien , ya que esto es difícil de hacer, probablemente no debería hacerlo. Un mal lenguaje es peor que ningún lenguaje, tiene el potencial de ser mucho más confuso de lo que cualquier código puede ser …

Sin embargo, hay un tipo de lenguaje que a menudo resulta decente: pequeñas eDSLs (lenguajes incorporados de dominio específico) específicos para empresas. Está tomando prestado el 99% de la semántica y todo lo demás del lenguaje principal, y solo está agregando algunas cosas pequeñas en la parte superior, en efecto, creando algo así como un lenguaje de configuración más poderoso, no realmente un lenguaje de programación. Creo que su ejemplo cae dentro de esta categoría (el único problema es que JS no es un buen anfitrión, por lo que la realidad de lo que está sugiriendo podría ser desagradable, por razones no relacionadas con el diseño de idiomas).

Sucede todo el tiempo. Cuando era socio de una empresa de fabricación de software CAD / CAM, teníamos un lenguaje de post-procesador y un idioma de personalización de UI, ambos intérpretes basados ​​en BASIC. También contábamos con un lenguaje propio basado en reglas para escribir aplicaciones cuyo código fuente de procesador posterior se ingirió ingiriendo el resultado deseado. Y escribimos un compilador APT (lenguaje de programación NC similar a Fortran).

Hoy en día hay muchas herramientas DSL (Dominio Específico) y lenguajes extensibles que se pueden utilizar para acelerar este proceso. Pero en aquel entonces los escribimos en Pascal, con versiones más recientes en C / C ++.

Sí. Es apropiado siempre que sirva mejor a los objetivos de negocios en términos de costos de producción, tiempo de comercialización y costos continuos.

Andy Gavin creó variantes de LISP para el control de objetos en videojuegos.

Haciendo Crash Bandicoot – GOOL – parte 9

Muchos programas no triviales se basan en bibliotecas que son efectivamente lenguajes específicos del dominio. Lo he hecho para programación concurrente con eventos en ‘C’. Boost Spirit Qi crea analizadores de descendencia recursivos en C ++ que tienen un olor muy parecido al EBNF.