手把手带你写一门编程语言
宫文学
北京原点代码 CEO
7534 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
起步篇:让一门超简单的语言跑起来 (21讲)
结束语 (1讲)
手把手带你写一门编程语言
15
15
1.0x
00:00/00:00
登录|注册

07|怎么设计属于我们自己的虚拟机和字节码?

你好,我是宫文学。
到目前为止,我们的语言看上去已经有点像模像样了。但是有一个地方,我还一直是用比较凑合的方式来实现的,这就是解释器,这节课我想带你把它升级一下。
在之前的内容中,我们用的解释器都是基于 AST 执行的,而实际上,你所能见到的大多数解释执行的脚本语言,比如 Python、PHP、JavaScript 等,内部都是采用了一个虚拟机,用字节码解释执行的。像 Java 这样的语言,虽然是编译执行,但编译的结果也是字节码,JVM 虚拟机也能够解释执行它。
为什么这些语言都广泛采用虚拟机呢?这主要是由基于 AST 的解释器的不足导致的。今天这节课,我就带你先来分析一下 AST 解释器的缺陷,然后了解一下像 JVM 这样的虚拟机的运行原理,特别是栈机和寄存器机的差别,以便确定我们自己的虚拟机的设计思路。
看上去任务有点多,没关系,我们一步一步来,我们先来分析一下基于 AST 的解释器。

基于 AST 的解释器的缺陷

其实,我们目前采用的解释器,是一种最简单的解释器。它有时被称为“树遍历解释器”(Tree-walking Interpreter),或者更简单一点,也被叫做“AST 解释器”。
为什么我刚刚会说我们这个基于 AST 的解释器有点凑合呢?你可能会想通过遍历 AST 来执行程序不是挺好的吗?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了虚拟机和字节码的设计原理,首先介绍了栈机和寄存器机两种程序运行机制的区别,包括操作数的存储机制、指令格式和生成字节码的难度。接着讨论了设计虚拟机时需要考虑的关键技术决策,如选择栈机还是寄存器机、字节码设计、支持的数据类型以及实现语言的选择。文章强调了栈机的重要性,并提出了参考Java字节码设计的建议。最后,总结了本节课的重点,强调了对虚拟机设计思路的理清和设计决策的重要性。整体而言,本文为读者提供了对虚拟机和字节码设计的初步了解,并为进一步学习和实践打下基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 孤星可
    小弟用 Java 实现了 Java 虚拟机, 有兴趣可了解。 https://github.com/guxingke/mini-jvm
    2021-08-23
    6
  • Gaollard
    噢力给
    2023-04-04归属地:广东
  • ifelse
    Java,php都有虚拟机
    2022-09-12归属地:浙江
  • 大豆
    V8居然也是寄存器机,也难怪,它跟Android同一个爸爸。
    2021-08-23
  • 写点啥呢
    请问老师,lua的字节码执行我看到是每次执行压栈并且将结果值保存在栈顶(参考的5.4.2),我理解这算是栈机的实现,为什么说lua是基于寄存器虚拟机呢?
    2021-08-23
    2
  • quanee
    老师, 想问一下 Go 的 runtime 和 Plan9 与 Java 的 JVM 和 字节码有什么区别, 总感觉功能上差不多?
    2021-08-23
    3
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部