Una transformación de programa es cualquier operación que toma un programa de computadora y genera otro programa. En muchos casos, se requiere que el programa transformado sea semánticamente equivalente al original, en relación con una semántica formal particular y, en menos casos, las transformaciones dan como resultado programas que difieren semánticamente del original de maneras predecibles. [1]
Si bien las transformaciones se pueden realizar manualmente, a menudo resulta más práctico utilizar un sistema de transformación de programas que aplique especificaciones de las transformaciones requeridas. Las transformaciones de programas se pueden especificar como procedimientos automatizados que modifican las estructuras de datos del compilador (por ejemplo, árboles de sintaxis abstracta ) que representan el texto del programa, o se pueden especificar de manera más conveniente utilizando patrones o plantillas que representan fragmentos de código fuente parametrizados.
Un requisito práctico para los sistemas de transformación de código fuente es que puedan procesar eficazmente programas escritos en un lenguaje de programación . Esto generalmente requiere la integración de un front-end completo para el lenguaje de programación de interés, incluyendo el análisis del código fuente , la construcción de representaciones internas del programa de las estructuras del código, el significado de los símbolos del programa, análisis estáticos útiles y la regeneración del código fuente válido a partir de representaciones del programa transformado. El problema de construir e integrar front-ends adecuados para lenguajes convencionales ( Java , C++ , PHP , etc.) puede ser tan difícil como construir el propio sistema de transformación de programas debido a la complejidad de dichos lenguajes. Para que sea ampliamente útil, un sistema de transformación debe poder manejar muchos lenguajes de programación de destino y debe proporcionar algún medio para especificar dichos front-ends.
Una generalización de la equivalencia semántica es la noción de refinamiento de programas : un programa es un refinamiento de otro si termina en todos los estados iniciales en los que termina el programa original, y para cada uno de esos estados se garantiza que terminará en un posible estado final para el programa original. En otras palabras, un refinamiento de un programa es más definido y más determinista que el programa original. Si dos programas son refinamientos uno del otro, entonces los programas son equivalentes. [ Aclaración necesaria ]