Has estado leyendo mi mente.
Cuando tomé un curso de compiladores, hace unos años, descubrí que si tomas un AST y lo serializas, con la notación de prefijo en lugar de la notación de infijo habitual, y utilizas paréntesis para delimitar declaraciones completas, obtienes Lisp. Mientras aprendía sobre Scheme (un dialecto de Lisp) en mis estudios universitarios, nunca había ganado un aprecio por ello. Definitivamente obtuve un aprecio por Lisp y sus dialectos, como resultado de ese curso.
Problemas con lo que propones:
-
es difícil / lento componer un AST en un entorno gráfico. Después de todo, la mayoría de nosotros puede escribir más rápido de lo que podemos mover un mouse. Y, sin embargo, una pregunta emergente es "¿cómo se escribe el código del programa en una tableta?" Escribir en una tableta es lento / engorroso, en comparación con un teclado / computadora portátil con un teclado de hardware. Si pudiera crear un AST arrastrando y soltando componentes de una paleta en un lienzo en un dispositivo grande con pantalla táctil, la programación en una tableta podría convertirse en algo real.
-
pocas / ninguna de nuestras herramientas existentes lo admite. Tenemos décadas de desarrollo envueltas en la creación de IDE cada vez más complejos y editores cada vez más inteligentes. Tenemos todas estas herramientas para reformatear texto, comparar texto, buscar texto. ¿Dónde están las herramientas que pueden hacer el equivalente de una búsqueda de expresiones regulares en un árbol? ¿O una diferencia de dos árboles? Todas estas cosas se hacen fácilmente con texto. Pero solo pueden comparar las palabras. Cambie el nombre de una variable, de manera que las palabras sean diferentes pero el significado semántico sea el mismo, y esas herramientas de diferencias tengan problemas. Estas herramientas, desarrolladas para operar en AST en lugar de texto, le permitirían acercarse más a la comparación del significado semántico. Eso sería algo bueno.
-
mientras que convertir el código fuente del programa en un AST es relativamente bien comprendido (tenemos compiladores e intérpretes, ¿no?), convertir un AST en código del programa no se entiende tan bien. Multiplicar dos números primos para obtener un número grande y compuesto es relativamente sencillo, pero factorizar un número grande y compuesto de nuevo en números primos es mucho más difícil; Ahí es donde estamos con el análisis de ASTs vs descompilar. Ahí es donde las diferencias entre idiomas se convierten en un problema. Incluso dentro de un idioma en particular, hay varias formas de descompilar un AST. Iterando a través de una colección de objetos y obteniendo algún tipo de resultado, por ejemplo. ¿Utilizar un bucle for, iterar a través de una matriz? Eso sería compacto y rápido, pero hay limitaciones. ¿Utilizar un iterador de algún tipo, operando en una colección? Esa colección podría ser de tamaño variable, lo que agrega flexibilidad a expensas de la velocidad (posible). ¿Mapa reducido? Más complejo, pero implícitamente paralelizable. Y eso es solo para Java, dependiendo de tus preferencias.
Con el tiempo, el esfuerzo de desarrollo se gastará y se desarrollará utilizando pantallas táctiles y AST. Escribir será cada vez menos necesario. Veo eso como una progresión lógica desde donde estamos, mirando cómo usamos las computadoras, hoy, eso resolverá # 1.
Ya estamos trabajando con árboles. Lisp es meramente ASTs serializados. XML (y HTML, por extensión) es solo un árbol serializado. Para hacer la búsqueda, ya tenemos un par de prototipos: XPath y CSS (para XML y HTML, respectivamente). Cuando se creen herramientas gráficas que nos permitan crear selectores y modificadores de estilo CSS, habremos resuelto parte del # 2. Cuando esos selectores puedan extenderse para soportar expresiones regulares, estaremos más cerca. Sigo buscando una buena herramienta de diferencias gráficas para comparar dos documentos XML o HTML. A medida que las personas desarrollen esas herramientas, el # 2 será resuelto. La gente ya está trabajando en tales cosas; simplemente no están allí, todavía.
La única forma en que puedo ver para poder descompilar esos AST en texto de lenguaje de programación sería buscar objetivos. Si estoy modificando el código existente, el objetivo podría lograrse mediante un algoritmo que haga que mi código modificado sea lo más parecido posible al código de inicio (diferencia textual mínima). Si escribo el código desde cero, el objetivo podría ser el código más pequeño y preciso (probablemente un bucle for). O podría ser un código que se paralice lo más eficientemente posible (probablemente un mapa / reducción o algo que involucre a CSP). Por lo tanto, el mismo AST podría resultar en un código significativamente diferente, incluso en el mismo idioma, en función de cómo se establecieron los objetivos. Desarrollar un sistema así resolvería el # 3. Sería computacionalmente complejo, lo que significa que probablemente necesitaríamos algún tipo de arreglo cliente-servidor, lo que le permitirá a su tableta de mano descargar un montón de trabajo pesado a algún servidor basado en la nube.