简单学习WebAssembly和JavaScript在谷歌V8引擎中的运行过程(一)

WebAssembly和JavaScript(一)

前言

今年毕业设计中,涉及到了一部分WebAssembly和JavaScript的知识,其中主要是研究谷歌V8引擎实现WebAssembly的运行环境分析,我讲其中一部分整理后,用来记录。

随着互联网技术的发展,越来越多的应用程序转移到Web上。2008年异军突起的谷歌推出全新的Chrome浏览器,内部实现了名为V8的JavaScript 执行引擎,将JavaScript虚拟机技术推向了一个全新的高度,从而促使Node.js、Electron等JavaScript生态软件的不断涌现,并推动 JavaScript 迎来爆炸式增长。JavaScript所承担的作用也不只是设计之初那样简单的DOM交互,更多的是需要为图形处理,物理引擎和虚拟现实等计算密集型操作提供支持。然而以易用性为设计理念的JavaScript,即便引入即时编译技术后执行性能有了大幅提升,但优化及逆优化操作和额外的内存开销使其无法高效的应付功能繁杂的应用。
为了突破JavaScript的性能极限,2015年WebAssembly应运而生,2019 年W3C 使 WebAssembly成为了新的 Web 标准。就像谷歌V8 引擎一样,WebAssembly给Web技术的发展带来全新的性能革命。

一、WebAssembly的诞生背景

WebAssembly(WASM)是一种可以在浏览器中执行的语言。每次谈到WebAssembly就一定会说到其相较于JavaScript的性能优越性。在1995年JavaScript发布,其运行速度和本身所承担的任务只有基础的网页对象管理,并没有像今天一样应用到各种领域。在JavaScript发展的过程中,Just-In-Time(以下简称JIT)技术的诞生,使得JavaScript的性能显著提高,并且被用到之前从未设想到的领域,比如JavaScript被用于后端开发的Node.js。但这种迅猛发展的过程也暴露了JavaScript的一些问题。

  1. ·由于语法过于灵活,在开发大型的web项目时很困难; ·
  2. 需要用到的场景很多,性能可能没办法满足某些要求;

针对这两个问题,各个浏览器厂商开始群策群力,微软使用了Typescript技术,谷歌使用了Dort技术,火狐使用了asm.js技术。但是独臂难支,三大浏览器厂商提出的方案互不兼容,这就导致了难以推广的弊端,在这种情况下,WebAssembly诞生了。

二、WASM和JS的异同

JavaScript是一种基于对象(Object-Based)和事件驱动(Event-Driven)的,由浏览器解释执行的,具有安全性能的客户端编程语言。其具有以下几个特点:

  1. 脚本语言:采用的是小程序段的方式进行编程,以嵌入式与HTML标识结合;
  2. ·基于对象:对象是指客户机、浏览器、网页文档等,以控制对象而实现控制整个客户端;
  3. 简单:变量类型是弱类型,并未使用严格的数据类型;
  4. 安全:不允许访问服务器本地的硬盘,不允许对网络文档进行修改和删除,只能进行浏览或者交互,有效的防止了数据丢失的情况。
  5. 动态:可以直接对用户的输入操作做出反应,不用经过web服务程序,这也是由事件驱动的表现;
  6. 跨平台:JavaScript由浏览器解释执行,与操作环境无关,所以可移植性增强。

从官方定义出发,WebAssembly是一种可移植、体积小、加载快并且兼容 Web 的全新格式,这使其具有高效、安全、标准、开放等特点。我们可以通过下图看到WebAssembly的一些优势。

毫无疑问,WebAssembly拓展了开发者可用的编程语言,这意味着可以使用任何你熟悉的编程语言开发,并有着诸多对开发者友好的特点,例如:

  1. ·性能高效:WASM采用二进制编码,在程序执行过程中的性能优越; ·
  2. 存储成本低:相对于文本格式,二进制编码的文本占用的存储空间更小;
  3. 多语言支持:用户可以使用 C/C++/RUST/Go等多种语言编写智能合约并编译成.wasm格式的字节码。

此外,就应用开发而言,现在每一个操作系统之间的应用并不能完全互通,不同的开发语言适用于不同的操作系统,但如果将应用编译为WebAssembly,那么就可以应用于各个操作系统,这也是WebAssembly的ending定律,所有能够被编译成WebAssembly的终将被编译为WebAssembly。

三、WASM和JS简介

WebAssembly是一种新的字节码格式,它并非编程语言或者编译器技术,而是一份字节码标准,我们需要用高级编程语言,比如C、C++,来编译出字节码,放到WebAssembly虚拟机中才能运行。这说明WebAssembly是一种编译目标,具体可以类似参考高级语言进行编译时的“IR”来理解。也就是说,WebAssembly本质上是一种基于堆栈虚拟机的二进制指令格式,它可以被编译成各种硬件架构的机器语言。而浏览器厂商需要做的,就是根据WebAssembly规范实现虚拟机。

JavaScript是一种可以嵌入HTML文档的,基于对象并具有某些面向对象特征的编程语言。它是一种浏览器脚本语言,具备了脚本语言的优势,同时也是当前浏览器和网页前端开发的一个通用的重要工具。语言是一个在理解基本原理和实现方法过后,进行实现的基本手段。它一定具有优点和缺点。对于JavaScript而言,脚本语言自身的反应时间快,无需编译等都是其优点,而也正因为其无需编译,所以才导致了体量越大,反应时间达不到理想条件。

总结

这就是两者的前提介绍,了解了这个之后,我们开始创建WebAssembly模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值