众所周知,计算机只认识0、1这样的机器码。要想让代码运行起来,代码转换成计算机能看懂的机器语言,这个机器语言称为机器码。从低级语言发展到现在高级语言,计算机产出了编译器、解释器的技术。
汇编语言说得上最能接近机器码。汇编语言是二进制指令的文本形式,与指令是一一对应的关系。
如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLaCgOq1-1669526739598)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/86b5de51b26f4acc806996dbe68d7bd9~tplv-k3u1fbpfcp-watermark.image?)]
高级语言更易于人类阅读,更远离机器。比如使用Javascript 编写1 + 1的示例,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0MSYrUs-1669526739599)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cdd9ae9f75264bb4a41c64ac8615ca42~tplv-k3u1fbpfcp-watermark.image?)]
高级语言编写的程序转换成机器码,将人可读的代码转换成计算机可读的机器码。
源码 -> 词法分析 -> 语法分析 -> 语义分析 -> 中间码生成 -> 代码优化 -> 目标代码生成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kPUZuGA6-1669526739600)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6922257c61e54d92990bb61bf77a87b5~tplv-k3u1fbpfcp-watermark.image?)]
一种计算机程序,它将每个高级程序语句转换成机器代码
源码 -> 词法分析 -> 语法分析 -> 语义分析 -> 执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-69lqyLTk-1669526739600)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/027f3669d66a46d39c48816b2010dbfd~tplv-k3u1fbpfcp-watermark.image?)]
知道解释器大概的原理,就可以实现一个自己的解释器。ast抽象树结构可参考javascript,可通过
AST工具查看。
词法分析指的是计算机科学中将字符序列转换为记号(token)序列的过程。如下代码:
let test = 0
经过词法分析,let 、test将会拆成一个一个token。
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7J7FKlkm-1669526739600)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f193f72eed7549a8b5b23b2a033f3cc0~tplv-k3u1fbpfcp-watermark.image?)]
将把代码看成字符串,声明两个索引,一个读取当前字符position,另一个则是读取下一个字符readPosition,当遇到readPosition遇到空格,则用切片input[position,readPosition]获取一个token,声明不同类型的token。
根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XlYRqCAL-1669526739600)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e01a00b1d3374bdcabd466126ac98526~tplv-k3u1fbpfcp-watermark.image?)]
右边的树形结构,则是为AST抽象树。
通过词法分析后,则获取到一个数组的token,而语法分析则是将这个token数组,转换成AST抽象树。声明两个索引,一个读取当前token的position,另一个则是读取下一个token的readPosition,进行扫描数组,查找到AST结构。
源码:
let test = 0
抽象树结构:
let = ;
当position遇到let的token,去判断下一个readPosition的token是否符合identifier类型的token,一层层判断是否符合抽象树。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPBwaI3K-1669526739601)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b43f6599748a4e29a002cbc2c702b639~tplv-k3u1fbpfcp-watermark.image?)]
有了AST抽象树,下一步就是让这个AST执行,用从上而下递归,根据不同类型的AST抽象树去执行。例如:
源码:
6 * 6
抽象树:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-svapJs1k-1669526739601)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/aaa51ff04b2a4227bc53de65e471177e~tplv-k3u1fbpfcp-watermark.image?)]