从0到1的解释器

编译器与解释器

众所周知,计算机只认识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 <identifier> = <expression>;

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPBwaI3K-1669526739601)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b43f6599748a4e29a002cbc2c702b639~tplv-k3u1fbpfcp-watermark.image?)]

eval执行

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

源码:

6 * 6

抽象树:

<expression> <infix operator> <expression>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-svapJs1k-1669526739601)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/aaa51ff04b2a4227bc53de65e471177e~tplv-k3u1fbpfcp-watermark.image?)]

简单解释器代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天也想MK代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值