图书前言

前言

编译器是连接计算机硬件与高级程序语言的桥梁,是基础软件的核心内容。正因为如此,编译技术在计算机类专业的本科培养中很受重视。不过,编译技术一直被学生视为本科阶段最深奥难懂的一门课程。因编译理论的抽象性,初学者很难理解和掌握。要使读者能领悟和灵活应用编译技术,一本好的教材需要通过典型案例来诠释编译原理的内涵,结合软件工程知识来解决其中面临的关键问题。从理论到实践,有理论支撑、工程逻辑、工程实现三个层面。现有教材大多注重第一个层面,后两个层面为薄弱环节。

本书从实际工程问题出发,通过典型案例展示编译中工程问题的特征与特性,然后基于理论得出工程逻辑方案和工程实现方案,将编译原理中的数学理论和算法实用化,以此来化抽象为具体,化深奥为通俗。再融合软件工程知识,探讨解决方案的改进,使其不仅能解决功能需求问题,还具备一些其他良好的工程特质,如鲁棒性、广适通用性、高效性、可伸缩性、可配置性、可组装性等。

本书针对现有教材存在的不足之处进行了改进。现有教材大多专注于经典的编译原理,术语和表述基本上也沿用了原有文献。这种理论化的表述给初学者带来了极大困难,因此学生普遍反映这门课程深奥难懂。众所周知,面向对象理论和关系数据库理论出现在编译理论之后,给信息技术带来了深远影响。对于编译中很多深奥难懂的问题,如果用面向对象观念和关系理论来认识,那么描述和刻画不仅简单明了,而且通俗易懂。本书从面向对象和关系理论的视角来剖析编译所涉及的一些难懂的理论知识,化解了其抽象深奥性,使其变得通俗具体。

本书也修正了现有教材存在的许多偏差,将编译知识做了更好的结构化处理。举例来说,在编译器构造方法学中,现有教材大多以Lex为例,阐释用词法分析器构造工具来生成词法分析器源程序。实际上,可将词法分析器结构化为一个通用而固定的词法分析器程序,再加上一个词法的DFA。因此,词法分析器构造工具要做的就是将描述词法的正则表达式转换成DFA。这种结构化处理不仅可以简化词法分析器构造工具的实现,而且使其具有通用性,取得与语言的无关性。另外,在讲解词法和语法分析时,本书以一门非常简单的语言(即正则语言)为基础,以迭代求解方式来展示词法和语法分析理论的优美性和进化性。

在内容组织方面,本书具有如下3个特点。

(1)  注重知识前后关联性的揭示。例如,编译中的词法分析和语法分析,在现有教材中都被视作两个彼此独立的知识体系,似乎不存在联系。其实它们面对的理论问题相同,求解的理论基础相同,求解的策略和方法也相同。二者的不同之处在于,词法分析处理线性构成问题,而语法分析处理树状构成问题。当树只有两层时,树根的子结点呈线性结构,即线性结构可以被视作树结构的一个特例。因此,语法分析方法能用于词法分析。用语法中的文法来描述词的线性构成时,只须定义一个非终结符,所得文法为LR(0)文法。本书也揭示了词法分析方法未被语法分析方法替代的原因。用正则表达式来描述词法,一个非终结符都未引入,所得DFA要比通过文法所得的DFA简单。

◆编译技术与应用(微课视频版·题库版)前言◆(2) 强调知识来龙去脉和前因后果的揭示。编译的演化经历了三代。第一代是编译器前后端的一体化,置于软件开发方,典型代表有C和C++。第二代是编译器前后端分离,前端依旧置于开发方,但后端则前移至用户端机器上,典型代表有Java。第三代是编译器前后端都从开发方前移至用户端机器上,典型代表有JavaScript。本书回答了为什么会有这种演变,另外也揭示了即时编译(JIT)、异步函数等这些技术和概念的前因后果,力求与时俱进。

