理论教育 编译器设计之路:IR的重要意义

编译器设计之路:IR的重要意义

时间:2023-11-04 理论教育 版权反馈
【摘要】:IR在编译器设计中的地位与作用是极其重要的。这种情况并不利于理解编译器的核心技术,也不利于针对目标机的某些特性进行后端的修改或重构。Neo Pascal的设计目标是完成一个完整的编译器,而不仅仅是一个编译器的前端,因此,笔者还是倾向于自行设计一套IR供Neo Pascal使用。当然,笔者水平有限,不可能设计出RTL、SSA之类的经典形式。Neo Pascal的IR只是一个可行的方案而已,并不苛求完美。

编译器设计之路:IR的重要意义

IR在编译器设计中的地位与作用是极其重要的。不过,正如前面所提到的,随着“端”概念的出现,有些设计方案认为编译器设计者只需设计一个编译器的前端,将编译产生的IR作为GCC之类的编译器后端的输入,由后端完成将IR编译成目标代码的过程。对于一些编译技术爱好者而言,这种方法的优点是显而易见的,可以大大降低编译器设计者的工作量。例如,对于熟悉GCC接口的读者而言,联系本书第2~5章相关前端理论与技术,构造基于GCC的编译器前端应该并不算太困难。因此,有些观点认为:随着IR的日趋标准化、规范化,在现代编译技术中,研究IR已经意义不大了。不过,笔者并不认同,原因有如下两点:

(1)从研究与学习编译技术的角度而言,这种方法无法对编译器作全面了解。实际上,这种方法只完成了编译器的前端,后端的核心技术并不是掌握在设计者的手中。即使是GCC这样的开源后端,鉴于其庞大的规模,一般读者也很难完全理解其设计核心的。这种情况并不利于理解编译器的核心技术,也不利于针对目标机的某些特性进行后端的修改或重构。在实践中,这种情况并不少见,虽然GCC的设计堪称完美,提供了灵活性很高的目标机描述文件(即md文件),但是针对不同目标机的一些奇怪特性,即使Stallman恐怕也无法预知。这就使得编译器设计者不得不对GCC的后端作一些个性化的修改,在不能完全理解GCC后端的情况下,修改工程将是非常复杂与危险的。

(2)从企业行为的角度而言,这种方法的可行性不大。一般来说,商用编译器的源代码及相关文档必定是开发商最为核心的技术资料,开发商通常不会轻易公开。在开源运动(Open Source)热火朝天的今天,开发商能承受的底线可能也就是免费提供编译器而已。(www.daowen.com)

Neo Pascal的设计目标是完成一个完整的编译器,而不仅仅是一个编译器的前端,因此,笔者还是倾向于自行设计一套IR供Neo Pascal使用。当然,笔者水平有限,不可能设计出RTL、SSA之类的经典形式。Neo Pascal的IR只是一个可行的方案而已,并不苛求完美。关于RTL、SSA的话题,将在第10章中详细讨论。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