关闭

WebAssembly的过去、现在和未来

时间: 2018-12-15阅读: 2210标签: 语言

历史


在每个浏览器里面,无论Chrome,Firefox,Safari,Edge,能够运行的语言就是JavaScript。为了能够让其他语言的代码浏览器中运行,WebAssembly被创造出来。它拥有更好性能,更小的size,能够更快的加载和执行。我们无需编写WebAssembly的代码,只需要将其他高级语言编译成WebAssembly,这样就能在浏览器中复用大量的其他语言现有的代码。

WebAssembly仍在持续的发展,还有大量的特性即将到来。其最早发明出来是为了将C++的转译成js,然后在浏览器中运行起来,这样就能把大量现有的C++代码在浏览器中复用。被转译后的js代码比原生的JS代码要慢,Mozilla的工程师发现一种类型系统,可以让被转译后的JS运行得更快,这就是asm.js. 同时,其他浏览器厂商发现asm.js的运行速度非常快,也把这种优化加入到他们的浏览器引擎中。这仅仅是开始,工程师们仍在持续努力,但是,不是将其他语言编译成JS,而是一种新的语言,那就是WebAssembly。


最小可用产品


WebAssembly不仅仅支持C/C++,同时也希望支持更多的高级语言,因此,需要一个语言无关的编译目标,就像汇编语言一样,支持任何语言编译成汇编语言。这个编译目标有如下的特点:

  1. 跟具体的平台无关,因此不同平台的不同浏览器都能运行WebAssembly。
  2. 拥有足够快的运行速度,能够带来足够流畅的交互体验。
  3. 加载速度要足够快,因此,需要编译目标能够被压缩,减小加载内容的大小
  4. 能够手动的管理,分配内存。我们知道C/C++一类的语言支持指针的特性,通过指针可以读写特定地址的内存;为了安全考虑,还要对限制特定地址的内存进行操作。出于以上的亮点,WebAssembly使用了线性内存模型。

通过以上的特点,保证了WebAssembly能够在生产环境中使用起来。


如何应对繁重的桌面应用


我们知道,大量的桌面应用,像PS,AutoCAD,这些应用非常的庞大,对性能要求非常苛刻。要先让他们在浏览器里面运行起来非常的难,因此需要更多的特性来确保更佳的性能:

  1. 首当其冲的,是需要支持多线程。现代的计算机都是多核的,通过多线程能够更好的利用计算机的计算能力。
  2. SIMD(单指令多数据)。通过SIMD,能够将一组内存划分成不同的执行单元,就像多核一样。
  3. 64位寻址。借助64位寻址,能够使用更多的内存,这对一些内存敏感性的应用是非常有利的。
  4. 流式编译。前面提到了,提升加载的速度,其实我们有更好的办法,就是刚下载的时候就开始编译,这将是巨大的提升。
  5. HTTP缓存。如何两个浏览器加载相同的WebAssembly代码,将会编译成相同的机器码,因此可以将编译后的机器码保存在HTTP缓存中,这样就可以跳过编译的过程,复用机器码。


现状

  1. 多线程:一个草案已经接近完成,其中的关键SharedArrayBuffers,已经被否决了。
  2. SIMD:正在开发中...
  3. 64位寻址:wasm-64即将登场 
  4. 流式编译:Firefox已经在2017年支持,其他浏览器也即将支持

虽然这些特性仍在开发中,但是我们能够看到已经有大量的桌面应用在浏览器中运行起来,其中最大的幕后功臣就是WebAssembly。


WebAssembly与JavaScript


对于很多的web应用场景,我们可能只需要在一些性能敏感的部分,使用WebAssembly。因此,某些模块需要用WebAssembly来编写,然后替换掉那些JS写的部分。一个例子就是Firefox中的source map library的parser,它用WebAssembly编写,比原来用JS编写的快11倍。为了能让这种场景下,WebAssembly更好的发挥作用,有更多的要求:

  1. JS和WASM能够更快的相互调用。因为要将WASM代码作为模块继承到现存的JS应用中,需要他们能够更快的相互调用,Firefox中已经有了巨大的提升
  2. 快速而容易的数据转换。在JS和WASM相互调用时,需要传递数据,要想实现上面的两个目标,非常的难:WASM只理解数字,那就需要将各种数据格式转换成数字
  3. ES module。集成WASM模块,通常在JS中使用import,export关键词,因此,浏览器需要内置ES module。
  4. 工具链。在JS中,可以使用npm,brower等工具,但是在WASM中,好像没有这个工具...
  5. 兼容性。前端开发,都逃不了兼容性的问题。


