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:
- ¿Se requiere que un inventor obtenga una licencia de presentación extranjera de la India, si la invención fue realizada en los Estados Unidos por un ciudadano indio?
- ¿Qué evitó que DropBox o WeTransfer se inventaran en el 2000?
- ¿Es cierto que hay menos necesidad de cosas porque ya se ha inventado mucho o simplemente parece que es así?
- ¿Se puede inventar algo?
- Cómo empezar a inventar
- 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.