
编译器设计实战:基于Racket的增量式设计
¥53.00
作品简介
本书将带领读者使用Racket语言动手构建编译器,通过循序渐进的方法,在设计和实现编译器的过程中了解基本概念、算法和数据结构等相关知识。本书将每章作为构建编译器的一个基本“步骤”,逐步为编译器添加功能。全书涵盖变量、寄存器、条件、循环、元组、函数、动态类型、通用类型等内容。本书适合作为高等院校编译原理等课程的教材,也适合相关技术人员参考。
Jeremy G. Siek,印第安纳大学信息与计算学院的计算机科学教授,教授编程、编程语言、编译器、逻辑学和其他计算机科学领域的课程。他设计了新的语言特性来帮助程序员创建和使用软件库和特定于领域的语言,特别是通用的和高性能的语言。通过Walid Taha,他发明了在同一种语言中混合静态和动态类型检查的渐进类型方法。在此之前,他是Boost Graph Library一书的合著者。
作品目录
译者序
前言
第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 修补指令
2.10 生成起始和收尾代码
2.11 挑战:L\(_{Var}\)的部分求值器
第3章 寄存器分配
3.1 寄存器和调用约定
3.2 活跃性分析
3.3 构建干涉图
3.4 利用数独进行图着色
3.5 修补指令
3.6 起始和收尾代码
3.7 挑战:传送偏置
3.8 延伸阅读
第4章 布尔值和条件表达式
4.1L\(_{If}\)语言
4.2L\(_{If}\)程序的类型检查
4.3C\(_{If}\)中间语言
4.4 x86\(_{If}\)语言
4.5 收缩L\(_{If}\)语言
4.6 唯一化变量
4.7 移除复杂操作数
4.8 详细控制
4.9 选择指令
4.10 寄存器分配
4.12 挑战:优化块和去除跳转
第5章 循环和数据流分析
5.1L\(_{While}\)语言
5.2 循环控制流和数据流分析
5.3 可变变量和移除复杂操作数
5.4 揭示get!
5.6 详细控制和C\(_{↺}\)
5.7 选择指令
5.8 寄存器分配
第6章 元组和垃圾回收
6.1L\(_{Tup}\)语言
6.2 垃圾回收
6.3 显露分配
6.6 选择指令和x86\(_{Global}\)语言
6.7 寄存器分配
6.8 起始和收尾代码
6.9 挑战:简单结构
6.10 挑战:数组
6.11 揭示get!
6.12 挑战:分代收集
6.13 延伸阅读
第7章 函数
7.1L\(_{Fun}\)语言
7.2 x86汇编下的函数
7.3 收缩L\(_{Fun}\)语言
7.4 揭示函数和L\(_{FunRef}\)语言
7.5 限制函数
7.6 移除复杂操作数
7.9 寄存器分配
7.10 修补指令
7.11 起始和收尾代码
7.12 转换举例
第8章 词法作用域函数
8.1L\(_{λ}\)语言
8.2 赋值和词法作用域函数
8.3 赋值转换
8.4 闭包转换
8.5 转换举例
8.6 显露分配
8.7 详细控制和C\(_{Clos}\)语言
8.8 选择指令
8.9 挑战:优化闭包
8.10 延伸阅读
第9章 动态类型
9.1L\(_{Dyn}\)语言
9.2 标记值的表示
9.3L\(_{Any}\)语言
9.4 强制转换插入:编译L\(_{Dyn}\)为L\(_{Any}\)
9.5 揭示强制转换
9.6 移除复杂操作数
9.7 详细控制和C\(_{Any}\)
9.8 选择指令
9.9L\(_{Any}\)的寄存器分配
第10章 渐变类型
10.1 类型检查L\(_{?}\)
10.2 解释L\(_{Cast}\)
10.3 插入强制转换
10.4 低层类型转换
10.5 区分代理
10.6 揭示强制转换
10.7 闭包转换
10.8 选择指令
10.9 延伸阅读
第11章 泛型
11.1 编译泛型
11.2 解析实例化
11.3 擦除泛型类型
附录
A.1 解译器
A.2 实用函数
A.3 x86指令集快速参考
参考文献