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

09|基于TypeScript的虚拟机(二):丰富特性,支持跳转语句

你好,我是宫文学。
在上一节课里,我们已经实现了一个简单的虚拟机。不过,这个虚拟机也太简单了,实在是不够实用啊。
那么,今天这节课,我们就来增强一下当前的虚拟机,让它的特性更丰富一些,也为我们后续的工作做好铺垫,比如用 C 语言实现一个更强的虚拟机。
我们在这一节课有两项任务要完成:
首先,要支持 if 语句和 for 循环语句。这样,我们就能熟悉与程序分支有关的指令,并且还能让虚拟机支持复杂一点的程序,比如我们之前写过的生成斐波那契数列的程序。
第二,做一下性能比拼。既然我们已经完成了字节码虚拟机的开发,那就跟 AST 解释器做一些性能测试,看看性能到底差多少。
话不多说,开干!首先,我们来实现一下 if 语句和 for 循环语句。而实现这两个语句的核心,就是要支持跳转指令。

了解跳转指令

if 语句和 for 循环语句,有一个特点,就是让程序根据一定的条件执行不同的代码。这样一个语法,比较适合我们人类阅读,但是对于机器执行并不方便。机器执行的代码,都是一条条指令排成的直线型的代码,但是可以根据需要跳转到不同的指令去执行。
针对这样的差异,编译器就需要把 if 和 for 这样结构化编程的代码,转变成通过跳转指令跳转的代码,其中的关键是计算出正确的跳转地址
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

基于TypeScript的虚拟机的丰富特性和对跳转语句的支持是本文的重点。文章首先介绍了对虚拟机的简单实现不够实用的问题,并设定了增强虚拟机特性的目标。详细讲解了跳转指令的概念和在编译器中的应用,以及对if语句和for循环语句的支持所需的跳转指令。作者通过Java示例程序展示了if语句的字节码生成过程,并解释了有条件跳转指令和无条件跳转指令的作用。此外,文章还提到了goto语句的底层机制和与协程实现的关联。在升级字节码虚拟机方面,文章介绍了对跳转指令的支持和性能比拼,展示了TypeScript栈机在斐波那契数列计算中的性能提升。最后,文章提出了对虚拟机性能测试结果的思考,并鼓励读者分享和讨论。整体而言,本文深入浅出地介绍了虚拟机的丰富特性和对跳转语句的支持,为读者提供了深入理解虚拟机内部实现的知识。文章内容涵盖了虚拟机的设计、编译器的应用、跳转指令的生成和虚拟机性能测试等方面,适合对字节码虚拟机感兴趣的读者阅读学习。

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

全部留言(7)

  • 最新
  • 精选
  • 惜心(伟祺)
    从计算机执行的指令来看语言设计
    2022-11-17归属地:上海
  • ifelse
    满意,学习打卡
    2022-09-13归属地:浙江
  • chris
    文中关于分支和跳转指令的麻烦, 其实都是源于跳转目标是一个绝对地址, 如果设计成一个相对偏移的话, 其实就不存在了. 并且java字节码ifxxx和goto后面跟的也都是相对偏移. 这里不知道老师为什么要设计成绝对地址, 出于什么考虑?
    2021-09-01
    1
  • 闫志刚
    念念不忘,必有回响
    2021-09-01
  • pedro
    虚拟机的本质就是:在软件层面上再造物理机。 Java 字节码可以看作是对汇编的一种模仿、简化和实现。
    2021-08-29
  • 有学识的兔子
    是不是和老师提示的那样,使用C/C++来编写虚拟机,以获得转译和运行字节码上性能的提升。
    2021-08-29
  • qinsi
    因为最终是编译成js运行的,可以用node —prof看下有没有明显的性能瓶颈
    2021-08-28
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部