(3) 突出面向对象语言的编译。面向对象语言从面向过程语言发展而来,类与其实例对象是其中的核心概念,多态则是其灵魂。本书针对面向对象语言,提出了一个编译实现框架。该框架既简洁又清晰,将全局变量视作一个根类(也叫起始类)的成员变量,将全局函数视作根类的成员函数,于是也适合面向过程语言的编译。在该框架下,面向过程语言成了面向对象语言的一个特例。本书也通过一个典型案例,揭示了面向对象编程中遇到的问题,诠释了多态的来龙去脉,给出了一种实现方案。

全书围绕编译中的词法分析、语法分析、语法制导的翻译、语义分析和中间代码生成、运行环境和目标代码生成、代码优化这6个核心问题展开,共分7章。本书重点针对编译器构造方法学展开分析和论述,以揭示编译技术的内涵,展示其优美性和艺术性。本书也探索技术演进背后的动因,追踪业界最新技术及其发展趋势,帮助读者灵活应对IT技术发展与变迁所带来的挑战。

第1章为编译技术概述。通过案例剖析来揭示机器语言的特性和存在的短板,进而探究高级程序语言的特性。本章通过对比分析阐释了编译的由来及其重要性,再通过一个C语言源程序例子来分析程序的构成特性,进而引出编译的策略与方法、过程与环节,展示将复杂工程问题分而治之的求解思路。编译的复杂性催生出了编译器构造方法学,用简单而专一的语言来描述高级程序语言的词法和语法,以此解决编译器构造工具的实现问题,这是编译器构造方法学的精髓所在。这种迭代求解策略带有进化性,充分展示了编译技术的优美性和艺术性。

第2章讲解词法分析。词法分析是编译的开始。本章首先以一个C语言源程序为例来分析和得出词的类别性,然后分门别类讲解词的构成特性,进而以正则运算方式来描述词的构成法则。然后讲解了正则表达式的状态转换图(经典术语为DFA)概念,以及基于DFA的词法分析方法。再将词法分析器结构化成通用程序和词法的DFA两个构成部分。试图直接得出正则表达式的DFA看似可行,实则无从下手。但是直接得出正则表达式的NFA却容易。通过穷举NFA中所有可能的状态转换情形,便能得出DFA。本章展示了这种迂回求解策略的优美性。

第3章讲解语法分析。语法分析的经典理论具有抽象、深奥、难懂的特点。为了化解理论的抽象深奥性,本章从语法分析与词法分析的联系入手,得出了“它们面对的理论问题相同,求解的理论基础相同,求解的策略和方法也相同”这一结论。它们的不同之处在于: 词的构成呈线性结构,而程序的构成呈树结构。因此,语法分析方法不过是词法分析方法的延伸和扩展而已。只要弄清楚线性结构与树结构的联系和差异,抓住语法分析树的构成特性,语法分析问题便迎刃而解,于是理论的抽象深奥性也就自然地被消解。从面向对象的视角来认识和剖析语法分析理论,能将许多抽象概念的本质含义以通俗方式揭示出来,不再显得深奥难懂。

第4章讲解语法制导的翻译。文法中的每个产生式都有其特定的语义,翻译可在语法分析的过程中附带完成。本章重点论述了语法制导的翻译中,LR语法分析优于LL语法分析的具体表现。构建文法的DFA巧妙地穷举出了所有可能的状态转换情形,具有直观、通俗、简洁、易懂的特点。尤其是DFA构建中展示出的物理含义,能将诸如优先级之类的语法规则从文法中分离出来,显著降低文法的复杂性。语法分析过程就是翻译目标的达成过程。基于LR分析的语法制导翻译,其实现框架结构清晰,层次分明。这种良好的结构特性能取得翻译动作与翻译框架的相互独立性。

