java和groovy中的内部代码表示

java和groovy中的内部代码表示,java,groovy,Java,Groovy,java用什么在内部表示代码 据我所知,它构建了一个树,就像它有编译器树API一样,但同时它似乎与抽象语法树不同,后者是Groovy构建的,并且可以通过AST转换进行修改。(Clojure中的代码应该按我认为的那样表示) Java的树与Groovy的树有什么区别?为什么Groovy允许对其进行开箱即用的修改,而Java不允许?不同语言的抽象语法树通常不兼容。这种情况是因为AST表示用相应语言编写的代码。这意味着您可以遍历树并再次将其格式化为具有相同语法的代码(即,空格将不同,其余的相同)。但是,

java用什么在内部表示代码

据我所知,它构建了一个树,就像它有
编译器树API
一样,但同时它似乎与
抽象语法树
不同,后者是
Groovy
构建的,并且可以通过AST转换进行修改。(Clojure中的代码应该按我认为的那样表示)


Java
的树与
Groovy
的树有什么区别?为什么
Groovy
允许对其进行开箱即用的修改,而
Java
不允许?

不同语言的抽象语法树通常不兼容。这种情况是因为AST表示用相应语言编写的代码。这意味着您可以遍历树并再次将其格式化为具有相同语法的代码(即,空格将不同,其余的相同)。但是,它们不能兼容,因为这两种语言有不同的结构。例如,Groovy有闭包,而Java没有闭包。您通常可以找到到不同概念的映射,这些映射是等价的,但这不是AST的要点

AST转换是Groovy的一部分而不是Java的一部分的原因是相同的闭包是Groovy的一部分,而不是Java的一部分:不同的设计决策。Java设计得很简单。易于进入,易于阅读,尽管经常冗长。Groovy有不同的关注点。语法更加简洁,需要领域特定语言之类的东西


如果您对编译器的内部结构更感兴趣,我建议使用。据我所知,这是你在学术界读到的标准(我在学习时读过)。

这是同一AST模式的不同实现。你能问更具体的问题吗?@talex说得更具体了。虽然最初这不是一个具体的问题,但我建议参加一些在线课程或学习编译器技术的教程。这将使描述你的问题变得更容易。在Java中,解释器不将代码表示为树。编译器在完成对其进行解析之前都是这样做的。AST是编译阶段的时态结构,使用寿命有限。Long living is final*。类文件与JVM代码Java Lombok项目使用某种AST操作,与groovyYou's right非常相似,Lombok为Java实现了这一点,但从未在那里实现我自己的AST转换。