• 从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
    
    • 1

    经过词法分析,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
    
    • 1

    抽象树结构:

    let  = ;
    
    • 1

    当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
    
    • 1

    抽象树:

      
    
    • 1

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

    简单解释器代码

  • 相关阅读:
    Android Settings解析
    Linux系统编程:编译过程以及GDB调试
    Vatee万腾科技创新之路:Vatee的智能时代掌舵人
    Dapr中国社区活动之 分布式运行时开发者日 (2022.09.03)
    AI落地难?云原生助力企业快速应用机器学习 MLOps
    基于Python的IP地址转换
    4、android中级控件(2)(选择按钮)
    Metabase学习教程:系统管理-6
    EN 12259-2固定消防系统湿式报警阀组件—CE认证
    文件操作——IO(代码演示)
  • 原文地址:https://blog.csdn.net/weixin_42429220/article/details/128063398