自己动手构建编程语言:如何设计编译器、解释器和DSL

自己动手构建编程语言:如何设计编译器、解释器和DSL

查阅电子书
手机扫码
  • 微信扫一扫

    关注微信公众号

因版权原因待上架

编辑推荐

一本书讲透如何从零开始构建自己的编程语言。

内容简介

书中将介绍编程语言设计方面的主题,并重点介绍编程语言实现。本书的新颖之处在于将传统的编译器-编译器工具(Flex和BYACC)与两种更高级的实现语言融合。一种非常高级的语言(Unicon)可以像黄油一样穿透编译器的数据结构和算法,而另一种主流的现代语言(Java)则展示了如何在更典型的生产环境中实现相同的代码。

本书主要面向对发明编程语言或开发领域特定语言感兴趣的软件开发人员。学习编译器构建课程的计算机科学相关专业学生也会发现这本书非常适合作为语言实现的实用指南,可以为理论教材提供有益补充。

作者简介

作者克林顿·L.杰弗瑞(Clinton L.Jeffery),是New Mexico Institute of Mining and Technology计算机科学与工程系的教授和系主任。他在华盛顿大学获得计算机科学学士学位,在亚利桑那大学获得计算机科学硕士和博士学位。他主要从事编程语言、程序监控、调试、图形、虚拟环境和可视化方面的研究。

章节目录

版权信息

前言

第一部分 编程语言导论

第1章 为什么要构建另一种编程语言

1.1 编写自己的编程语言的动机

1.1.1 编程语言实现的类型

1.1.2 组织字节码语言实现

1.1.3 示例中使用的语言

1.2 编程语言与库的差别

1.3 适用于其他软件工程任务

1.4 建立语言需求

1.5 案例研究:Unicon语言的创建需求

1.5.1 Unicon需求#1——保留人们对Icon的喜爱

1.5.2 Unicon需求#2——支持大型大数据项目

1.5.3 Unicon需求#3——现代应用程序的高级输入/输出

1.5.4 Unicon需求#4——提供可实现的通用系统接口

1.6 本章小结

1.7 思考题

第2章 编程语言设计

2.1 确定要编程语言提供的单词和标点符号的类型

2.2 指定控制流

2.3 决定支持哪种数据

2.3.1 原子类型

2.3.2 复合类型

2.3.3 领域特定类型

2.4 整体程序结构

2.5 完成Jzero语言的定义

2.6 案例研究:设计Unicon中的图形功能

2.6.1 2D图形语言支持

2.6.2 添加3D图形支持

2.7 本章小结

2.8 思考题

第3章 扫描源代码

3.1 技术需求

3.2 词素、词类和标记

3.3 正则表达式

3.3.1 正则表达式规则

3.3.2 正则表达式示例

3.4 使用UFlex和JFlex

3.4.1 头部分

3.4.2 正则表达式部分

3.4.3 编写一个简单的源代码扫描器

3.4.4 运行扫描器

3.4.5 标记和词法属性

3.4.6 扩展示例以构造标记

3.5 为Jzero编写扫描器

3.5.1 Jzero Flex规范

3.5.2 Unicon Jzero代码

3.5.3 Java Jzero代码

3.5.4 运行Jzero扫描器

3.6 正则表达式并不总是足够的

3.7 本章小结

3.8 思考题

第4章 解析

4.1 技术需求

4.2 语法分析

4.3 理解上下文无关文法

4.3.1 编写上下文无关文法规则

4.3.2 编写编程构造规则

4.4 使用iyacc和BYACC/J

4.4.1 声明头部分中的符号

4.4.2 组合yacc上下文无关文法部分

4.4.3 理解yacc解析器

4.4.4 修复yacc解析器中的冲突

4.4.5 语法错误修复

4.4.6 组合简单示例

4.5 为Jzero编写解析器

4.5.1 Jzero lex规范

4.5.2 Jzero yacc规范

4.5.3 Unicon Jzero代码

4.5.4 Java Jzero解析器代码

4.5.5 运行Jzero解析器

4.6 改进语法错误消息

4.6.1 向Unicon语法错误消息添加详细信息

4.6.2 向Java语法错误消息添加详细信息

4.6.3 使用Merr生成更好的语法错误消息

4.7 本章小结

4.8 思考题

第5章 语法树

5.1 技术需求

5.2 GNU make的使用

5.3 树

5.3.1 定义语法树类型

5.3.2 解析树与语法树

5.4 从终结符创建叶子

5.4.1 用叶子包装标记

5.4.2 使用YACC的值栈

5.4.3 为解析器的值栈包装叶子

5.4.4 确定需要哪些叶子

5.5 从产生式规则构建内部节点

5.5.1 访问值栈上的树节点

5.5.2 使用树节点工厂方法

5.6 为Jzero语言形成语法树

5.7 调试并测试语法树

5.7.1 避免常见的语法树错误

