Mi hai letto nella mente.
Quando ho seguito un corso per compilatori, qualche anno fa, ho scoperto che se prendi un AST e lo serializzi, con la notazione prefisso invece della solita notazione infix, e usi le parentesi per delimitare intere dichiarazioni, ottieni Lisp. Mentre avevo imparato a conoscere Scheme (un dialetto di Lisp) nei miei studi universitari, non avevo mai veramente apprezzato. Ho sicuramente guadagnato un apprezzamento per Lisp e i suoi dialetti, come risultato di quel corso.
Problemi con ciò che proponi:
è difficile / lento comporre un AST in un ambiente grafico. Dopotutto, molti di noi possono digitare più velocemente di quanto possiamo spostare un mouse. Eppure, una domanda emergente è "come si scrive il codice del programma con un tablet?" Digitare su un tablet è lento / ingombrante, rispetto a una tastiera / laptop con una tastiera hardware. Se potessi creare un AST trascinando e rilasciando componenti da una tavolozza su una tela su un grande dispositivo touchscreen, la programmazione su un tablet potrebbe diventare una cosa reale.
pochi / nessuno dei nostri strumenti esistenti supporta questo. Abbiamo decenni di sviluppo legati alla creazione di IDE sempre più complessi e di editor sempre più intelligenti. Abbiamo tutti questi strumenti per riformattare il testo, confrontare il testo, cercare il testo. Dove sono gli strumenti che possono fare l'equivalente di una ricerca di espressioni regolari attraverso un albero? O un diff di due alberi? Tutte queste cose possono essere facilmente eseguite con il testo. Ma possono solo confrontare le parole. Cambia un nome di variabile, in modo che le parole siano diverse ma il significato semantico sia lo stesso, e quegli strumenti diff si mettono nei guai. Tali strumenti, sviluppati per operare su AST anziché su testo, ti permetterebbero di avvicinarti al confronto del significato semantico. Sarebbe una buona cosa.
mentre trasformare il codice sorgente del programma in un AST è relativamente ben compreso (abbiamo compilatori e interpreti, vero?), trasformare un AST in un codice di programma non è così ben compreso. Moltiplicare due numeri primi per ottenere un numero composto elevato è relativamente semplice, ma è molto più difficile includere un numero composto elevato in numeri primi; ecco dove siamo con l'analisi e la decompilazione degli AST. Ecco dove le differenze tra le lingue diventano un problema. Anche all'interno di una lingua particolare, esistono diversi modi per decompilare un AST. Scorrere una raccolta di oggetti e ottenere un tipo di risultato, ad esempio. Utilizzare un ciclo for, iterando attraverso un array? Sarebbe compatto e veloce, ma ci sono delle limitazioni. Usa un Iteratore di qualche tipo, operando in una collezione? Quella raccolta potrebbe essere di dimensioni variabili, il che aumenta la flessibilità a (possibile) spesa della velocità. Riduci mappa? Più complesso, ma implicitamente parallelizzabile. E questo è solo per Java, a seconda delle tue preferenze.
Con il tempo, lo sforzo di sviluppo sarà speso e svilupperemo utilizzando touchscreen e AST. La digitazione diventerà meno necessaria. Vedo che come una progressione logica da dove siamo, osservando come usiamo i computer, oggi, ciò risolverà il n. 1.
Stiamo già lavorando con gli alberi. Lisp è semplicemente AST serializzato. XML (e HTML, per estensione) è solo un albero serializzato. Per effettuare la ricerca, abbiamo già un paio di prototipi: XPath e CSS (rispettivamente per XML e HTML). Quando vengono creati strumenti grafici che ci consentono di creare selettori e modificatori in stile CSS, avremo risolto parte del n. 2. Quando quei selettori possono essere estesi per supportare regex, saremo più vicini. Ancora alla ricerca di un buon strumento grafico diff per confrontare due documenti XML o HTML. Man mano che le persone sviluppano questi strumenti, sarà possibile risolvere il n. 2. Le persone stanno già lavorando su tali cose; semplicemente non ci sono ancora.
L'unico modo in cui posso vedere per essere in grado di decompilare gli AST nel testo del linguaggio di programmazione sarebbe una ricerca di obiettivi. Se sto modificando il codice esistente, l'obiettivo potrebbe essere raggiunto da un algoritmo che rende il mio codice modificato il più simile possibile al codice iniziale (minima differenza testuale). Se sto scrivendo codice da zero, l'obiettivo potrebbe essere il codice più piccolo e stretto (probabilmente un ciclo for). Oppure potrebbe essere il codice che si parallelizza nel modo più efficiente possibile (probabilmente una mappa / riduzione o qualcosa che coinvolge CSP). Pertanto, lo stesso AST potrebbe comportare un codice significativamente diverso, anche nella stessa lingua, in base al modo in cui gli obiettivi sono stati fissati. Lo sviluppo di un tale sistema risolverebbe il n. 3. Sarebbe complesso dal punto di vista computazionale, il che significa che probabilmente avremmo bisogno di una sorta di disposizione client-server,