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

08|基于TypeScript的虚拟机(一):实现一个简单的栈机

你好,我是宫文学。
上一节课,我们已经探讨了设计一个虚拟机所要考虑的那些因素,并做出了一些设计决策。那么今天这一节课,我们就来实现一个初级的虚拟机。
要实现这个初级虚拟机,具体来说,我们要完成下面三方面的工作:
首先,我们要设计一些字节码,来支持第一批语言特性,包括支持函数、变量和整型数据的运算。也就是说,我们的虚拟机要能够支持下面程序的正确运行:
//一个简单的函数,把输入的参数加10,然后返回
function foo(x:number):number{
return x + 10;
}
//调用foo,并输出结果
println(foo(18));
第二,我们要做一个字节码生成程序,基于当前的 AST 生成正确的字节码。
第三,使用 TypeScript,实现一个虚拟机的原型系统,验证相关设计概念。
话不多说,开搞,让我们先设计一下字节码吧!

“设计”字节码

说是设计,其实我比较懒,更愿意抄袭现成的设计,比如 Java 的字节码设计。因为 Java 字节码的资料最充分,比较容易研究,不像 V8 等的字节码,只有很少的文档资料,探讨的人也很少。另外,学会手工生成 Java 字节码还有潜在的实用价值,比如你可以把自己的语言编译后直接在 JVM 上运行。那么我们就先来研究一下 Java 字节码的特点。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了基于TypeScript的虚拟机实现的技术挑战和设计方案。作者借鉴了Java字节码的设计,提出了自己的字节码设计方案,并通过代码示例展示了字节码生成过程。文章详细介绍了虚拟机执行引擎的实现原理,以及函数调用和返回的过程,涵盖了调用约定和ABI的相关概念。通过对字节码设计的讨论,读者能够深入了解基于TypeScript的虚拟机实现的技术特点和实现思路。本文为技术人员提供了宝贵的实践经验和思路,对于理解虚拟机实现过程具有重要参考价值。文章还提到了设计并实现了一个简单的基于栈机的虚拟机,介绍了栈机指令、字节码生成过程以及虚拟机执行引擎的运行原理。通过对BCModule中的常量表和函数符号的讨论,读者可以思考函数符号作为常量的潜在用途。整体而言,本文内容丰富,对于虚拟机实现和字节码设计感兴趣的读者具有重要参考价值。

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

全部留言(5)

  • 最新
  • 精选
  • ifelse
    学习打卡
    2022-09-13归属地:浙江
  • 罗 乾 林
    看了老师后面的课程来回答一下: 可以在运行期来显示错误信息 把函数名称和函数签名的信息加进去,会有利于我们实现多模块的运行机制。也就是说,如果一个模块中的函数要调用另一个模块中的函数,那么我们可以创造一种机制,实现模块之间的代码查找。
    2021-09-02
  • 有学识的兔子
    函数符号被看作常量,是不是因为函数符号类似于函数地址,跟字符串常量和数字常量一样都不可以被更改? 这些符号信息是不是在需要调试或追踪程序运行信息时,方便了解程序运行的上下文信息?
    2021-08-29
  • 奋斗的蜗牛
    回答一下思考题,符号表信息可以实现函数式编程的支持
    2021-08-26
  • bjuthang
    赞👍
    2021-08-25
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部