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 notación de prefijo en lugar de la notación infija habitual, y usas paréntesis para delimitar declaraciones enteras, obtienes Lisp. Si bien había aprendido sobre Scheme (un dialecto de Lisp) en mis estudios de pregrado, nunca realmente lo había apreciado. Definitivamente gané 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 podemos 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 con 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 soportan esto. Tenemos décadas de desarrollo envueltos 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 expresión regular a través de 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 modo que las palabras sean diferentes pero el significado semántico sea el mismo, y esas herramientas diff se encuentren en problemas. Dichas herramientas, desarrolladas para operar en AST en lugar de texto, le permitirán acercarse 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 entendido (tenemos compiladores e intérpretes, ¿no?), convertir un AST en un código de programa no es tan bien entendido. Multiplicar dos números primos para obtener un número compuesto grande es relativamente sencillo, pero factorizar un número compuesto grande en primos es mucho más difícil; ahí es donde estamos analizando y descompilando AST. Ahí es donde las diferencias entre idiomas se convierten en un problema. Incluso dentro de un idioma en particular, hay múltiples formas de descompilar un AST. Iterando a través de una colección de objetos y obteniendo algún tipo de resultado, por ejemplo. ¿Usar un bucle for, iterando a través de una matriz? Eso sería compacto y rápido, pero hay limitaciones. Use 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 (posibles) de la velocidad. ¿Mapa reducido? Más complejo, pero implícitamente paralelo. Y eso es solo para Java, dependiendo de sus preferencias.
Con el tiempo, el esfuerzo de desarrollo se gastará y estaremos desarrollando utilizando pantallas táctiles y AST. Escribir será menos necesario. Veo eso como una progresión lógica desde donde estamos, mirando cómo usamos las computadoras, hoy, eso resolverá el # 1.
Ya estamos trabajando con árboles. Lisp es simplemente AST serializados. XML (y HTML, por extensión) es solo un árbol serializado. Para hacer búsquedas, ya tenemos un par de prototipos: XPath y CSS (para XML y HTML, respectivamente). Cuando se crean herramientas gráficas que nos permiten crear selectores y modificadores de estilo CSS, habremos resuelto parte de # 2. Cuando esos selectores se puedan extender para admitir expresiones regulares, estaremos más cerca. Todavía estoy buscando una buena herramienta gráfica de diferencias para comparar dos documentos XML o HTML. A medida que las personas desarrollen esas herramientas, se podrá resolver el n. ° 2. La gente ya está trabajando en esas cosas; simplemente no están allí, todavía.
La única forma en que puedo ver para poder descompilar esos AST en el texto del 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 similar posible al código de inicio (diferencia textual mínima). Si escribo código desde cero, el objetivo podría ser el código más pequeño y ajustado (probablemente un bucle for). O podría ser un código que paraleliza de la manera más eficiente posible (probablemente un mapa / reducción o algo relacionado con 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. El desarrollo de tal sistema resolvería el # 3. Sería computacionalmente complejo, lo que significa que probablemente necesitaríamos algún tipo de disposición cliente-servidor,