书籍信息
不补造缺失字段,只展示当前页面可确认的关键信息。
- 书名
- 自制编程语言
- 作者
- 前桥和弥、刘卓、徐谦、吴雅明
- 阅读时长
- 20.0 分钟
- 分类
- 技术与未来
- 音频
- 暂未提供
快速了解这本书
下面这些问题会先给出《自制编程语言》最值得搜索和阅读的核心答案。
《自制编程语言》讲了什么?
自制编程语言——前桥和弥的编译器实现指南。从词法分析到代码生成,理解编程语言的底层原理。
前桥和弥、刘卓、徐谦、吴雅明是谁?
前桥和弥:1969年出生,著有《征服C指针》、《彻底掌握C语言》、《Java之谜和陷阱》等。其一针见血的“毒舌”文风和对编程语言深刻的见地受到广大读者的欢迎。 刘卓:2004年开始从事对日软件开发工作,其间还从事技术及软件工程相关培训工作。自2011年开始从事电力行业产品研发。持续关注企业级应用架构和Web客户端技术。
《自制编程语言》适合谁读?
本书适合对编程语言内部运行机制感兴趣,并希望通过实践来加深理解的程序员。读者需要具备一定的C语言基础,并能够阅读较长代码。此外,对于想要制作领域专用语言(DSL)或扩展应用程序的开发者,本书也具有一定的参考价值。
《自制编程语言》的写作背景是什么?
在FORTRAN诞生后,编程语言的语法处理器经过了多年的研究,许多难点都已经可以从前人那里找到解决方法。yacc 和 lex 等工具应运而生,简化了词法分析和语法分析的流程。同时,随着硬件的不断发展,人们对于编程语言的性能和功能也有了更高的要求,例如多线程、垃圾回收等。
摘要
自制编程语言总结
总结: 本书指导读者用C语言从零开始制作 Crowbar 和 Diksam 两种编程语言,涵盖词法分析、语法分析、代码生成等核心概念,最终实现面向对象和异常处理等高级机制。
你能获得:
- 编程语言底层原理的深入理解
- 自定义编程语言的设计与实现能力
- 构建领域专用语言(DSL)的实践经验
核心内容
1. 为什么要制作编程语言
- 深入理解编程语言的内部运行机制,更好地使用现有编程工具。
- 制作领域专用语言(DSL),解决特定领域的问题。
- 扩展应用程序,为应用程序提供更大的自定义可能性。
- 感受接触核心技术的乐趣,提升解决问题的能力。
2. 自制编程语言并没有想象中那么难
- 通过
yacc
和lex
等工具可以简化语法处理器的开发,解决词法分析和语法分析等问题。 - 即便不使用工具,也可以基于一些已有的解决方案自己编写语法处理器。
3. Crowbar 语言的特性
- 无类型语言,语法沿袭C语言风格。
- 支持四则运算、条件分支、循环、函数定义、垃圾回收等功能。
- 变量无需声明,初次赋值时即完成声明。
- 使用
global
语句声明函数中引用的全局变量。 - 通过
setjmp()
和longjmp()
实现异常处理。
4. Diksam 语言的特性
- 静态类型语言,变量必须事先声明类型。
- 采用字节码执行,编译阶段和执行阶段分离。
- 实现类、继承和多态等面向对象特性。
- 使用 mark-sweep 垃圾回收机制管理内存。
- 通过 require 声明和 rename 声明支持分割源文件和解决命名冲突。
5. 构建词法分析器
- 采用正则表达式定义记号,处理空格、换行符、四则运算符、整数和实数等。
- 使用状态机来处理复杂的记号,如数值。
6. 构建语法分析器
- 采用递归下降分析法,通过函数调用和预读记号来实现语法分析。
- 使用语法图描述语法规则,将非终端符与处理函数对应起来。
7. 内存管理模块 MEM
- 使用 MEM_malloc()、MEM_realloc() 和 MEM_free() 管理内存,填充特定值以便于调试。
- 使用存储器(storage)来管理分析树节点等小型内存区域。
8. 调试模块 DBG
- 使用 DBG_assert() 和 DBG_panic() 在代码中插入断言和错误处理。
- 通过定义
DBG_NO_DEBUG
宏,可以完全删除执行文件中的调试部分。
9. 垃圾回收机制
- 理解引用计数和 mark-sweep 两种垃圾回收机制的原理和优缺点。
- 在多线程环境下,静态变量可能引发问题,需要进行加锁处理。
- 使用不完全类型隐藏结构体的内部定义,降低模块间的依赖程度。
10. 程序优化
- 了解常量折叠的原理,可以减少运行时的计算量。
- 考虑符号表和扣留操作,可以提高变量检索的效率。
11. 中文支持
- 使用
setlocale()
函数设置区域,以便支持中文编码。 - 处理 GB2312 编码的 0x5C 问题,确保字符串常量能正确解析。
- 考虑使用 UTF-8 作为内部编码,支持更广泛的字符集。
12. 结构控制
- 理解 break、continue 和 return 等控制语句在递归下降分析中的实现。
- 使用 setjmp() 和 longjmp() 从嵌套的循环和函数中跳出。
问答
Q: 静态类型语言和动态类型语言有什么区别?
A: 静态类型语言在编译时需要声明变量类型,编译阶段会进行类型检查,有助于及早发现类型错误,运行时效率通常更高。动态类型语言则无需声明变量类型,类型检查在运行时进行,代码编写更灵活。
Q: 编译型语言和解释型语言有什么区别?
A: 编译型语言将源代码一次性编译成机器码,运行速度快,但移植性较差。解释型语言逐行解释执行源代码,移植性好,但运行速度相对较慢。
Q: mark-sweep 垃圾回收机制的原理是什么?
A: mark-sweep 垃圾回收机制分为两个阶段:mark 阶段从根对象出发,标记所有可达对象;sweep 阶段清除所有未被标记的对象。可以解决循环引用的问题,但可能产生内存碎片。
思维导图
目标读者
本书适合对编程语言内部运行机制感兴趣,并希望通过实践来加深理解的程序员。读者需要具备一定的C语言基础,并能够阅读较长代码。此外,对于想要制作领域专用语言(DSL)或扩展应用程序的开发者,本书也具有一定的参考价值。
历史背景
在FORTRAN诞生后,编程语言的语法处理器经过了多年的研究,许多难点都已经可以从前人那里找到解决方法。yacc 和 lex 等工具应运而生,简化了词法分析和语法分析的流程。同时,随着硬件的不断发展,人们对于编程语言的性能和功能也有了更高的要求,例如多线程、垃圾回收等。