书库技术与未来自制编程语言
书籍封面

自制编程语言

作者 前桥和弥、刘卓、徐谦、吴雅明
20.0 分钟

摘要

自制编程语言总结

总结: 本书指导读者用C语言从零开始制作 Crowbar 和 Diksam 两种编程语言,涵盖词法分析、语法分析、代码生成等核心概念,最终实现面向对象和异常处理等高级机制。

你能获得:

  • 编程语言底层原理的深入理解
  • 自定义编程语言的设计与实现能力
  • 构建领域专用语言(DSL)的实践经验

核心内容

1. 为什么要制作编程语言

  • 深入理解编程语言的内部运行机制,更好地使用现有编程工具。
  • 制作领域专用语言(DSL),解决特定领域的问题。
  • 扩展应用程序,为应用程序提供更大的自定义可能性。
  • 感受接触核心技术的乐趣,提升解决问题的能力。

2. 自制编程语言并没有想象中那么难

  • 通过yacclex等工具可以简化语法处理器的开发,解决词法分析和语法分析等问题。
  • 即便不使用工具,也可以基于一些已有的解决方案自己编写语法处理器。

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)或扩展应用程序的开发者,本书也具有一定的参考价值。

作者背景

前桥和弥:1969年出生,著有《征服C指针》、《彻底掌握C语言》、《Java之谜和陷阱》等。其一针见血的“毒舌”文风和对编程语言深刻的见地受到广大读者的欢迎。 刘卓:2004年开始从事对日软件开发工作,其间还从事技术及软件工程相关培训工作。自2011年开始从事电力行业产品研发。持续关注企业级应用架构和Web客户端技术。 徐谦:6年技术开发及项目经验,曾以技术工程师身份赴日本工作两年,后归国联合创办互联网公司,现居上海继续创业中。主要从事PHP方向的Web开发。热爱开源,曾向Zend Framework等知名PHP开源项目贡献代码,并于Github自主研发运维EvaThumber等开源项目获得国内社区认可。乐于分享技术心得,个人技术博客avnpc.com在国内PHP圈小有影响。 吴雅明:13年编程经验。其中7年专注于研发基于Java EE和.NET的开发框架以及基于UML 2.0模型的代码生成工具。目前正带领团队开发云计算PaaS平台及云计算自动化配置部署的系统。

历史背景

在FORTRAN诞生后,编程语言的语法处理器经过了多年的研究,许多难点都已经可以从前人那里找到解决方法。yacc 和 lex 等工具应运而生,简化了词法分析和语法分析的流程。同时,随着硬件的不断发展,人们对于编程语言的性能和功能也有了更高的要求,例如多线程、垃圾回收等。

章节摘要

音频

Comming Soon...