5.7.2 以文本格式输出语法树

5.7.3 使用dot输出语法树

5.8 本章小结

5.9 思考题

第二部分 语法树遍历

第6章 符号表

6.1 技术需求

6.2 建立符号表基础

6.2.1 声明和作用域

6.2.2 赋值和取消引用变量

6.2.3 选择正确的树遍历

6.3 为每个作用域创建和填充符号表

6.3.1 向语法树添加语义属性

6.3.2 定义符号表和符号表条目的类

6.3.3 创建符号表

6.3.4 填充符号表

6.3.5 综合isConst属性

6.4 检查未声明的变量

6.4.1 识别方法体

6.4.2 发现方法体中变量的使用

6.5 查找重新声明的变量

6.5.1 将符号插入符号表

6.5.2 报告语义错误

6.6 在Unicon中处理包和类作用域

6.6.1 名称修饰

6.6.2 为成员变量引用插入self

6.6.3 在方法调用中插入self作为第一个参数

6.7 测试和调试符号表

6.8 本章小结

6.9 思考题

第7章 基本类型检查

7.1 技术需求

7.2 编译器中的类型表示

7.2.1 定义表示类型的基类

7.2.2 子类化复杂类型的基类

7.3 将类型信息分配给声明的变量

7.3.1 从保留字合成类型

7.3.2 将类型继承到变量列表中

7.4 确定每个语法树节点的类型

7.4.1 确定叶子的类型

7.4.2 计算和检查内部节点的类型

7.5 Unicon中的运行时类型检查和类型推断

7.6 本章小结

7.7 思考题

第8章 检查数组、方法调用和结构访问的类型

8.1 技术需求

8.2 检查数组类型的操作

8.2.1 处理数组变量声明

8.2.2 在数组创建期间检查类型

8.2.3 在数组访问期间检查类型

8.3 检查方法调用

8.3.1 计算参数和返回类型信息

8.3.2 检查每个方法调用站点的类型

8.3.3 检查返回语句中的类型

8.4 检查结构化类型访问

8.4.1 处理实例变量声明

8.4.2 在创建实例时检查类型

8.4.3 在实例访问时检查类型

8.5 本章小结

8.6 思考题

第9章 中间代码生成

9.1 技术需求

9.2 准备生成代码

9.2.1 为什么要生成中间代码

9.2.2 了解生成程序的存储区域

9.2.3 为中间代码引入数据类型

9.2.4 将中间代码属性添加到树中

9.2.5 生成标签和临时变量

9.3 中间代码指令集

9.3.1 指令

9.3.2 声明

9.4 用标签为控制流注释语法树

9.5 为表达式生成代码

9.6 为控制流生成代码

9.6.1 为条件表达式生成标签目标

9.6.2 生成循环代码

9.6.3 为方法调用生成中间代码

9.6.4 检查生成的中间代码

9.7 本章小结

第10章 IDE中的语法着色

10.1 下载本章中使用的示例IDE

10.2 将编译器集成到程序员的编辑器中

10.2.1 从IDE中分析源代码

10.2.2 将编译器输出发送到IDE

10.3 避免在每次更改时重新解析整个文件

10.4 使用词法信息为标记着色

10.4.1 扩展EditableTextList组件以支持颜色

10.4.2 在绘制单个标记时对其进行着色

10.5 使用解析结果突出显示错误

10.6 添加Java支持

10.7 本章小结

第三部分 代码生成与运行时系统

第11章 字节码解释器

11.1 技术需求

11.2 什么是字节码

11.3 比较字节码和中间码

11.4 为Jzero构建字节码指令集

11.4.1 定义Jzero字节码文件格式

11.4.2 了解栈机操作的基础知识

11.5 实现字节码解释器

11.5.1 将字节码加载到内存中

11.5.2 初始化解释器状态

11.5.3 获取指令并推进指令指针

11.5.4 指令解码

11.5.5 执行指令

11.5.6 启动Jzero解释器

11.6 编写Jzero运行时系统

11.7 运行Jzero程序

11.8 检查Unicon字节码解释器iconx

11.8.1 了解目标导向的字节码

11.8.2 在运行时保留类型信息

11.8.3 获取、解码和执行指令

11.8.4 制作运行时系统的其余部分

11.9 本章小结

11.10 思考题

第12章 生成字节码

12.1 技术需求

12.2 转换中间代码为Jzero字节码

12.2.1 为字节码指令添加类

12.2.2 将中间代码地址映射到字节码地址

12.2.3 实现字节码生成器方法

12.2.4 为简单表达式生成字节码

12.2.5 生成指针操作的代码

12.2.6 为分支和条件分支生成字节码

12.2.7 为方法调用和返回生成代码

12.2.8 处理中间代码中的标签和其他伪指令

12.3 比较字节码汇编程序与二进制格式

12.3.1 以汇编格式输出字节码

12.3.2 以二进制格式输出字节码

