互联网
类型
可以朗读
语音朗读
204千字
字数
2023-10-01
发行日期
展开全部
主编推荐语
一本书讲透如何从零开始构建自己的编程语言。
内容简介
书中将介绍编程语言设计方面的主题,并重点介绍编程语言实现。本书的新颖之处在于将传统的编译器-编译器工具(Flex和BYACC)与两种更高级的实现语言融合。一种非常高级的语言(Unicon)可以像黄油一样穿透编译器的数据结构和算法,而另一种主流的现代语言(Java)则展示了如何在更典型的生产环境中实现相同的代码。
本书主要面向对发明编程语言或开发领域特定语言感兴趣的软件开发人员。学习编译器构建课程的计算机科学相关专业学生也会发现这本书非常适合作为语言实现的实用指南,可以为理论教材提供有益补充。
目录
- 版权信息
- 前言
- 第一部分 编程语言导论
- 第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 部分章节要点
展开全部
出版方
机械工业出版社
机械工业出版社是全国优秀出版社,自1952年成立以来,坚持为科技、为教育服务,以向行业、向学校提供优质、权威的精神产品为宗旨,以“服务社会和人民群众需求,传播社会主义先进文化”为己任,产业结构不断完善,已由传统的图书出版向着图书、期刊、电子出版物、音像制品、电子商务一体化延伸,现已发展为多领域、多学科的大型综合性出版社,涉及机械、电工电子、汽车、计算机、经济管理、建筑、ELT、科普以及教材、教辅等领域。