第5章讲解语义分析和中间代码生成。程序要能正常运行,只做到语法正确还远远不够,还要语义正确才行。语义分析具有上下文相关性,这是它有别于语法分析的关键点。语义分析和中间代码生成都可被视作语法制导翻译框架下的翻译目标,因此它们都是在语法分析的过程中附带完成的。上下文相关性以符号表为桥梁来体现。语法分析中每遇到类型和变量的定义,都会将其记录到符号表中。每遇到类型和变量的使用,都会到符号表中去检查其语义正确性。只有语义正确之后,才会基于产生式将源代码中的结构体映射成对应的中间代码。这种映射具有机械性,没有考虑上下文之间的联系。也就是说,中间代码生成具有上下文无关性。

第6章讲解运行环境和目标代码生成。运行环境和目标代码相辅相成。运行环境通过机器指令集或者函数支持库来得以体现。目标代码生成就是使用运行环境提供的指令集或者函数,将中间代码翻译成目标代码。两者之间可相互迭代演进。基于运行环境生成的目标代码反过来可以成为运行环境的组成部分,从而使得运行环境提供的功能与服务不断丰富。代码重用、多任务运行环境,以及模块独立与共享是人们期望的计算机应用特质。这些特质的取得,一方面是从计算机硬件方面努力;另一方面是从软件方面努力。由此出现了许多技术,这些技术为软件开发的效率提高、质量提升、成本降低、周期缩短提供了支撑。

第7章讲解代码优化。加快计算任务的完成,尽快得到计算结果,是人们一直坚持不懈的追求。其中代码优化至关重要。代码优化分为中间代码优化和目标代码优化两个分支。中间代码优化与机器无关。其动因是中间代码中含有很多冗余的运算和可省略的数据存储。目标代码优化则专门针对机器的物理特性而来,通过充分利用响应速度快的存储器,减少数据在不同存储器间的无效传输,降低传输次数,减少程序所需存储空间等途径予以实现。目标代码优化的另一方面是通过挖掘计算的可并行性,充分利用机器的并行处理功能来加快计算结果的得出。即时编译(JIT)和异步调用都是目标代码优化的有效策略。

本书基于作者多年来在教学和科研实践中所取得的成果,力求将编译知识以全新的视角和通俗易懂的方式勾勒出来,降低编译知识的学习门槛,使任何对编译知识感兴趣的读者都能通过阅读本书领略编译技术的精髓,对编译中的基本问题、求解思路、体系结构、特征与特性、关键技术形成清晰的感性认识,能综合运用编译知识合理解决实际工程问题。

本书每章都包含问题由来、求解思路、特性分析、问题思考、归纳总结5部分内容,梯次讲述了从接触知识提升到理解知识,从学习知识提升到运用知识的学习过程。本书从工程问题入手,通过分析、推理、论证,强调解决方案的可行性和切实性,强调理论的通俗性,强调知识前后的关联性,力求使读者明白要学什么知识和这些知识有什么用,明白解决工程问题的基本思路、基本方法、关键环节,明白如何去超越别人和实现创新。

本书内容新颖、通俗易懂,特别适合作为高等院校计算机及相关专业的教材,也可以作为工程技术培训的教材。本书也非常适合科研人员和工程技术人员阅读,从中感悟编译技术的内涵,体会其精妙之处。

对于初学者,要透彻领悟好编译知识,必须边看书,边练习和思考,琢磨知识内涵和彼此间的联系。基于此考虑,本书在每节的重要知识点后都提供了思考题,引导读者回溯和联想,以便检验学习效果,加深对知识点的认识,训练开拓性思维。本书的习题经过了精心挑选和编排,既精炼,又能覆盖章节的主要知识点。

本书配套资料齐全,包括微课视频、教学大纲、教学日历、教学课件、补充习题、小班讨论题目、课程实验与指导、习题答案等。读者可以从清华大学出版社官网下载对应资源,也可以扫描书中的二维码获取。书中错误之处在所难免,欢迎读者批评指正。

本书的出版得到了湖南大学信息科学与工程学院的支持,也得到了清华大学出版社的相助。清华大学出版社的薛杨编辑为本书提了很多改进建议,特此致谢。

杨金民2023年1月