Mi hai letto nel pensiero.
Quando ho frequentato un corso di compilatore, alcuni anni fa, ho scoperto che se prendi un AST e lo serializzi, con notazione di prefisso invece della solita notazione infissa, e usi parentesi per delimitare le intere istruzioni, ottieni Lisp. Mentre avevo imparato a conoscere Scheme (un dialetto di Lisp) nei miei studi universitari, non avevo mai ottenuto un apprezzamento per questo. 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. Dopo tutto, molti di noi possono digitare più velocemente di quanto possiamo spostare un mouse. Eppure, una domanda emergente è "come si scrive codice del programma con un tablet?" La digitazione su un tablet è lenta / ingombrante, rispetto a una tastiera / laptop con una tastiera hardware. Se potessi creare un AST trascinando e rilasciando componenti da una tavolozza su un canvas su un dispositivo touchscreen di grandi dimensioni, la programmazione su un tablet potrebbe diventare una cosa reale.
-
pochi / nessuno dei nostri strumenti esistenti lo supporta. Abbiamo decenni di sviluppo coinvolti nella 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 su un albero? O un diff di due alberi? Tutte queste cose sono fatte facilmente con il testo. Ma possono solo confrontare le parole. Cambia un nome di variabile, in modo tale che le parole siano diverse ma il significato semantico è lo stesso, e quegli strumenti di diff sono nei guai. Tali strumenti, sviluppati per operare su AST anziché testo, consentirebbero di avvicinarsi al confronto del significato semantico. Questa sarebbe una buona cosa.
-
mentre si trasforma il codice sorgente del programma in un AST è relativamente ben compreso (abbiamo compilatori e interpreti, no?), trasformare un codice AST in codice di programma non è così ben compreso. Moltiplicare due numeri primi per ottenere un grande numero composito è relativamente semplice, ma è molto più difficile ricondurre un numero grande e composito a numeri primi; è qui che ci troviamo con AST parsing vs decompiling. Ecco dove le differenze tra le lingue diventano un problema. Anche all'interno di una particolare lingua, ci sono molti modi per decompilare un AST. Iterare attraverso una collezione di oggetti e ottenere un qualche tipo di risultato, per esempio. Utilizzare un ciclo for, iterando attraverso un array? Sarebbe compatto e veloce, ma ci sono dei limiti. Utilizzare un Iterator di qualche tipo, operando su una collezione? Quella Collezione potrebbe essere di dimensioni variabili, il che aggiunge flessibilità al (possibile) costo della velocità. Riduci mappa? Più complesso, ma implicitamente parallelizzabile. E questo è solo per Java, a seconda delle tue preferenze.
Col tempo, lo sforzo di sviluppo sarà esaurito e svilupperemo utilizzando touchscreen e AST. La digitazione diventerà meno necessaria. Lo vedo come una progressione logica da dove siamo, guardando a come usiamo i computer, oggi, che risolverò il # 1.
Stiamo già lavorando con gli alberi. Lisp è semplicemente AST serializzati. XML (e HTML, per estensione) è solo un albero serializzato. Per fare ricerca, abbiamo già un paio di prototipi: XPath e CSS (per XML e HTML, rispettivamente). Quando vengono creati strumenti grafici che ci consentono di creare selettori e modificatori in stile CSS, avremo risolto parte del # 2. Quando questi selettori possono essere estesi per supportare regex, saremo più vicini. Sto ancora cercando un buon strumento grafico per confrontare due documenti XML o HTML. Man mano che le persone sviluppano questi strumenti, # 2 può essere risolto. Le persone stanno già lavorando su queste cose; non sono ancora lì, ancora.
L'unico modo in cui posso vedere per poter decompilare quegli AST al 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 di partenza (diff minimo testuale). Se sto scrivendo codice da zero, l'obiettivo potrebbe essere il codice più piccolo e più stretto (probabilmente un ciclo for). Oppure potrebbe essere un 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 sono stati impostati gli obiettivi. Lo sviluppo di un tale sistema risolverebbe # 3. Sarebbe complesso dal punto di vista computazionale, il che significa che probabilmente avremmo bisogno di un qualche tipo di disposizione client-server, che consenta al tablet del tuo palmare di scaricare molti carichi pesanti su alcuni server basati su cloud.