编译器与解释器
众所周知,计算机只认识0、1这样的机器码。要想让代码运行起来,代码转换成计算机能看懂的机器语言,这个机器语言称为机器码。从低级语言发展到现在高级语言,计算机产出了编译器、解释器的技术。
低级语言
汇编语言说得上最能接近机器码。汇编语言是二进制指令的文本形式,与指令是一一对应的关系。
如下图:
高级语言
高级语言更易于人类阅读,更远离机器。比如使用Javascript 编写1 + 1的示例,如下:
编译器
高级语言编写的程序转换成机器码,将人可读的代码转换成计算机可读的机器码。
过程
源码 -> 词法分析 -> 语法分析 -> 语义分析 -> 中间码生成 -> 代码优化 -> 目标代码生成
解释器
一种计算机程序,它将每个高级程序语句转换成机器代码
过程
源码 -> 词法分析 -> 语法分析 -> 语义分析 -> 执行
实现
知道解释器大概的原理,就可以实现一个自己的解释器。ast抽象树结构可参考javascript,可通过 AST工具查看。
词法分析
词法分析指的是计算机科学中将字符序列转换为记号(token)序列的过程。如下代码:
let test = 0
经过词法分析,let 、test将会拆成一个一个token。 如图:
思路实现
将把代码看成字符串,声明两个索引,一个读取当前字符position,另一个则是读取下一个字符readPosition,当遇到readPosition遇到空格,则用切片input[position,readPosition]获取一个token,声明不同类型的token。
语法分析
根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。 如图:
右边的树形结构,则是为AST抽象树。
思路实现
通过词法分析后,则获取到一个数组的token,而语法分析则是将这个token数组,转换成AST抽象树。声明两个索引,一个读取当前token的position,另一个则是读取下一个token的readPosition,进行扫描数组,查找到AST结构。
示例
源码:
let test = 0
抽象树结构:
let <identifier> = <expression>;
当position遇到let的token,去判断下一个readPosition的token是否符合identifier类型的token,一层层判断是否符合抽象树。
eval执行
有了AST抽象树,下一步就是让这个AST执行,用从上而下递归,根据不同类型的AST抽象树去执行。例如:
源码:
6 * 6
抽象树:
<expression> <infix operator> <expression>