GCC的大名,相信已经不必再解释。在本小节中,笔者想针对GCC的一些内核实现作简单介绍。事实上,试图详尽解释GCC是一项非常庞大的工程,或者说这可能是无法实现的。据笔者所知,除了GNU的官方内核白皮书之外,目前尚无一本关于GCC内核实现的书籍。不过,对有志于从事编译器设计的专业人员而言,深入学习GCC源代码可能是必不可少的。这里,笔者仍然想对GCC的内核稍作介绍。
就GCC内核层而言,整个编译过程主要应用了三种IR形式:GENERIC、GIMPLE、RTL。
GENERIC是一种前端IR形式。由于GCC支持的前端多达数十种,而各种语言机制之间是存在差异的,因此,GCC需要使用一种语言无关的IR形式表示前端的输出,这就是GENERIC。
而GIMPLE与RTL都是后端IR形式,它们更多关注的是优化与代码生成。(www.daowen.com)
事实上,GIMPLE就是一种较低级的AST形式,当然,比普通的AST存在更多限制与约束。基于GIMPLE实现的优化比较多,如常量传播、冗余删除等。在GCC中,基于GIMPLE实现的优化也称为“SSA树优化”。在前面的章节中,并没有提到“SSA”这一名词,实际上,对于初学者而言,SSA的话题有一定的难度。不过,简单了解一下这个名词的基本含义应该并不困难。关于SSA的话题,笔者将在10.2.4节中阐述。与GENERIC相比,GIMPLE似乎显得更规范,更适用于生成RTL。
与GIMPLE相比,RTL(register transfer language)从名字上看,显然是一种更低级的IR形式,因为它所关注的是寄存器传输相关的描述。有人认为它就是一种三地址代码,笔者认为这种观点还是有些牵强的,毕竟RTL与普通的三地址代码有很大差异。当然,RTL是一种线性IR形式是毋庸置疑的。GCC的编译过程如图10-1所示。值得注意的是,这里GIMPLE、RTL等IR形式只是一个统称,事实上,它们还存在多种级别的变体,以应对不同的优化及代码生成器的需求。
下面,笔者将从IR设计的观点着手,简单介绍一下GENERIC、GIMPLE及RTL的相关话题,以便读者了解与学习经典编译器的IR设计经验。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。