原标题:新书推荐 | 编译技术与应用(微课视频版·题库版)

作者:杨金民 陈果 黎文伟
定价:69.90元
编辑推荐
编译器是连接计算机硬件与高级程序语言的桥梁,是基础软件的核心内容。正因为如此,编译技术在计算机类专业的本科培养中备受重视。不过,编译技术一直被学生视为本科阶段最深奥难懂的一门课程。因编译理论的抽象性,初学者很难理解和掌握。
要使读者能领悟和灵活应用编译技术,一本好的教材需要通过典型案例来诠释编译原理的内涵,结合软件工程知识来解决其中面临的关键问题。

而本书《编译技术与应用》较好地兼顾了这三个层面,从实际工程问题出发,通过典型案例展示编译中工程问题的特征与特性,然后基于理论得出工程逻辑方案和工程实现方案,将编译原理中的数学理论和算法实用化,以此来化抽象为具体,化深奥为通俗。再融合软件工程知识,探讨解决方案的改进,使其不仅能解决功能需求问题,还具备一些其他良好的工程特质,如鲁棒性、广适通用性、高效性、可伸缩性、可配置性、可组装性等。
本书看点
(1)注重知识前后关联性的揭示。
例如,编译中的词法分析和语法分析,在现有教材中都被视作两个彼此独立的知识体系,似乎不存在联系。其实它们面对的理论问题相同,求解的理论基础相同,求解的策略和方法也相同。二者的不同之处在于,词法分析处理线性构成问题,而语法分析处理树状构成问题。当树只有两层时,树根的子结点呈线性结构,即线性结构可以被视作树结构的一个特例。因此,语法分析方法能用于词法分析。用语法中的文法来描述词的线性构成时,只须定义一个非终结符,所得文法为LR(0)文法。本书也揭示了词法分析方法未被语法分析方法替代的原因。用正则表达式来描述词法,一个非终结符都未引入,所得DFA要比通过文法所得的DFA简单。
(2)强调知识来龙去脉和前因后果的揭示。
编译的演化经历了三代。第一代是编译器前后端的一体化,置于软件开发方,典型代表有C和C++。第二代是编译器前后端分离,前端依旧置于开发方,但后端则前移至用户端机器上,典型代表有Java。第三代是编译器前后端都从开发方前移至用户端机器上,典型代表有Java。本书回答了为什么会有这种演变,另外也揭示了即时编译(JIT)、异步函数等这些技术和概念的前因后果,力求与时俱进。
(3)突出面向对象语言的编译。
面向对象语言从面向过程语言发展而来,类与其实例对象是其中的核心概念,多态则是其灵魂。本书针对面向对象语言,提出了一个编译实现框架。该框架既简洁又清晰,将全局变量视作一个根类(也叫起始类)的成员变量,将全局函数视作根类的成员函数,于是也适合面向过程语言的编译。在该框架下,面向过程语言成了面向对象语言的一个特例。本书也通过一个典型案例,揭示了面向对象编程中遇到的问题,诠释了多态的来龙去脉,给出了一种实现方案。
内容简介
本书以全新的视角透视编译技术,围绕编译中的词法分析、语法分析、语法制导的翻译、语义分析和中间代码生成、运行环境和目标代码生成、代码优化这6个核心问题展开,共分7章。本书重点针对编译器构造方法学展开分析和论述,以揭示编译技术的内涵,展示其优美性和艺术性。本书也探索技术演进背后的动因,追踪业界前沿技术及其发展趋势,帮助读者灵活应对IT技术发展与变迁所带来的挑战。本书内容新颖、通俗易懂,特别适合作为高等院校计算机及相关专业的教材,也可以作为工程技术培训的教材。本书也非常适合科研人员和工程技术人员阅读,从中感悟编译技术的内涵,体会其精妙之处。
作者简介
杨金民
湖南大学信息科学与工程学院教授。主讲编译原理与技术、数据库系统、微服务与云计算、软件系统集成等课程。获湖南省科技进步二等奖2项、三等奖3项;主持国家自然科学基金、发改委科技攻关、湖南省科技重点研发等科研项目5项,企业科技攻关项目10余项。
发表3篇教改论文,出版教材2部。
陈 果
湖南大学信息科学与工程学院教授。曾任职微软亚洲研究院。主讲编译原理、云计算技术等课程,获全国高校计算机专业优秀教师、湖南省信息化教学竞赛一等奖、湖南省一流课程负责人。在高性能数据中心网络方面的研究成果应用于华为鲲鹏芯片、腾讯自研交换机、腾讯CDN网络和百度无线搜索等。曾荣获华为最佳技术合作教授、湖南省科技进步二等奖。
黎文伟
湖南大学信息科学与工程学院副教授。主讲操作系统原理、编译原理、编译技术等课程,曾主持或参与多项国家自然科学基金、国家重大研究计划等项目,在国内外权威学术期刊及学术会议发表论文100余篇,获得国家发明专利5项,获得软件著作权登记6项。
配套资源
本书配有丰富的补充配套资源。
1. 课程配套视频;
2. 线上题库系统;
3. 随书纸质试卷一份(含8套期末考试题);
4. 补充试卷及参考答案(10套);
5. 全部配套课件;
6. (教师用)教学大纲、教学进度表、教学日历;
7. 小班讨论主题;
8. 实验指导书。