12.4 链接、加载并包括运行时系统

12.5 Unicon示例:icont中的字节码生成

12.6 本章小结

12.7 思考题

第13章 生成本机代码

13.1 技术需求

13.2 决定是否生成本机代码

13.3 x64指令集

13.3.1 为x64指令添加类

13.3.2 将内存区域映射到基于x64寄存器的地址模式

13.4 使用寄存器

13.4.1 从空策略开始

13.4.2 分配寄存器以加速本地区域

13.5 将中间代码转换为x64代码

13.5.1 将中间代码地址映射到x64内存地址

13.5.2 实现x64代码生成器方法

13.5.3 生成简单表达式的x64代码

13.5.4 生成指针操作的代码

13.5.5 为分支和条件分支生成本机代码

13.5.6 为方法调用和返回生成代码

13.5.7 处理标签和伪指令

13.6 生成x64输出

13.6.1 以汇编语言格式编写x64代码

13.6.2 从本机汇编程序到目标文件

13.6.3 链接、加载并包括运行时系统

13.7 本章小结

13.8 思考题

第14章 运算符和内置函数的实现

14.1 实现运算符

14.1.1 运算符是否需要硬件支持

14.1.2 在中间代码生成中添加字符串连接

14.1.3 为字节码解释器添加字符串连接

14.1.4 将字符串连接添加到本机运行时系统

14.2 编写内置函数

14.2.1 向字节码解释器添加内置函数

14.2.2 编写用于本机代码实现的内置函数

14.3 集成内置组件与控制结构

14.4 为Unicon开发运算符和函数

14.4.1 在Unicon中编写运算符

14.4.2 开发Unicon的内置函数

14.5 本章小结

14.6 思考题

第15章 域控制结构

15.1 了解何时需要新的控制结构

15.1.1 定义控制结构

15.1.2 减少过多的冗余参数

15.2 Icon和Unicon中的字符串扫描

15.2.1 扫描环境及其基本操作

15.2.2 通过控制结构消除过多参数

15.3 Unicon中的渲染区域

15.3.1 从显示列表渲染3D图形

15.3.2 使用内置函数指定渲染区域

15.3.3 使用嵌套渲染区域更改图形细节层次

15.3.4 创建渲染区域控制结构

15.4 本章小结

15.5 思考题

第16章 垃圾收集

16.1 认识垃圾收集的重要性

16.2 对象的引用计数

16.2.1 将引用计数添加到Jzero

16.2.2 生成堆分配代码

16.2.3 为赋值运算符修改生成的代码

16.2.4 引用计数的缺点和局限性

16.3 标记实时数据并清理剩余数据

16.3.1 组织堆内存区域

16.3.2 遍历基本变量以标记实时数据

16.3.3 回收实时内存并将其放入连续内存块

16.4 本章小结

16.5 思考题

第17章 结语

17.1 反思从编写这本书中学到的东西

17.2 决定何去何从

17.2.1 学习编程语言设计

17.2.2 学习如何实现解释器和字节码机器

17.2.3 获取代码优化方面的专业知识

17.2.4 监视和调试程序执行

17.2.5 设计和实现IDE和GUI构建器

17.3 延伸阅读的参考资料

17.4 本章小结

第四部分 附录

附录A Unicon基础

附录B 部分章节要点

自己动手构建编程语言:如何设计编译器、解释器和DSL是2023年由机械工业出版社出版,作者[美] 克林顿·L.杰弗瑞。

得书感谢您对《自己动手构建编程语言:如何设计编译器、解释器和DSL》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

购买这本书

你可能喜欢
Go语言高级编程 电子书
Go语言进阶实战,CGO编程web编程书。
R语言编程基础 电子书
《R语言学习手册》:7章全面介绍R语言及Rattle工具,附课后习题。
R语言编程:基于tidyverse 电子书
一本基于tidyverse入门R语言编程的书。
ScratchJr趣味编程动手玩:让孩子用编程讲故事 电子书
本书用寓教于乐的方式教孩子们学习ScratchJr。全书共18个主题背景,或是成语故事,或是寓言故事,还有科技梦想,等等。每一主题都有形象的背景介绍或者情景引入,然后确定各个角色,并且逐个角色去分析编程技巧和方法,并有简单的旁注,孩子们能更直观、有效地阅读。最后总结出编程流程图,引导编程顺序,训练逻辑思维。
OCaml语言编程基础教程 电子书
OCaml语言是一种函数式程序设计语言。本书重点介绍函数式编程的基础知识以及OCaml程序设计的技巧,同时兼顾应用软件开发的需求。全书共8章,前5章讲解OCaml语言的函数式控制结构、数据结构、模块化程序设计、命令式程序设计和图形程序设计;第6章介绍如何把OCaml移植到F#,第7章介绍通过C#开发的用户界面调用OCaml或F#程序,第8章介绍面向对象程序设计。本书适合想要学习OCaml程序语言或