从0到1的解释器

120 阅读2分钟

编译器与解释器

众所周知,计算机只认识0、1这样的机器码。要想让代码运行起来,代码转换成计算机能看懂的机器语言,这个机器语言称为机器码。从低级语言发展到现在高级语言,计算机产出了编译器、解释器的技术。

低级语言

汇编语言说得上最能接近机器码。汇编语言是二进制指令的文本形式,与指令是一一对应的关系。 如下图: image.png

高级语言

高级语言更易于人类阅读,更远离机器。比如使用Javascript 编写1 + 1的示例,如下:

image.png

编译器

高级语言编写的程序转换成机器码,将人可读的代码转换成计算机可读的机器码。

过程

源码 -> 词法分析 -> 语法分析 -> 语义分析 -> 中间码生成 -> 代码优化 -> 目标代码生成

image.png

解释器

一种计算机程序,它将每个高级程序语句转换成机器代码

过程

源码 -> 词法分析 -> 语法分析 -> 语义分析 -> 执行

image.png

实现

知道解释器大概的原理,就可以实现一个自己的解释器。ast抽象树结构可参考javascript,可通过 AST工具查看。

词法分析

词法分析指的是计算机科学中将字符序列转换为记号(token)序列的过程。如下代码:

let test = 0

经过词法分析,let 、test将会拆成一个一个token。 如图:

image.png

思路实现

将把代码看成字符串,声明两个索引,一个读取当前字符position,另一个则是读取下一个字符readPosition,当遇到readPosition遇到空格,则用切片input[position,readPosition]获取一个token,声明不同类型的token。

语法分析

根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。 如图:

image.png 右边的树形结构,则是为AST抽象树。

思路实现

通过词法分析后,则获取到一个数组的token,而语法分析则是将这个token数组,转换成AST抽象树。声明两个索引,一个读取当前token的position,另一个则是读取下一个token的readPosition,进行扫描数组,查找到AST结构。

示例

源码:

let test = 0

抽象树结构:

let <identifier> = <expression>;

当position遇到let的token,去判断下一个readPosition的token是否符合identifier类型的token,一层层判断是否符合抽象树。

image.png

eval执行

有了AST抽象树,下一步就是让这个AST执行,用从上而下递归,根据不同类型的AST抽象树去执行。例如:

源码:

6 * 6

抽象树:

<expression> <infix operator> <expression>

image.png

简单解释器代码