初探webAssembly | 京东物流技术团队

这篇具有很好参考价值的文章主要介绍了初探webAssembly | 京东物流技术团队。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 WebAssembly是什么?

一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果

W3C WebAssembly Community Group开发的一项网络标准,对于浏览器而言,WebAssembly 提供了一条途径,让各种语言编写的代码以接近原生的速度在 Web 中运行。在这种情况下,以前无法以此方式运行的客户端软件等都将可以运行在 Web 中。

WebAssembly 设计之初就决定和 JavaScript 一起协同运行——通过JavaScript 中的 WebAssembly API,可以把 WebAssembly 模块加载到一个 JavaScript 应用中并且在两者之间互相调用。这样可以在同一个应用中使用 WebAssembly 的高性能及 JavaScript 的高灵活性。

2 为什么需要WebAssembly?

众所周知JavaScript是解释型语言,相比于编译型语言需要在运行时转换,所以解释型语言的执行速度要慢于编译型语言。

编译型语言和解释型语言代码执行的具体流程如下:

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

因为解释型语言每次执行都需要把源码转换一次才能执行,而转换过程非常耗费时间和性能,也就导致在JavaScript背景下,web无法执行一些高性能应用,如图片剪辑、视频剪辑、3D游戏等。

根据MDN的定义,WebAssembly是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如C / C ++等语言提供一个编译目标,以便它们可以在Web上运行。它也被设计为可以与JavaScript共存,允许两者一起工作。

3 WebAssembly的工作原理

WebAssembly不被解释,而是由开发者提前编译为WebAssembly二进制格式,如下图所示。由于变量类型都是预知的,因此浏览器加载WebAssembly文件时,JavaScript引擎无须监测代码。它可以简单地将这段代码的二进制格式编译为机器码。

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

如果将每种编程语言都直接编译为机器码的各个版本,那么效率会很低。编译器中称为前端的部分会将所编写的代码编译为一种中间表示(intermediate representation,IR)。创建好IR代码后,编译器的后端部分会接收IR代码,对其进行优化,然后将其转换为所需要的机器码。

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

由于浏览器可以在若干不同的处理器(比如桌面计算机、智能手机和平板设备)上运行,因此为每个可能的处理器发布一个WebAssembly代码的编译后版本会非常繁复。替代方法即取得IR代码,并通过一个专门的编译器来运行,这个编译器将IR代码转换为一种专用字节码并放入后缀为.wasm的文件中。此时wasm文件中的字节码还不是机器码,它只是支持WebAssembly的浏览器能够理解的一组虚拟指令。当加载到支持WebAssembly的浏览器中时,浏览器会验证这个文件的合法性,然后这些字节码会继续编译为浏览器所运行的设备上的机器码。如下图

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

WebAssembly被设计为JavaScript的一个组件,不是它的替代品。虽然有些开发者试图只用WebAssembly来创建整个网站,但这不是普遍情况。一般情况JavaScript仍然是更好的选择。

4 WebAssembly模块内部

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

模块中不同段的含义说明:

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

编译器负责生成WebAssembly模块的段,并将它们按照适当顺序放置。

所有的段都是可选的,因此可能存在空模块。

如果指定了已知段,那么它们只能出现一次并且要按照特定顺序出现。

自定义段可以放置在已知段之前、之间或之后,用于指定不适用已知段的数据。

5 哪些语言可用来创建WebAssembly模块?

现在WebAssembly的最小可行性版本(Minimum Viable Product,MVP)还没有垃圾回收(garbage collection,GC),他限制了一些语言的使用。GC作为一种后MVP功能正在开发中,实现之前,有几种语言正在试验WebAssembly支持,方式是将自己的VM编译到WebAssembly,或者在某些情况下将自己的垃圾回收器包含进去。

以下语言正在试验或已经完成WebAssembly支持:

  • C和C++
  • Rust正致力于成为WebAssembly的首选编程语言。
  • AssemblyScript是一种新编译器,它用来将TypeScript转换为WebAssembly。
  • TeaVM是一个将Java转译到JavaScript的工具,现在也可以生成WebAssembly了。
  • Go 1.11为WebAssembly增加了一个试验性项目,其编译后的WebAssembly模块包含一个垃圾回收器。
  • Pyodide是Python的一个项目,其中包含了Python科学栈的核心包:Numpy、Pandas和matplotlib。
  • Blazor是微软的实验性项目,用于将C#引入WebAssembly。