目录
向上滑动阅览
第1章编译技术概述1
1.1计算模型和机器语言的特性2
1.2高级程序语言及其特性4
1.3编译方法及过程6
1.3.1源程序的构成特性6
1.3.2编译过程7
1.3.3编译器的结构特性12
1.4编译器构造方法学13
1.5编译前对源程序文本的预处理15
1.6程序调试17
1.7编译执行和解释执行18
1.8编译方式的演进20
1.9虚拟机22
1.10程序语言的发展历程23
1.11当前主流的编译器产品24
1.12编译知识的广泛应用25
1.13本章小结26
知识拓展:别名的概述26
习题28
第2章词法分析29
2.1高级程序语言的词构成特性29
2.2词法的描述31
2.2.1正则语言和正则运算31
2.2.2C语言词法的正则描述33
2.2.3词法分析的实现框架34
2.2.4正则表达式的含义35
2.3基于状态转换图的词法分析36
2.3.1基于状态转换图的匹配判断36
2.3.2状态转换图的特征37
2.3.3基于状态转换图的通用词法分析器39
2.4正则表达式的状态转换图自动生成方法40
2.4.1正则表达式的NFA原生构造方法41
2.4.2基于NFA的匹配判断算法44
2.4.3基于NFA的DFA构造方法46
2.4.4正则表达式的最简NFA构造法49
2.4.5特殊正则表达式的最简NFA构造54
2.4.6NFA和DFA中状态属性值的确定方法56
2.4.7正则表达式之间的包含关系58
2.5正则表达式及其DFA在文本搜索中的应用61
2.6本章小结62
知识拓展:NFA和DFA构造中涉及的数据结构63
习题65
◆编译技术与应用(微课视频版·题库版)目录◆第3章语法分析67
3.1程序的树结构特性68
3.2语言的语法描述69
3.3词串的语法分析树及其构造策略73
3.4语法描述和词法描述的比较75
3.5自顶向下和最左推导的语法分析78
3.5.1自顶向下和最左推导的语法分析过程78
3.5.2左递归及其消除方法80
3.5.3左公因子及其提取方法83
3.5.4推导中的产生式选择84
3.5.5FIRST和FOLLOW函数值求解算法87
3.5.6LL(1)文法特性及其语法分析表93
3.5.7二义性文法的可改造性94
3.5.8基于LL(1)语法分析表和符号栈的语法分析器通用代码95
3.6自底向上的语法分析98
3.6.1自底向上的语法分析及有待解决的关键问题99
3.6.2文法的DFA构造方法100
3.6.3基于状态栈和文法DFA的LR语法分析104
3.6.4基于FOLLOW函数值的冲突解决方法107
3.6.5基于语法分析表的LR语法分析通用代码108
3.6.6基于FOLLOW精确化的冲突解决方法112
3.7LL语法分析和LR语法分析的对比116
3.8LR文法设计116
3.8.1DFA物理含义的挖掘和应用117
3.8.2尽量减少文法中的非终结符数量119
3.8.3非终结符语义的宽泛化121
3.8.4文法的二义性及其消除方法124
3.8.5LALR(1)型DFA的收益和代价124
3.8.6文法的上下文无关性126
3.9LR语法分析中错误的恢复127
3.10本章小结129
知识拓展:语法分析表构造中涉及的数据结构130
习题132
第4章语法制导的翻译135
4.1LR分析中的语法制导翻译136
4.1.1LR分析中的语法制导翻译简介136
4.1.2LR分析中语法制导的翻译实现框架139
4.1.3词法分析器构造工具的实现142
4.2LL分析中语法制导的翻译149
4.2.1LL分析中语法制导的翻译简介149
4.2.2LL分析中语法制导的翻译实现框架150
4.3从LR型SDT得出LL型SDT156
4.4LR语法分析中对继承属性的处理158
4.5本章小结161
习题162
第5章语义分析与中间代码生成164
5.1语义分析和中间代码生成简介165
5.1.1程序的层级结构165
5.1.2类型的语义分析167
5.1.3变量的语义分析170
5.1.4函数的语义分析173
5.1.5中间语言简介174
5.1.6中间代码生成简介176
5.2类型和变量的语义分析框架179
5.3类型和变量定义的SDT设计180
5.3.1高级程序语言中的指针语义180
5.3.2类型和变量定义的文法设计182
5.3.3类型和变量定义的语义分析及其SDD设计183
5.3.4类型和变量定义的语义分析SDT设计185
5.4变量使用的SDT设计190
5.4.1变量地址的确定方法190
5.4.2描述变量使用的文法192
5.4.3变量使用的语义分析和中间代码生成SDD设计194
5.4.4变量使用的语义分析和中间代码生成SDT设计197
5.5运算的语义分析和中间代码生成201
5.6类型系统205
5.7分支语句的中间代码生成206
5.7.1分支语句的文法207
5.7.2分支语句的中间代码生成SDD设计209
5.7.3分支语句的中间代码生成SDT设计212
5.7.4分支语句中break和continue语句的处理217
5.8函数调用的语义分析和中间代码生成218
5.9本章小结219
习题220
第6章运行环境和目标代码生成222
6.1函数调用223
6.1.1局部变量的静态存储分配方案224
6.1.2局部变量的动态存储分配方案225
6.1.3相对寻址方式带来的好处228
6.1.4形参和数组的动态性229
6.2软件集成230
6.2.1源代码级的软件集成231
6.2.2二进制可执行文件级的软件集成233
6.2.3跨模块内存访问带来的问题及解决方法235
6.2.4静态链接与动态链接237
6.3软件调试238
6.3.1程序之间的交互238
6.3.2运行环境的构建239
6.3.3调试器与被调程序之间的协同交互241
6.3.4变量值的获取与关联243
6.4垃圾自动回收245
6.4.1基于引用记数的垃圾回收方法246
6.5异常处理250
6.6面向对象中的多态252
6.6.1面向对象编程问题的揭示253
6.6.2基于代理的解耦和封装实现方案255
6.6.3基于多态的面向对象编程问题解决方案256
6.6.4接口特性259
6.6.5接口获取259
6.7本章小结260
习题262
第7章代码优化264
7.1中间代码的优化265
7.1.1基本块和流图265
7.1.2中间代码优化途径267
7.2目标代码优化基础270
7.2.1计算机特性270
7.2.2目标语言272
7.2.3目标代码生成与优化275
7.3寄存器分配276
7.3.1活变量标识算法276
7.3.2基于图着色的寄存器分配278
7.3.3变量溢出280
7.3.4内存数据的加载和刷新281
7.3.5寄存器腾空和变量溢出283
7.3.6同步函数和异步函数284
7.4基于机器其他特性的代码优化285
7.4.1基于指令流水线处理的代码优化285
7.4.2基于高速缓存的代码优化286
7.4.3基于多核处理器的代码优化287
7.4.4大数据处理和云计算中的优化288
7.5本章小结289
习题289
参考文献291
扫码优惠购书返回搜狐,查看更多
责任编辑:
