为什么我们使用中间语言而不是AST?

Rou*_*per 5 compiler-construction optimization gcc abstract-syntax-tree

中间语言和AST有什么区别?据我所知,它们都提供了流量分析信息,编译器可以将这些信息用于优化目的.我知道GCC使用两个中间表示 - AST和IL.这是什么原因?

SK-*_*gic 8

GCC使用的不仅仅是两个中间表示,远远低于应该使用的表示.

有一种编译器设计方法,称为" nanopass ":编译器由一系列非常简单的代码重写构成,从解析器生成的原始AST开始,最后以低级代码结束.每个变换都是微不足道的,相邻中间语言之间的差异是微妙的.

这种方式很容易推理每个变换,易于理解整个链并易于添加新功能.例如,丰富的语言可能有很多语法糖,可以在进行任何类型检查之前用更简单的语言结构来表达.

当然,这个链中的每种语言都表示为AST,但通常只有第一个由解析器生成的语言称为"AST",其他所有语言都称为"中间语言".当然,术语可能因不同的思想流派而异.我个人更喜欢一直使用术语"AST".