Groovy 什么是AST转换?

Groovy 什么是AST转换?,groovy,abstract-syntax-tree,program-transformation,Groovy,Abstract Syntax Tree,Program Transformation,一般来说,什么是AST转换?我在读博客的时候发现了这些词。但它通常是什么呢?简单的答案是任何将一个AST转换为另一个AST的函数 在我关于的SO回答中可以找到一个更复杂的观点。除了前面提到的,您可能还对更广泛、更基本的概念感兴趣。AST表示抽象语法树,它基本上是代码/任何语法结构的抽象表示。转换是修改此树的操作(即,将现有AST转换为新AST)。有关更多信息,请查看此处:是用编程语言编写的源代码抽象语法结构的树表示形式 当需要转换更改代码时,transformer通常使用源代码的树表示法来查找需

一般来说,什么是AST转换?我在读博客的时候发现了这些词。但它通常是什么呢?

简单的答案是任何将一个AST转换为另一个AST的函数


在我关于

的SO回答中可以找到一个更复杂的观点。除了前面提到的,您可能还对更广泛、更基本的概念感兴趣。

AST表示抽象语法树,它基本上是代码/任何语法结构的抽象表示。转换是修改此树的操作(即,将现有AST转换为新AST)。有关更多信息,请查看此处:

是用编程语言编写的源代码抽象语法结构的树表示形式

当需要转换更改代码时,transformer通常使用源代码的树表示法来查找需要更改的节点,并应用这些更改

例如,JavaScript代码转换器支持使用
AST
树进行直接操作,如下所示:

const putout=require('putout');
移除的常量布格={
报告:()=>“不应使用调试器”,
固定:(路径)=>{
path.remove();
},
遍历:({push})=({
“DebuggerStatement”:(路径)=>{
推送(路径);
}
}),
};
输出('常数a=5;调试器'{
菲克斯:没错,
插件:[
['remove-debugger',removeDebugger]
]
});
//返回
({
代码:“常数a=5;”,
地点:[],
});
总之,使用AST有一种更简单的操作方法,用于:

const removeDebugger={
报告:()=>“不应使用调试器”,
替换:()=({
“调试器”:”
}),
};
在本例中,一个表达式替换为另一个表达式,使用有助于编写简单的代码转换,而无需触及
AST


值得一提的是,
replace
转换的内部使用了
AST
,因为它是处理源代码最强大的方式。

Downvoter/Flagger:鉴于其他人认为我的答案很好,在这里,您应该注意您的反对意见,而不是简单地将其标记并运行。mixin是一种运行时方案,用于通过允许其他行为b(“之前”)和a(“之后”)来调整基线行为f。您的结果行为是b点f点a(行为组合)。您可以获得的行为范围显然受到f处理其输入的方式的限制。程序转换(PT)采用任意规范f,并应用转换生成另一个规范f',其抽象行为与f相同。。。。。。可以使用PT实现mixin(只需应用围绕f的实现插入b和a的转换),因此PT至少与mixin一样强大。但mixin仅限于一种特定的编程语言,其中f、a和b必须进行编码;正确完成的PT系统没有此类限制。因此,mixin严格来说没有PT强大。(事实上,PT可以在f上实现任意计算以产生结果,这远远超过N个混入可以限制为“用b和a合成f”)。PTs在允许人们处理抽象而不仅仅是代码方面也很有价值。。。。。。为了真正了解实际的差异,考虑一下如何用BMIX将B-2隐形轰炸机的任务软件转换成C,用“MIXIN”转换。很明显,Mixin无法解决这样的问题,但PT可以用“技术简单”的方式来解决(我的公司实际上已经做到了)。或者考虑将C++代码转换为STD::向量到混合C++和SIMD机器指令,以执行高性能;再说一次,mixins无法做到这一点,我的公司又一次用PTs做到了这一点。。。。上述两项任务都是使用作为AST转换实现的PT完成的,我们使用的工具提供了无可否认的额外功能(有关该工具的更多详细信息,请参阅我的简历)。以前从未听说过,感谢您的教育:)