七的博客

使用JavaScript语言实现迷你版本的编译器-项目简介

编译原理JavaScript

使用JavaScript语言实现迷你版本的编译器-项目简介

1.前言

最近我在 Github 上发现了一个有意思的项目 the-super-tiny-compiler。项目是使用。该项目用了不到 200 行代码,实现了一个将 Lisp 语言语句转换为 JavaScript 语言语句的编译器。尽管代码很少,但是麻雀虽小五脏俱全,包含了编译原理中的许多核心知识点。

如果你的英文过关,建议你直接阅读原项目(需要科学访问这个网站)

2. 为什么要学习这个项目

传统上,学习编译原理通常需要阅读 《编译原理》(英语:Compilers: Principles, Techniques, and Tools), 国内通常称作“龙书”,书本的封面上有一条紫色的龙以及一个屠龙武士。

这本书虽然内容全面,但是如果你是自己一个去闷头看书的情况下,这本书的难度我个人觉得是非常的难以理解。 书中大量晦涩难懂的概念以及术语,学习起来对大部分人来说是很费劲的。

一个比较好的学习办法是可以借助网络上一些视频类的课程,先通过视频课程建立基础,然后再回过头来去看这本书。 学习说到底,说到底还是要学以致用的。 学习这个项目则可以让你在学习基本的一些概念后,可以通过编写一小部分代码就可以体验到自己手写的编译器的运行效果。

整个项目的处理流程图如下:

编译流程

3. 通过这个项目你将可以学习到的知识点

通过这个项目,你可以接触到的知识点有:

  • 词法解析
  • 语法解析
  • 抽象语法树的概念
  • 抽象语法树转化
  • 抽象语法树的遍历
  • 访问器思想
  • 目标代码的生成

4. 学习前的准备

学习这个项目不用太多的前置知识点准备,提前掌握如下知识点将会更容易上手:

  • JavaScript 语言的基本语法
  • JavaScript 的模块化
  • Node.js 的基本知识
  • Lisp 语言的基本语法

另外,如果你熟悉编译原理的一些基本概念将有助于你快速看懂这个项目。

5. 项目章节划分说明

为了让整个内容更加清晰以及容易理解,本系列文章计划拆分成以下几个章节:

  1. 使用JavaScript语言实现迷你版本的编译器(一)-项目简介 (当前章节)

  2. 使用JavaScript语言实现迷你版本的编译器(二)-词法分析 在这个章节中,我们将探讨编译器的第一个步骤:词法分析, 学习如何将 Lisp 语言源代码字符串拆分成有意义的 tokens。

  3. 使用JavaScript语言实现迷你版本的编译器(三)-语法分析 这个章节将会讲述怎么讲 tokens 转换为描述代码语法的属性结构,这种结构通常称为抽象语法树 (Abstract Syntax Tree)。

  4. 使用JavaScript语言实现迷你版本的编译器(四)-抽象语法树转换 这个章节主要是学习怎么样去遍历 AST ,并且根据我们的需求将 LISP 语言的抽象语法树转换成 JavaScript 语言的抽象语法树。

  5. 使用JavaScript语言实现迷你版本的编译器(五)-目标代码生成 这个章节主要学习怎么样将 JavaScript 抽象语法树转换成 JavaScript 的源代码。

  6. 使用JavaScript语言实现迷你版本的编译器(六)-项目总结 最后一章我们将回顾整个项目,总结下学习的关键点。

每个章节都会包含专业名词解释、代码编写、详细的代码解读以及实例。 读者可以逐步了解编译器的各个组成部分,同时可以选择性地学习自己感兴趣的部分。

6. 附录

6.1 项目涉及到的相关术语

  1. 源代码 (Source Code)
    • 编写的程序代码,通常为高级语言,如C、Java或Python等。
  2. 目标代码 (Target Code)
    • 编译器转换后的代码,可能是机器码、字节码或另一种高级语言。
  3. 词法分析 (Lexical Analysis)
    • 将源代码分解成基本构建块或令牌(tokens)的过程。
  4. 语法分析 (Syntax Analysis)
    • 使用词法单元构建抽象语法树(AST),确定程序的结构。
  5. 语义分析 (Semantic Analysis)
    • 检查语法树是否有意义,包括类型检查和变量解析。
  6. 抽象语法树 (Abstract Syntax Tree, AST)
    • 代码的树状结构表示,用于表示语法结构。
  7. 中间代码生成 (Intermediate Code Generation)
    • 生成一种独立于机器语言的中间表示,便于进一步优化。
  8. 代码生成 (Code Generation)
    • 将优化后的中间代码转换为目标代码。

6.2 学习资料

6.2.1 书籍

  • Compilers: Principles, Techniques, and Tools_ by Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman (龙书英文版)
  • 《编译原理及实践》作者:Kenneth C.Louden,人民邮电出版社。这本书适合初学者,讲解清晰,有很多实例。
  • 《编译原理》(原书第2版)作者:Alfred V.Aho 等,机械工业出版社。这是龙书的中文版,是编译原理领域的经典教材。

6.2.2 在线课程

  • 清华大学出品的《编译原理》课程,可以在中国大学MOOC(慕课)平台上找到。
  • 北京大学的《编译原理》课程也在中国大学MOOC平台上开设。

在学习编译原理时,结合国内外的资源,可以更好地理解和掌握这门课程的知识。不过,由于编译原理本身具有一定的抽象性和复杂性,因此在学习过程中,多实践、多思考、多交流是非常重要的。