前言
掌握程序在内存中的运行时结构对提高程序设计水平的重要性再怎么强调都不过分,将程序员编写的源代码转化为可执行程序是由编译器完成的,编译器对运行时结构的形成起着非常重要的作用。如果你想提高自己的编程水平,了解编译器怎么将你编写的源代码转换为可执行程序的,那么本书就是为你而写的!如果你对编译原理很感兴趣,也很愿意阅读编译器的源代码,却苦于代码量庞大,不知从何下手,那么你必将从本书中得到巨大的收获。
对程序员来说,提高编程水平最关键的因素之一就是了解程序的运行时结构,只有了解了自己编写的源代码运行的时候在内存中是什么样的(运行时结构),才能真正写出高质量的代码。编译器是将源代码转化为最终运行时结构的工具,如何实现运行时结构正是本书最重要的一条主线。编译器是一个非常经典的程序,其中包含的很多技术已广泛应用于其他软件(如文字处理软件、数据库、Web开发程序等)。读懂编译器的源代码,对计算机软件的很多方面来说都会有借鉴作用。
一般介绍编译原理的书籍通常都是空泛地讲一些抽象的概念,甚至夹杂不少晦涩的数学公式,脱离了具体的编译器,基本上没有编译器的源代码,初学者很难理解。
而本书则是以一个真实、具体、商用GCC编译器的源代码为蓝本,以几个案例程序的实际编译为线索,详细讲解编译案例程序的源代码的具体过程。
本书先对读者最难理解的复杂过程、关系和数据结构以动画视频的方式进行直观、形象的讲解。看过这些视频,读者就会对编译原理有一个概略、直观、整体的理解,从而很容易掌握更深的内容。纸质内容再将编译原理与GCC编译器的源代码有机联系起来,用了大量直观的图示、源代码、文字做详细讲解。
本书没有用一个数学公式,力争用最简单易懂的语言把深奥的理论讲明白。读者在看完本书后会真正了解一个编译器是如何运行的,以及为什么要这么设计,更重要的是知道编译完的程序执行时在内存中的运行时结构是什么样的。
我们还为读者提供了一个缩减版的GCC源代码。原版的GCC源代码大约有600万行,是一个适用于多种计算机语言的编译器,体量过于庞大,几乎无法在短时间内阅读、理解,甚至很难记忆。我们只保留了C语言的相关部分,并去掉了错误分析、处理和优化的相关部分,大约只有130万行,其中约50万行是为了与具体指令集相关,由机器生成的代码,仅涉及后端;在剩下的80万行代码中,与编译本质相关的核心代码大约有60万行。此外,我们还提供了与之相对应的汇编器和链接器的源代码,这些代码虽然不是编译器的一部分,但却是生成完整的可执行程序必不可少的。我们还提供了一整套的开发调试环境,既有适用于Linux的,也有适用于Windows的。读者可以在一个比较小的范围内随着本书的讲解跟踪调试,这样效率更高。读者在阅读的时候始终都能与真实的编译过程、真实的编译器源代码紧密相连。本书的编译原理不再像一门“数学课”,而是一个可以调试、可以接触、可以真切感受的理论体系。
读者只要了解C语言的语法规则,会使用C语言编写一些简单的程序,就能看懂本书。
本书内容安排
第1章的前半部分先讲解程序的运行时结构。如我们一再强调,运行时是程序执行的关键,编译器正是将源代码转化为可执行程序并形成运行时结构的工具。对于只是想提高开发能力的程序员,这部分几乎起到了90%的作用。
第1章的后半部分对整体的编译过程做了一个综述。当读者对整体有概念的时候,再去看每个章节的具体内容,会更容易理解。
第2章用一个简单案例讲解词法分析。词法分析是把源文件中的内容读出并识别出符号的过程。
第3章继续用词法分析时的简单案例讲解语法分析。语法分析是在词法分析的结果中识别出语句的过程。
第4章仍用前面的简单案例生成中间结构及目标代码。
第5章和第6章用几个更为复杂的案例来分析语法和生成中间结构及目标代码的过程。
至此,严格意义上的编译过程已经讲解完毕。为了让读者对最终生成的可执行程序有一个完整的了解,我们专门安排了汇编器、链接器的内容,这就是第7章。
第7章详细讲解如何将目标代码转变为可执行程序,包括文件格式、汇编器和链接器的内容。
第8章讲预处理。从编译器的执行顺序来看,预处理器的执行是比较靠前的,之所以把预处理放在最后讲,是因为预处理比较独立,在介绍完整个编译过程之后再讲解,读者更容易理解。
其中第1~3章都配了相应的视频,建议在看纸质内容之前先看视频。
致谢
首先,依然要感谢机械工业出版社华章公司的副总经理温莉芳女士以及其他领导,他们数年来一如既往的支持,是本书能够顺利出版的前提。
其次,特别感谢机械工业出版社华章公司的副总编辑杨福川,他对事业的追求、对工作认真负责的态度以及与作者团队的密切配合,使得本书能够以常规条件下难以置信的速度走上出版流程,与读者见面。
还要感谢机械工业出版社华章公司的版权输出团队和CRC Press的贺瑞君先生,他们的不懈努力、扎实工作和高效沟通,使得本书能够成功版权输出。
最后,感谢我们的家人和朋友,是他们的坚定支持才使得团队能够拒绝方方面面、形形色色的诱惑,放弃普遍追求的短期利益,踏踏实实地做一点实在、深入的工作。这是本书的基础。