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

10|基于C语言的虚拟机(一):实现一个简单的栈机

你好,我是宫文学。
到目前为止,我们已经用 TypeScript 实现了一个小而全的虚拟机,也在这个过程中稍微体会了一下虚拟机设计的一些要点,比如字节码的设计、指令的生成和栈机的运行机理等等,而且我们还通过性能测试,也看到了栈机确实比 AST 解释器的性能更高。
虽然,上面这些工作我们都是用 TypeScript 实现的,但既然我们已经生成了字节码,我不由地产生了一个想法:我们能不能用 C 语言这样的更基础的语言来实现一个虚拟机,同样来运行这些字节码呢?
我这样的想法可不是凭空产生的。你看,字节码最大的好处,就是和平台无关的能力。不管什么平台,只要有个虚拟机,就可以运行字节码,这也是安卓平台一开始选择字节码作为运行机制的原因。你甚至也可以来试一试,假设现在时间回到智能手机刚出现的时代,你是否也能够快速设计一个虚拟机,来运行手机上的应用呢?
那么进一步,在这种移动设备上运行的应用,很重要的功能就是去调用底层操作系统的 API。用 C 和 C++ 实现的虚拟机,显然在这方面有优势,能够尽量降低由于 ABI 转换所带来的性能损失。
所以,这一节课,我就带你用 C 语言重新实现一遍虚拟机。在这个过程中,你会对字节码文件的设计有更细致的体会,对于符号表的作用的理解也会加深,也会掌握如何用 C 语言设计栈桢的知识点。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了使用C语言实现一个简单的栈机虚拟机的过程。作者首先讨论了字节码的设计和文件格式,强调了字节码的平台无关性和与底层操作系统API的交互优势。接着,详细讨论了保存到字节码文件中的信息,包括函数的字节码、本地变量数量和操作数栈的最大尺寸等。此外,还提到了在字节码文件中保存常量信息和类型信息的必要性。作者还展示了如何用BCModuleWriter和BCModuleReader来实现字节码文件的写入和读取。另外,文章还介绍了用C语言实现栈机的过程,包括设计运行栈的数据结构、操作数栈以及解释执行字节码。最后,文章提到了C语言版本的栈机性能比较低的问题,并留下了思考题,引发读者对虚拟机设计上的重要因素产生更深入的了解。整体而言,本文内容丰富,对于想要了解虚拟机实现细节的读者具有很高的参考价值。

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

全部留言(4)

  • 最新
  • 精选
  • 罗 乾 林
    程序运行过程中栈帧频繁生成释放,直接通过malloc/free 创建释放造成性能问题。可以通过自定义内存分配器来解决

    作者回复: 方向很对!

    2021-08-30
    2
  • qinsi
    之前实现一个玩具jvm的时候做过profile,性能瓶颈在内存分配上。这个vm也要做下profile分析下

    作者回复: 很靠谱!

    2021-08-30
    1
  • ifelse
    学习打卡
    2022-09-14归属地:浙江
  • Geek_b52974
    看了一下 createStake function 每次都会做 melloc ,造成瓶颈,相较之下用 node.js 的stack 是用 slice 储存一开始就有一个预设的cap,扩容策略也是一次增加不只一个虽然可能浪费一些空间但是效率高很多
    2022-03-27
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部