前言
GCC(GNU Compiler Collection, GNU编译器套件)是一套由GNU开发的程序设计语言编译工具,是GNU工程中最重要的组成部分。经过近30年的发展,GCC不仅支持众多的前端编程语言,还支持各种主流的处理器平台和操作系统平台,成为公认的跨平台编译器的事实标准,也成为编译器设计的成功典范。
作为一名GCC编译器的使用者和源码阅读的爱好者,我一直想写一本关于GCC的技术书。
2002年,我开始在Linux系统上进行一些软件开发,GCC就是我使用的编译工具。我一直对从源代码到目标代码的转换过程充满好奇,想知道在这个过程中GCC到底都做了些什么?GCC是如何设计的,那些成千上万个GCC的源代码文件都表示了什么意义?那时我常常幻想,要是能透彻地分析和理解GCC源代码,多好!从那时起,在教学科研之余,我偶尔会翻阅一下GCC的相关源代码,可是看着繁多的GCC源代码,也常常感觉手足无措,真有一种“老虎吃天,无法下爪”的尴尬。于是分析GCC源代码的事情被搁置了,然而那种一探究竟的心情总是挥之不去。
2012年开始,我有了较多的闲暇时间,在经过一段彷徨之后,分析GCC源代码的冲动又一次浮现在脑海。我知道,这次是要来真的了,我要做点自己喜欢的事。
Why?
我有空余时间了,我要干些自己感兴趣的事情。在我创建的GCC爱好者交流群中经常有朋友问,有没有介绍GCC的资料呀?大多人都会说,有——请看官方文档!我也去看了看,没错,GCC有比较详细的官方文档,包括gccinternal及用户手册等。然而,这些文档的内容庞杂,缺乏系统分析GCC设计框架和工作流程的内容,并且大多的内容对读者来讲都是零散的,让初学者无所适从。于是我想,为什么不分析一下GCC系统,把GCC的设计实现用一种更清晰明了、更系统的方法介绍给GCC的爱好者呢?
What?
本书将围绕GCC编译过程,详细介绍从源代码到AST、从AST到GIMPLE、从GIMPLE到RTL,以及从RTL到最终的目标机器汇编代码的详细过程,涉及各个阶段中间表示的详细分析、生成过程。本书提供了大量的图表和实例,展示了GCC编译系统的总体工作流程和工作细节。本书的另外一个特点是结合GCC 4.4.0的源代码进行分析,使读者在了解编译原理的基础上进一步掌握其实现的总体流程和细节,让更多读者对编译技术的认识不再只停留在理论层面,而是向其展示一个编译系统实例的实现过程。
How?
GCC源代码涉及的内容非常庞杂,很难在一本书中全面描述,因此本书以GCC中间表示为主线,详细分析GCC从源代码开始,直到生成目标机器汇编代码的整个过程中所使用的三种中间表示(AST、GIMPLE及RTL),并对这三种中间表示的基本概念、生成过程进行详细的描述,对基于GIMPLE和RTL的优化处理进行介绍,从而描述一条从源代码到目标机器汇编代码的清晰路线图。
Who?
本书以热爱编译系统理论及其实现的在校大学生、研究生为主要读者对象,也可以作为企业中研发编译系统以及进行编译系统移植的研发工程师的有益参考。
在编写这本书的时候,有一种精神支撑着我,我相信“兴趣”加上“坚持”就是胜利!分析GCC不是一年半载的事情,需要3年、5年,甚至更长时间,不过我可以坚持,我要用我的坚持换来对GCC的深入分析,让更多的GCC爱好者熟悉它、接触它、了解它,更多地参与GCC的开发与维护。
感谢我的爱人和孩子,给了我家的温暖和亲情。感谢病榻上的父亲,虽然他不能和我说话,但他那一双大手,依然经常抚摸在我的头上。感谢年老体弱的母亲,感谢她一直照顾我的父亲,让我知道什么是坚持,什么是不离不弃!感谢西安邮电大学GPU项目组的各位同事在本书的写作中提出的宝贵建议。
本书的写作得到国家自然科学基金重点项目(项目编号:61136002)以及陕西省教育厅科研计划项目(项目编号:14JK1674)资助。
鉴于作者水平有限,在分析和写作本书的过程中也引入了一些个人观点,因此难免有一些理解的偏差和错误,敬请读者批评指正并不吝赐教,如有意见和建议,请联系作者lazy_linux@126.com,在此一并感谢!
王亚刚
2016年10月于西安邮电大学