WebAssembly的前生今世

1.先从Javascript说起

上帝花了7天时间创造了世界,Brendan Eich大神在1995年花了10天时间创造了Javascript。在这里插入图片描述

为什么Javascript被设计为解释型语言?

Javascript的初衷是面向非专业编程人员和设计师的,因此大神认为不应该让这些不专业的人理解编译器这么专业的概念。

解释型语言 vs. 编译型语言

这两个概念其实不太严谨,应该改为“主流实现为解释器的语言”和“主流实现为编译器的语言”更为妥当。事实上很多语言采用的是混合型实现,比如Java需要先编译成字节码,而虚拟机又是解释执行的,执行过程中又会用到JIT即时编译,因此很难说它到底属于哪一种类型的语言。实际上,编译型和解释型最大的区别在于是否保存和复用生成的目标代码(不管是存在磁盘还是内存),编译型会,而解释型则是逐条执行,用完就扔。因此,这里主要讨论编译器和解释器。

编译器的一般实现参见下图:
在这里插入图片描述
现代编译器一般可以分为前端和后端:前端主要负责词法分析、语法分析、语义检查等工作,并输出中间代码(为了跨平台)。而后端则负责根据把中间代码转换为目标机器代码,并进行代码优化。所以,编译器的输入是所有代码,最终输出的是目标代码,仅需编译一次,后面就可以多次运行。

解释器则略有不同,一般实现参见下图:
在这里插入图片描述
早期的解释器只需要经过词法分析和语法分析,生成抽象语法树AST,就可以送入“树遍历型解释器”执行并输出最终结果了。(esprima网站上可以查看生成的AST结果)

但是后来大家发现,直接解释执行AST这种树形结构效率比较低,如果把AST转换成一种线性结构再执行效果会更好,这就是字节码。所以简单来说,字节码就是AST的后序遍历结果,而执行字节码的程序则被称为虚拟机(VM)。

虚拟机的实现多种多样,最常规的做法就是一行一行地解释执行,但是如果遇到循环的话效率就比较低了,需要一遍又一遍地解释执行。当然,你也可以先编译再执行,但是由于编译优化比较耗时,如果某段代码只需要执行一遍的话,就又得不偿失了。有没有什么办法能结合这两种方式的优点呢?还真有,这就是JIT。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值