现状

  1. Firefox中,JS和WASM能够很快的调用 
  2. 引用类型草案登场,其增加了一种新的,WASM函数能够接收和返回的类型,这个类型引用
  3. 一个外部的object,可以是JS的Object。 一个ES module的草案被提及,浏览器厂商正在支持。
  4. Rust生态的wasm-pack能够像npm一样支持包管理
  5. 借助wasm2js工具,能够让WASM在旧版的浏览器中得到支持

通过以上的特性以及正在开发中的功能,WASM的能力得到释放,接下来就是如何再现有的Web生态中使用WASM。


应用


前端开发中,大量涉及的框架及编译成JS的语言都将是WASM发挥作用的场景。所以就有两种选择了:1,使用WASM来重写现有的Web框架;2,将Reasonml,Elm等语言编译成WASM。为了实现这些功能,需要WASM提供更多高级语言的特性,包括:

  1. GC。首先,提供GC功能对重写web框架是非常有优势的。例如:使用WASM重写react中的diff功能,借助多线程,手动的内存分配,能够提供以前无法现象的高性能,但是当你跟JS 对象交互时,例如组件,仍然需要GC来减轻开发的负担。
  2. 异常处理。很多的高级语言,如C/C++提供异常处理,在某些特定场景下非常有用,同时JS也有异常处理,当WASM和JS互操作时,也需要有异常处理的支持。
  3. debug。这个就不多说


现状

  1. JS拥有Typed Objects 草案,WASM拥有GC草案。通过这两个草案,JS和WASM都能够清晰的知道一个对象的结构以及如何去存储,使用,回收。 
  2. 异常处理。目前还在开发阶段。
  3. debug。目前,大多数浏览器已经支持。


来自:https://studygolang.com/articles/16888


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/1596

关闭

JavaScript 与 Java、PHP 的比较

网站开发的实践从设计方面开始,包括客户端编程语言。大体上说,在网页设计中使用了三种语言:HTML,CSS和JavaScript。自从网站发明以来,HTML和CSS已经成为网页设计的基础,但是JavaScript被用于添加网站的动态视图。

学习编程开发_如何学习并掌握一门计算机编程语言

如果你有兴趣编写计算机程序,移动APP,网站,游戏或者任何软件,你应该学习编程。编程语言撰写的代码构建了计算机的程序。无论对于何种计算机编程语言,其核心编程思想都是一样的

JavaScript 的现状_以及对 JavaScript 的批评有哪些呢?

JavaScript 已经成为了一门一流的编程语言,使用 JavaScript 的程序员们正变得无所不能。质疑 JavaScript 是否是一种「真正的」编程语言的时代已经过去,现在的问题是,你有没有准备好投入到这门语言中,进行真正的学习。

五款面向未来的伟大编程语言

我们根据 RedMonk 与 TIOBE 等公司发布的数据,大胆宣称一部分编程语言在未来中长期内将注定步入失败。这篇文章发布之后引发轩然大波,这也让我们深刻进行了自省,并决定……写下这篇更为激进的续章

前端国际化的另类方式

一个项目发展到一定的环境或者一开始就是为多国打造的,就需要考虑国际化了。简单来说,就是一套页面,多套语言。主要探讨了两种完全不同的国际化方式,前一种主流,后一种完全属于另类,但还是有用武之地的。如果你的页面不太复杂,完全可以采取这种方式。

一种全新的、用户友好的超级计算机编程语言

当今唯有超级计算机才有足够的计算能力来应对科学研究中那些最顶尖的挑战,但在这些超级机器上进行编程却很艰难,这对科学探索而言是一种阻碍。几十年前,计算机也曾成本昂贵、操作复杂、数量稀少。

学习你的第一门编程语言

好的,决定好想学什么编程语言了吗,现在就让我们开始学习吧。所有你需要做的就是打开一本书,然后开始阅读,是这样的吗?

JavaScript 程序员可以从C++中学到什么

C++ 这样的低级语言和 JavaScript 这类高级语言之间的一些差异。我也希望它能够为你提供一种工具,以 TypeScript 或 PropTypes 的形式将 C++ 中的一些好处带入 JavaScript,并可以影响和改进 JavaScript 中的内存管理。

JavaScript 是真正的 OOP 语言吗?

我知道,这个话题已经被讨论过太多次了。但是,它总是被不断地提及。每当Java或C#或任何其他OOP语言的开发人员与JavaScript接触时,这些开发人员都会抱怨连连。他们说,用JavaScript工作简直是一团乱

微软推出新编程语言 Bosque,超越结构化程序设计

微软近期推出了一款全新的编程语言 Bosque,该语言参考了 TypeScript 的语法与类型,还有 ML 和 Node/JavaScript 的语义。作者微软计算机科学家 Mark Marron 致力于消除编程过程中出现的各种复杂情况,创造出了他认为超越主流结构化程序设计的 Bosque 这一语言。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!