更多列表关注github: WebAssembly支持列表

相关案例:

TeaVM:它可以将 JVM 字节码翻译成 JavaScript 和 WebAssembly

我们有一段时间后端开始做一些前端开发,但是结果有时并不尽如人意,关键就在于我们的后端开发人员对前端无论是框架还是语法还是规范,都不是非常了解。这是在所难免的,但是因为业务需要又不得不做。

TeaVM就为我们这种情况提供了一种解决方案,我们的后端开发人员依然使用自己熟悉的语言(java)进行开发。功能开发完成后再将_.class或_.jar文件通过TeaVM编译成wasm或JavaScript供浏览器加载调用。

git:https://github.com/konsoletyper/teavm

官网:https://teavm.org/

6 WebAssembly可以用在哪?

目前大多数浏览器厂商都已经支持WebAssembly,包括Chrome、Edge、Firefox和Safari。移动端Web浏览器也同样支持。Node.js也从版本8开始支持。

WebAssembly不是JavaScript的替代品,而是它的一个补充,有些情况下WebAssembly是更好的选择,有些情况下使用JavaScript会是一个更优的方案。与JavaScript在同一个VM运行可让两种技术相辅相成。

WebAssembly为非JavaScript的开发者提供了一个新的道路,帮助他们在web中使用自己编写的代码。也让不了解C或C++等语言的web开发者可与访问更新、更快的库。个人理解WebAssembly也可用来优化某些库的执行速度。

6.1 一些使用webAssembly的案例

Figma — 基于浏览器的多人实时协作 UI 设计工具:https://www.figma.com/

Google Earth https://earth.google.com/ - 17年开始支持在FireFox打开,主要依赖webAssembly。之前使用Native Client导致只能在chrome中运行

Magnum — 跨平台的 OpenGL 图形引擎https://github.com/mosra/magnum

Egret Engine - 一款HTML5游戏引擎https://github.com/egret-labs/egret-core/

Web-DSP — 使用浏览器就能即时制作多媒体影音特效https://github.com/shamadee/web-dsp

7 WebAssembly怎么用?

7.1 得到wasm文件手动引入

var importObject = {
  imports: {
      imported_func: function(arg) {
        console.log(arg);
      }
    }
  };
  // 输出 42
  fetch('simple.wasm')
  .then(res =>
    res.arrayBuffer()
  ).then(bytes =>
    WebAssembly.instantiate(bytes, importObject)
  ).then(results => {
    results.instance.exports.exported_func();
  });

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

7.2 得到编译好的npm包引入执行

// alert(`Hello, ${name}`)
const js = import("./node_modules/@jdl/hello-wasm/hello_wasm.js");
js.then(js => {
  js.greet("WebAssembly");
});

初探webAssembly | 京东物流技术团队,前端,wasm,webassembly,前端

以下为hello_wasm.js文件编译前源码

// rust
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern {
    pub fn alert(s: &str);
}

#[wasm_bindgen]
pub fn greet(name: &str) {
    alert(&format!("Hello, {}!", name));
}

本文从为什么需要WebAssembly、WebAssembly的工作原理、哪些语言可用来创建WebAssembly模块、WebAssembly可以用在哪里 以及 怎么使用 几方面简要介绍了webAssembly。如果之前没有了解过webAssembly,可以做一些简要的了解。

参考文献

《WebAssembly 实战》 —- C. 杰勒德·加伦特

编译 Rust 为 WebAssembly - WebAssembly | MDN

作者:京东物流 潘维高

来源:京东云开发者社区 自猿其说Tech文章来源地址https://www.toymoban.com/news/detail-615948.html

