2017-07-17 1 views
1

Was verwendet Java, um den Code intern darzustellen?interne Codedarstellung in Java und Groovy

Soweit ich verstehe es baut einen Baum - wie es Compiler Tree API hat aber zugleich scheint es nicht das gleiche wie Abstract Syntax Tree zu sein, dass Groovy baut und dass über AST-Transformationen modifiziert werden. (Code in Clojure soll vertreten sein wie ich denke)

Was ist der Unterschied zwischen Bäumen von Java und Baum von Groovy? Warum ermöglicht es Groovy, es out of box zu ändern, während Java nicht funktioniert?

+0

Es ist eine andere Implementierung des gleichen AST-Musters. Können Sie genauere Fragen stellen? – talex

+0

@talex genauer gemacht. Obwohl es keine spezifische Frage ursprünglich – lapots

+0

ist, würde ich vorschlagen, einige Online-Kurs oder Tutorial von Lern-Compiler-Techniken zu nehmen. Das würde es viel einfacher machen, Ihr Problem zu beschreiben. Java, der Interpreter repräsentiert den Code nicht als Baum. der Compiler tut es, bis es mit der Analyse fertig ist. –

Antwort

1

Der abstrakte Syntaxbaum verschiedener Sprachen ist normalerweise nicht kompatibel. Dies ist der Fall, weil der AST den Code repräsentiert, der in der jeweiligen Sprache geschrieben wurde. Das bedeutet, dass Sie den Baum durchqueren und ihn so formatieren können, dass er wieder mit der gleichen Syntax codiert (d. H. Die Leerzeichen unterscheiden sich, der Rest ist der gleiche). Sie können jedoch nicht kompatibel sein, da die Sprachen unterschiedliche Konstrukte haben. Zum Beispiel hat Groovy Schließungen, was bei Java nicht der Fall ist. Sie können normalerweise eine Zuordnung zu verschiedenen Konzepten finden, die äquivalent sind, aber das ist nicht der Punkt einer AST.

Der Grund, warum AST-Transformationen ein Teil von Groovy sind, während sie nicht Teil von Java sind, sind die gleichen Closures, die Teil von Groovy sind, aber nicht von Java: verschiedene Designentscheidungen. Java wurde entworfen, um einfach zu sein. Einfach zu lesen und leicht zu lesen, wenn auch oft ausführlich. Groovy hatte einen anderen Fokus. Die Syntax ist prägnanter und Dinge wie domänenspezifische Sprachen sind erwünscht.

Wenn Sie sich mehr für die Interna von Compilern interessieren, empfehle ich die "Dragon Book". Soweit ich weiß, ist das der Standard, den Sie in Akademikern lesen (ich habe es gelesen, als ich studierte).

+0

AST ist zeitliche Struktur während der Erstellungsphase - hat eine begrenzte Lebensdauer. Long living ist final * .class-Dateien mit JVM-Code –

+0

Java Lombok-Projekt verwendet Art von AST-Operation, mit großer Ähnlichkeit zu groovy –

+0

Sie haben Recht, Lombok tut das für Java, implementiert nie meine eigene AST-Transformation dort. – Mene