![[中英对照] 构建你自己的编程语言(第二版)(双语对照版电子](/storage/uploads/4057_639f200a-0802-4bca-89b1-4174f80d62cf.jpg)
![[中英对照] 构建你自己的编程语言(第二版)(双语对照版电子](/storage/uploads/4057_3feeae3c-0685-430b-8a47-2c083c87298d.jpg)
![[中英对照] 构建你自己的编程语言(第二版)(双语对照版电子](/storage/uploads/4057_b0f8c913-e95c-4ca0-84aa-3d6596008405.jpg)
![[中英对照] 构建你自己的编程语言(第二版)(双语对照版电子](/storage/uploads/4057_37f34541-847f-4b26-b838-41bd7bd05333.jpg)
资源介绍
书)
本书是一本全面指导开发者设计、编译和实现编程语言的指南,采用理论与实践结合的方式,逐步带领读者完成编程语言开发的全流程。全书分为四个主要部分,共 18 章及 1 个附录,逻辑清晰,从基础概念到进阶实践层层递进。
(一)第一部分:编程语言前端(第 1-5 章)
这部分聚焦编程语言前端的构建,帮助读者打下语言开发的基础。
第 1 章:为何要构建另一门编程语言:剖析开发新编程语言的动机,如满足特定领域需求、解决现有语言痛点等;介绍编程语言实现的不同类型,包括纯解释器、原生编译器与运行时系统、转译器、字节码编译器与字节码机器;讲解字节码语言实现的组织方式,还对比了编程语言与库的差异,通过 Unicon 语言的案例,展示语言需求确立的过程。
第 2 章:编程语言设计:指导读者确定语言中的词汇与标点类型,包括保留字、标识符、常量格式、运算符等;明确控制流规范,如条件语句、循环语句的设计;选择支持的数据类型,涵盖原子类型(如整数、布尔值)、复合类型(如数组、类)和领域特定类型;以 Jzero 语言(Java 的子集)和 Unicon 的图形功能设计为例,完整呈现语言定义过程。
第 3 章:扫描源代码:深入讲解词法分析相关知识,包括词素、词法类别和标记的概念;详细介绍正则表达式的规则与示例,以及如何使用 UFlex 和 JFlex 工具;通过编写 Jzero 的扫描器,实操演示源代码扫描的实现过程,同时指出正则表达式在词法分析中的局限性及应对方法。
第 4 章:解析:阐述语法分析的核心内容,包括上下文无关文法的定义与规则;介绍使用 iyacc 和 BYACC/J 工具生成解析器的方法;以 Jzero 为例,演示编写解析器的具体步骤,还探讨了如何改进语法错误信息,提升开发体验。
第 5 章:语法树:讲解语法树的相关知识,包括树的定义、语法树类型的设计,以及语法树与解析树的区别;指导读者创建语法树的叶子节点和内部节点,以 Jzero 语言为例构建语法树;提供语法树的调试与测试方法,如避免常见错误、以文本和图形格式打印语法树。
(二)第二部分:语法树遍历(第 6-10 章)
该部分围绕语法树遍历展开,是编译器实现语义分析和代码生成的核心环节。
第 6 章:符号表:介绍符号表的基础概念,包括声明与作用域、变量的赋值与解引用;讲解如何选择合适的树遍历方式构建和填充各作用域的符号表;演示如何检查未声明和重复声明的变量,还以 Unicon 为例,说明如何处理包和类作用域。
第 7 章:检查基础类型:聚焦类型检查的基础工作,包括编译器中的类型表示,如定义类型信息的基类及子类;指导读者为声明的变量分配类型信息,确定语法树各节点的类型;以 Unicon 为例,介绍运行时类型检查和类型推断。
第 8 章:检查数组、方法调用和结构访问的类型:进一步拓展类型检查的范围,包括数组类型的检查(如数组变量声明、数组创建和访问时的类型检查);方法调用的类型检查(如参数和返回类型信息的计算、调用点的类型检查);结构化类型访问的检查(如实例变量声明、实例创建和访问的类型检查)。
第 9 章:中间代码生成:解释中间代码的概念与生成原因,介绍生成程序中的内存区域;定义中间代码的数据类型,指导读者为语法树添加中间代码属性;以 Jzero 为例,演示生成表达式、控制流和方法调用的中间代码,同时提供查看生成中间代码的方法。
第 10 章:IDE 中的语法着色:探讨编程语言生态工具的构建,分析自主开发 IDE 与支持现有 IDE 的选择;以 Visual Studio Code 为例,介绍如何为新语言添加支持,实现语法着色;还讲解了将编译器集成到程序员编辑器的方法,如避免每次修改都重新解析整个文件、利用词法信息进行标记着色、通过解析结果突出显示错误。
(三)第三部分:代码生成与运行时系统(第 11-17 章)
这部分聚焦代码生成和运行时系统的实现,是让编程语言能够实际运行的关键。
第 11 章:预处理器和转译器:解释预处理器的概念与示例,介绍预处理器与转译器的区别;以 Jzero 转译为 Unicon 为例,演示转译器的实现过程,还探讨了 Unicon 预处理器中的代码生成。
第 12 章:字节码解释器:讲解字节码的概念,对比字节码与解释器;指导读者为 Jzero 设计字节码指令集和文件格式,实现字节码解释器;以 Unicon 的字节码解释器 iconx 为例,深入分析字节码解释器的工作原理,以及如何构建运行时系统。
第 13 章:生成字节码:介绍将中间代码转换为 Jzero 字节码的方法,包括添加字节码指令类、映射地址、实现字节码生成器方法;演示生成简单表达式、指针操作、分支和条件分支、方法调用和返回的字节码;还介绍了字节码的汇编格式与二进制格式,以及链接、加载和包含运行时系统的方法。
第 14 章:生成原生代码:分析是否生成原生代码的决策因素,介绍 x64 指令集;指导读者添加 x64 指令类,映射内存区域到 x64 寄存器地址模式,使用寄存器;演示将中间代码转换为 x64 代码的过程,包括生成简单表达式、指针操作等的 x64 代码,以及生成 x64 输出、链接加载运行时系统的方法。
第 15 章:实现运算符和内置函数:讲解如何实现运算符,如字符串拼接在中间代码、字节码解释器和原生运行时系统中的实现;介绍如何编写内置函数,以及如何将内置函数与控制结构集成;以 Unicon 为例,展示运算符和内置函数的开发过程。
第 16 章:领域控制结构:分析何时需要新的控制结构,以 Unicon 中的字符串扫描和图形区域渲染为例,演示领域控制结构的实现;包括添加保留字、语法规则,检查语义错误,生成控制结构代码等步骤。
第 17 章:垃圾回收:强调垃圾回收的重要性,介绍引用计数和标记 - 清除两种垃圾回收方法;以 Jzero 为例,演示如何添加引用计数垃圾回收;详细讲解标记 - 清除垃圾回收的实现,包括组织堆内存区域、标记存活数据、回收内存等步骤。
(四)第四部分:附录与总结(第 18 章及附录)
第 18 章:最终思考:回顾本书所学内容,为读者提供后续学习方向,如深入研究编程语言设计、学习解释器和字节码机器实现、掌握代码优化技术、研究程序执行的监控与调试、设计实现 IDE 和 GUI 构建器等;还提供了进一步阅读的参考资料。
附录:Unicon 基础:介绍 Unicon 语言的基本语法、运行方式、声明与数据类型、表达式求值、关键字、程序组件声明、原子数据类型、复合数据类型、运算符表达式、过程函数方法调用、迭代与执行选择、生成器、调试与环境问题等,帮助读者理解书中 Unicon 相关示例。
三、书籍特色与价值
实用性强:全书以 Jzero(Java 子集)和 Unicon 为主要案例,提供大量可实操的代码示例,涵盖从语言设计到运行时系统实现的全流程,读者可跟随步骤亲手构建编程语言。
工具与技术结合:详细介绍 UFlex、JFlex、iyacc、BYACC/J、GNU Make、Graphviz 等工具的使用,帮助读者掌握语言开发所需的实用工具链。
理论与实践平衡:既讲解编程语言开发的理论知识,如上下文无关文法、语法树、符号表、类型检查等,又通过具体案例和代码实现,将理论落地,适合不同基础的读者学习。
扩展性佳:内容从基础到进阶,不仅适合入门者打好基础,也为有经验的开发者提供深入研究的方向,如垃圾回收优化、原生代码生成进阶等。
跨语言参考:示例代码同时提供 Unicon 和 Java 版本,读者可对比两种语言在语言开发中的优劣,拓宽技术视野。
通过阅读本书,读者不仅能掌握构建编程语言的核心技术,还能提升软件工程实践能力,如大型数据结构处理、软件测试与调试等,为从事编译器开发、语言设计相关工作奠定坚实基础。Build Your Own Programming Language