
编译器设计实战
基于Python的增量式设计
¥53.00
作品简介
本书将带领读者使用Python语言动手构建编译器,通过循序渐进的方法,在设计和实现编译器的过程中了解基本概念、算法和数据结构等相关知识。本书将每章作为构建编译器的一个基本“步骤”,逐步为编译器添加功能。全书涵盖变量、寄存器、条件、循环、元组、函数、动态类型、通用类型等内容。本书适合作为高等院校编译原理等课程的教材,也适合相关技术人员参考。
杰里米·G. 希克(Jeremy G. Siek)印第安纳大学信息、计算与工程学院的计算机科学教授。他的主要研究方向为编程语言设计、类型系统、使用证明助手的机械化定理证明以及编译器优化。Jeremy曾出版The Boost Graph Library,还设计了C++的受限模板。他发明了渐变类型,这是一种在同一编程语言中整合动态类型和静态类型的类型系统。2009年,他获得美国国家科学基金会(NSF)教师早期职业发展奖,以资助其“弥合原型与生产之间的差距”项目;2010年和2015年,他获得苏格兰信息学与计算机科学联盟(SICSA)杰出访问学者奖学金。他是印第安纳大学编程系统中心的成员。
作品目录
译者序
前言
第1章 预备知识
1.1 抽象语法树
1.2 语法
1.3 模式匹配
1.4 递归函数
1.5 解释器
1.6 编译器示例:部分求值器
第2章 整数与变量
2.1L\(_{Var}\)语言
2.2 x86\(_{Int}\)汇编语言
2.3 规划x86汇编之旅
2.4 移除复杂操作数
2.5 选择指令
2.6 分配变量存储
2.7 修补指令
2.8 生成起始和收尾代码
2.9 挑战:L\(_{Var}\)的部分求值器
第3章 语法分析
3.1 词法分析和正则表达式
3.2 文法和解析树
3.3 二义性文法
3.4 从解析树到抽象语法树
3.5 Earley算法
3.6 LALR(1)算法
3.7 进一步阅读
第4章 寄存器分配
4.1 寄存器和调用约定
4.2 活跃性分析
4.3 构建干涉图
4.4 利用数独进行图着色
4.5 修补指令
4.6 生成起始和收尾代码
4.7 挑战:传送偏置
4.8 进一步阅读
第5章 布尔值和条件表达式
5.1LIf语言
5.2L\(_{If}\)程序的类型检查
5.3C\(_{If}\)中间语言
5.4 x86\(_{If}\)语言
5.5 收缩L\(_{If}\)语言
5.6 移除复杂操作数
5.7 详细控制
5.8 选择指令
5.9 寄存器分配
5.10 修补指令
5.12 挑战:优化块和移除跳转
5.13 进一步阅读
第6章 循环和数据流分析
6.1L\(_{While}\)语言
6.2 循环控制流和数据流分析
6.5 寄存器分配
第7章 元组和垃圾回收
7.1L\(_{Tup}\)语言
7.2 垃圾回收
7.3 显露分配
7.6 选择指令和x86\(_{Global}\)语言
7.7 寄存器分配
7.8 生成起始和收尾代码
7.9 挑战:数组
7.10 进一步阅读
第8章 函数
8.1L\(_{Fun}\)语言
8.2 x86汇编下的函数
8.3 收缩L\(_{Fun}\)语言
8.4 揭示函数和L\(_{FunRef}\)语言
8.5 限制函数
8.6 移除复杂操作数
8.9 寄存器分配
8.10 修补指令
8.11 生成起始和收尾代码
8.12 翻译举例
第9章 词法作用域函数
9.1Lλ语言
9.2 赋值和词法作用域函数
9.3 唯一化变量
9.4 赋值转换
9.5 闭包转换
9.6 显露分配
9.7 详细控制和C\(_{Clos}\)
9.8 选择指令
9.9 挑战:优化闭包
9.10 进一步阅读
第10章 动态类型
10.1L\(_{Dyn}\)语言
10.2 标记值的表示
10.3L\(_{Any}\)语言
10.4 强制转换插入:编译L\(_{Dyn}\)为L\(_{Any}\)
10.5 揭示强制转换
10.6 赋值转换
10.7 闭包转换
10.8 移除复杂操作数
10.9 详细控制和C\(_{Any}\)
10.10 选择指令
10.11L\(_{Any}\)语言的寄存器分配
第11章 渐变类型
11.1 类型检查L\(_{?}\)
11.2 解释L\(_{Cast}\)
11.3 重载解析
11.4 插入强制转换
11.5 低层类型转换
11.6 区分代理
11.7 揭示强制转换
11.8 闭包转换
11.9 选择指令
11.10 进一步阅读
第12章 泛型
12.1 编译泛型
12.2 解析实例化
12.3 擦除泛型类型
附录 x86指令集快速参考
参考文献