automation program-transformation

automation - ¿Hay algún lenguaje para especificar modificaciones automáticas del código?



program-transformation (2)

La idea clave es la transformación del programa . Ondrej tiene la idea correcta con DMS, pero yo soy el autor de DMS, así que probablemente sea parcial.

El lenguaje DMS utilizado para realizar transformaciones se denomina "Lenguaje de especificación de reglas (DMS)" o RSL, y se usa para especificar reglas (transformación de programas). Tal regla tiene:

  • un nombre (tendemos a tener muchos de ellos, y esta es una forma práctica de referirse a ellos)
  • parámetros (definición de variables de patrón), escritos de acuerdo con la gramática de interés del idioma de destino,
  • un patrón de mano izquierda "coinciden"
  • un patrón de mano derecha "reemplazar por este"

Los patrones a menudo se escriben en la sintaxis de la superficie del idioma de destino, es decir, la sintaxis nativa del idioma que se está transformando con extensiones para las variables de patrón. Para distinguir la sintaxis del lenguaje RSL del idioma objetivo, los patrones se escriben dentro de las (meta) comillas "...". El carácter / dentro de los patrones es un (meta) escape de regreso a RSL. Una variable de patrón está escrita "/ x". Una función (meta) foobar se escribe como / foobar (...), observe el escape (meta) en los argumentos de las funciones (meta). Fuera de las comillas, los meta-escapes son necesarios y estos constructos se escriben sin /, por ejemplo, foobar (...).

Las reglas de DMS pueden ser mucho más complejas que esto, pero estos son los conceptos básicos. Los patrones de sintaxis de superficie no representan texto; más bien, realmente representan los AST equivalentes de código en los patrones. Las reglas de DMS se usan para unir y cambiar los AST. El sistema de transformación del programa, por supuesto, tiene que tener analizadores para producir AST y anti-analizadores sintácticos ("linderos") para convertir los AST en texto. (DMS tiene una gran biblioteca de interfaces frontales para todos los lenguajes ampliamente utilizados en el planeta y muchos de los poco comunes, solo agregamos MUMPS).

Para sus ejemplos específicos, las siguientes reglas harán el truco:

"... eliminando una función dada":

rule remove_function(f:IDENTIFIER,p:parameters,b:body): declarations -> declarations " /f /p /b " -> " ; " -- replace function delcaration by empty declation if f==target_function_name();

... agregando una condición if alrededor de un bloque de código:

rule wrap_in_if(s:statement): statement -> statement " /s " -> " /if ( /generated_condition/(/) ) /s ";

... agregando una nueva declaración de función que no hace nada:

rule insert_noop_function(d:declarations): delcarations -> declarations " /d " -> " /target_function/name/(/) ( ) { } ";

Como ha observado, debe señalarlos en algún lugar; ese es el trabajo de un "metaprograma" que localiza en qué AST desea que se apliquen las reglas, y luego las aplica. Para sus reglas, necesita (con DMS) y un método de procedimiento explícito para encontrar la ubicación correcta. Para algunas reglas de DMS, simplemente puede aplicar entonces "en todas partes"; DMS esencialmente recorrerá todo el AST designado y aplicará las reglas por usted.

Varias reglas nunca son muy impresionantes, del mismo modo que varias líneas de código no son impresionantes. Unas pocas cientos o miles de reglas pueden hacer cosas bastante espectaculares (como traducciones completas del idioma), de la misma manera que unos cientos o miles de líneas de código pueden producir resultados bastante interesantes. La diferencia es que el código convencional funciona con números, cadenas y estructuras, y las herramientas de transformación de programas computan sobre estructuras de programas (AST).

Hay un ejemplo completo y completo que muestra cómo se define un lenguaje y reglas para DMS, y cómo esas reglas se aplican para lograr "modificaciones de programa" (el ejemplo realmente modifica "expresiones algebraicas" pero las ideas son exactamente las mismas).

DMS es descaradamente comercial, y no es una herramienta dimestore, por lo que puede no ser lo que necesita para su tesis.

Si no es DMS, puede obtener herramientas gratuitas que tengan las mismas ideas. Considere TXL (www.txl.ca) o StrategoXt (www.strategoxt.org). DMS, TXL, Stratego hacen todas las transformaciones del programa utilizando patrones de sintaxis de superficie, pero TXL y Stratego no pueden manejar cambios masivos al código, así como a DMS en mi humilde opinión. (Lea sobre el análisis de flujo en el sitio web de DMS por alguna razón). Sin embargo, TXL y Stratego son buenos para aprender los conceptos básicos y construir demos fuertes.

Estoy haciendo un trabajo en el que necesito poder describir las modificaciones a algunos códigos de programa que deben hacerse automáticamente.

¿Hay algún lenguaje que permita describir esto?

El lenguaje debe tener módulos o funciones que reciban la ubicación en el código donde se realizará la modificación y debe permitir especificar las posibles modificaciones que se deben realizar.
Debe permitir la descripción de modificaciones, como eliminar una función determinada, agregar una condición if en torno a un fragmento de código, agregar una nueva declaración de función que no haga nada, etc.
Las modificaciones se deben hacer sobre el árbol de análisis sintáctico, por lo que es posible restaurar el código original, solo con las modificaciones.
Ni siquiera necesito el lenguaje para tener un analizador o una implementación asociada, todo lo que necesito es la descripción del lenguaje en sí, ya sea como una gramática BNF o incluso de manera informal.

Sé que phc, el compilador PHP de antemano, es capaz de transformar el código fuente en una representación XML y volver, lo que hace más fácil modificar el código y restaurarlo. Lo que necesito es una forma de describir las modificaciones reales al XML para que pueda ejecutar un programa que pueda, por ejemplo, eliminar todas las instancias de una llamada de función específica, o agregar if (false) alrededor de cada una. Además, sería mejor si el lenguaje fuera independiente del idioma, aunque no es un requisito.

¿Crees que algo así existe?