到了这里,关于初探webAssembly | 京东物流技术团队的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 实战:工作中对并发问题的处理 | 京东物流技术团队

    实战:工作中对并发问题的处理 | 京东物流技术团队

    1. 问题背景 问题发生在快递分拣的流程中,我尽可能将业务背景简化,让大家只关注并发问题本身。 分拣业务针对每个快递包裹都会生成一个任务,我们称它为 task。task 中有两个字段需要关注,一个是分拣中发生的 异常(exp_type) ,另一个是分拣任务的 状态(status) 。另

    2024年02月12日
    浏览(7)
  • 破局主键重复问题的坎坷路 | 京东物流技术团队

    破局主键重复问题的坎坷路 | 京东物流技术团队

    伴随着业务的不断发展,逐渐由单库单表向分库分表进行发展。在这个过程中不可避免的一个问题是确保主键要的唯一性,以便于后续的数据聚合、分析等等场景的使用。在进行分库分表的解决方案中有多种技术选型,大概分为两大类客户端分库分表、服务端分库分表。例如

    2024年02月10日
    浏览(8)
  • 快速理解DDD领域驱动设计架构思想-基础篇 | 京东物流技术团队

    快速理解DDD领域驱动设计架构思想-基础篇 | 京东物流技术团队

    本文与大家一起学习并介绍领域驱动设计(Domain Drive Design) 简称DDD,以及为什么我们需要领域驱动设计,它有哪些优缺点,尽量用一些通俗易懂文字来描述讲解领域驱动设计,本篇并不会从深层大论述讲解落地实现,这些大家可以在了解入门后再去深层次学习探讨或在后续进阶

    2024年02月09日
    浏览(6)
  • 库存预占架构升级方案设计-交易库存中心 | 京东物流技术团队

    库存预占架构升级方案设计-交易库存中心 | 京东物流技术团队

    伴随物流行业的迅猛发展,一体化供应链模式的落地,对系统吞吐、系统稳定发出巨大挑战,库存作为供应链的重中之重表现更为明显。近三年数据可以看出: 接入商家同比增长37.64%、货品种类同比增长53.66% 货品数量同比增长46.43%、仓库数量同比增长18.87% 通过分析过往大促

    2024年02月11日
    浏览(35)
  • SpringCloud-Hystrix服务熔断与降级工作原理&源码 | 京东物流技术团队

    SpringCloud-Hystrix服务熔断与降级工作原理&源码 | 京东物流技术团队

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这

    2024年02月14日
    浏览(9)
  • CRM系统化整合从N-1做减法实践 | 京东物流技术团队

    CRM系统化整合从N-1做减法实践 | 京东物流技术团队

    京销易系统已经接入大网、KA以及云仓三个条线商机,每个条线商机规则差异比较大,当前现状是独立实现三套系统分别做支撑。 2022年下半年CRM目标是完成9个新条线业务接入,完成销售过程线上化,实现销售规则统一。 前端实现数据存储与逻辑代码耦合一起,无法复用,无

    2024年02月15日
    浏览(11)
  • 四层负载均衡的NAT模型与DR模型推导 | 京东物流技术团队

    四层负载均衡的NAT模型与DR模型推导 | 京东物流技术团队

    本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理。通过本文可以了解到四层负载均衡的技术特点、NAT模型和DR模型的工作原理、以及NAT模型和DR模型的优缺点。读者可以重点关注NAT模型到DR模型演进的原因(一种技

    2024年02月10日
    浏览(7)
  • 从iOS App启动速度看如何为基础性能保驾护航 | 京东物流技术团队

    从iOS App启动速度看如何为基础性能保驾护航 | 京东物流技术团队

    启动是App给用户的第一印象,一款App的启动速度,不单单是用户体验的事情,往往还决定了它能否获取更多的用户。所以到了一定阶段App的启动优化是必须要做的事情。App启动基本分为以下两种 App 点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动的

    2024年02月15日
    浏览(9)
  • Flink测试利器之DataGen初探 | 京东云技术团队

    Flink测试利器之DataGen初探 | 京东云技术团队

    Flink SQL 是基于 Apache Calcite 的 SQL 解析器和优化器构建的,支持ANSI SQL 标准,允许使用标准的 SQL 语句来处理流式和批处理数据。通过 Flink SQL,可以以声明式的方式描述数据处理逻辑,而无需编写显式的代码。使用 Flink SQL,可以执行各种数据操作,如过滤、聚合、连接和转换

    2024年02月07日
    浏览(6)
  • 从传统物流到智能物流:人工智能技术的发展

    作者:禅与计算机程序设计艺术 随着人工智能技术的快速发展,智能物流逐渐成为人们关注的热门话题。智能物流是指利用人工智能技术对物流系统进行优化和升级,以提高物流系统的效率和降低物流成本。本文将从技术原理、实现步骤、应用示例和优化改进等方面,深入探

    2024年02月07日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包