07|怎么设计属于我们自己的虚拟机和字节码?
宫文学
你好,我是宫文学。
到目前为止,我们的语言看上去已经有点像模像样了。但是有一个地方,我还一直是用比较凑合的方式来实现的,这就是解释器,这节课我想带你把它升级一下。
在之前的内容中,我们用的解释器都是基于 AST 执行的,而实际上,你所能见到的大多数解释执行的脚本语言,比如 Python、PHP、JavaScript 等,内部都是采用了一个虚拟机,用字节码解释执行的。像 Java 这样的语言,虽然是编译执行,但编译的结果也是字节码,JVM 虚拟机也能够解释执行它。
为什么这些语言都广泛采用虚拟机呢?这主要是由基于 AST 的解释器的不足导致的。今天这节课,我就带你先来分析一下 AST 解释器的缺陷,然后了解一下像 JVM 这样的虚拟机的运行原理,特别是栈机和寄存器机的差别,以便确定我们自己的虚拟机的设计思路。
看上去任务有点多,没关系,我们一步一步来,我们先来分析一下基于 AST 的解释器。
基于 AST 的解释器的缺陷
其实,我们目前采用的解释器,是一种最简单的解释器。它有时被称为“树遍历解释器”(Tree-walking Interpreter),或者更简单一点,也被叫做“AST 解释器”。
为什么我刚刚会说我们这个基于 AST 的解释器有点凑合呢?你可能会想通过遍历 AST 来执行程序不是挺好的吗?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了虚拟机和字节码的设计原理,首先介绍了栈机和寄存器机两种程序运行机制的区别,包括操作数的存储机制、指令格式和生成字节码的难度。接着讨论了设计虚拟机时需要考虑的关键技术决策,如选择栈机还是寄存器机、字节码设计、支持的数据类型以及实现语言的选择。文章强调了栈机的重要性,并提出了参考Java字节码设计的建议。最后,总结了本节课的重点,强调了对虚拟机设计思路的理清和设计决策的重要性。整体而言,本文为读者提供了对虚拟机和字节码设计的初步了解,并为进一步学习和实践打下基础。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》,新⼈⾸单¥59
《手把手带你写一门编程语言》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- 孤星可小弟用 Java 实现了 Java 虚拟机, 有兴趣可了解。 https://github.com/guxingke/mini-jvm2021-08-236
- Gaollard噢力给2023-04-04归属地:广东
- ifelseJava,php都有虚拟机2022-09-12归属地:浙江
- 大豆V8居然也是寄存器机,也难怪,它跟Android同一个爸爸。2021-08-23
- 写点啥呢请问老师,lua的字节码执行我看到是每次执行压栈并且将结果值保存在栈顶(参考的5.4.2),我理解这算是栈机的实现,为什么说lua是基于寄存器虚拟机呢?2021-08-232
- quanee老师, 想问一下 Go 的 runtime 和 Plan9 与 Java 的 JVM 和 字节码有什么区别, 总感觉功能上差不多?2021-08-233
收起评论