什么是AST转换?

40
一般来说,什么是AST转换?我在阅读Groovy博客时遇到了这些词。但它一般指什么?
4个回答

29

AST指的是抽象语法树,它基本上是代码/任何语法结构的抽象表示。转换是一种修改该树的操作(即将现有的AST转换为新的AST)。要了解更多信息,请参见此处:http://en.wikipedia.org/wiki/Abstract_syntax_tree


以前从未听说过这个,感谢您的教育 :) - zx81

7

除了已经提到的内容,您可能还对更广泛和更基本的术语重写概念感兴趣。


5

2
给出负评/标记者:鉴于其他人认为我的答案相当不错,你应该在这里记录你的反对意见,而不是简单地标记并逃跑。 - Ira Baxter
2
Mixins是一种运行时方案,用于通过允许附加的行为b(“before”)和a(“after”)来调整基线行为f。您得到的行为是b点f点a(行为组合)。您可以获得的行为范围显然受到f如何处理其输入的限制。程序转换(PT)采用任意规范 f并应用变换以生成具有与f相同抽象行为的另一个规范f'。... - Ira Baxter
2
可以使用PT来实现mixin(只需应用插入b和a的转换,以围绕f的实现),因此PT至少与Mixins一样强大。但是Mixins仅限于特定的编程语言,其中必须编写f、a和b;正确完成的PT系统没有这些限制。因此,Mixins严格比PT不强大。(事实上,PT可以实现对f进行任意计算以产生结果,这比Mixins限制为“将f与b和a组合”要多得多)。PT还有助于允许人们使用抽象而不仅仅是代码。 - Ira Baxter
2
为了真正理解实际区别,考虑如何处理将编写在JOVIAL中的B-2隐形轰炸机任务软件转换为使用“Mixins”的C语言的问题。显然,Mixins无法解决这样的问题,而PT可以通过“技术简单”的方式完成(我的公司实际上已经完成了此项工作)。或者考虑将在std::vectors上操作的C ++代码转换为混合C ++和SIMD机器指令以进行高性能执行;再次,mixins无法解决此问题,而我的公司已经通过PTs完成了此项工作。 - Ira Baxter
1
以上的两个任务都是使用PT作为AST转换来完成的,诚然,我们使用的工具提供了额外的功能(有关该工具的更多详细信息,请参阅我的个人资料)。 - Ira Baxter
显示剩余2条评论

0

AST 是编程语言中源代码的抽象语法结构的树形表示。

当需要改变代码的某些部分时,通常使用transformer操作源代码的树形表示,使用Visitor Pattern查找需要更改的节点并应用这些更改。

例如,JavaScript代码转换器putout支持直接操作AST树的方式:

const putout = require('putout');

const removeDebugger = {
    report: () => 'debugger should not be used',
    fix: (path) => {
        path.remove();
    },
    traverse: ({push}) = ({
        'DebuggerStatement': (path) => {
            push(path);
        }
    }),
};

putout('const a = 5; debugger', {
    fix: true,
    plugins: [
        ['remove-debugger', removeDebugger]
    ]
});
// returns
({
    code: 'const a = 5;',
    places: [],
});

无论如何,有一种更简单的方法来操作在@putout/plugin-remove-debugger中使用的AST:

const removeDebugger = {
    report: () => 'debugger should not be used',
    replace: () = ({
        'debugger': ''
    }),
};

在这个例子中,使用模板语言@putout/engine-runner将一个表达式替换为另一个表达式,这有助于编写简单的代码转换而不需要接触AST
值得注意的是,在replace转换中仍然使用了AST,因为它是操作源代码最强大的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接