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

《自制编程语言》书籍摘要

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

自制编程语言——前桥和弥的编译器实现指南。从词法分析到代码生成,理解编程语言的底层原理。

这篇内容整理了《自制编程语言》的核心摘要、作者背景、历史背景和章节重点,帮助你快速理解 前桥和弥、刘卓、徐谦、吴雅明 想表达的关键观点。

书籍信息

不补造缺失字段,只展示当前页面可确认的关键信息。

书名
自制编程语言
作者
前桥和弥、刘卓、徐谦、吴雅明
阅读时长
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)或扩展应用程序的开发者,本书也具有一定的参考价值。

作者背景

前桥和弥: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 等工具应运而生,简化了词法分析和语法分析的流程。同时,随着硬件的不断发展,人们对于编程语言的性能和功能也有了更高的要求,例如多线程、垃圾回收等。

章节摘要