2019 年 12 月 5 日,WebAssembly正式加入 HTML、CSS 和 JavaScript 的 Web 标准大家庭。很多事情都会受益于这一全新的标准,并且它在浏览器中的性能表现是空前的。

WebAssembly的诞生背景

1995 年,布伦丹·艾希(Brendan Eich)用了不到 10 天就创建了 JavaScript。那时,JavaScript 的设计并非以速度见长。它基本上是用于表单验证的,同时速度非常缓慢。随着时间的流逝,它也在一天天变好。

在 2008 年,异军突起的谷歌推出了自己全新的浏览器 Chrome。Chrome 内部有一个名为 V8 的 JavaScript 引擎,V8 的革命性进步是对 JavaScript 的即时(JIT)编译。从解释代码到 JIT 编译的这种转变大幅提升了 JavaScript 的性能,从而让整个浏览器的速度变得飞快。如此快的速度将催生 Node.js或 Electron 等技术,并推动 JavaScript 迎来爆炸式增长。

在 2015 年,WebAssembly首次发布,并提供了一个运行在 Unity 下的游戏的小型演示。这款游戏是直接在浏览器中运行的。

在 2019 年,W3C 使 WebAssembly成为了新的 Web 标准。就像 V8 引擎一样,WebAssembly即将带来全新的性能革命。它的身影已经出现在了 Web 的赛道上,枪声一响便遥遥领先。

什么是 WebAssembly?

WebAssembly(缩写为 wasm)是一种使用非 JavaScript 代码,并使其在浏览器中运行的方法。这些代码可以是 C、C++ 或 Rust 等。它们会被编译进你的浏览器,在你的 CPU 上以接近原生的速度运行。这些代码的形式是二进制文件,你可以直接在 JavaScript 中将它们当作模块来用。

WebAssembly不能替代 Javascript,相反,这两种技术是相辅相成的。通过 JavaScript API,你可以将 WebAssembly模块加载到你的页面中。也就是说,你可以通过 WebAssembly来充分利用编译代码的性能,同时保持 JavaScript 的灵活性。

WebAssembly这个名字有点误导人,它确实适用于 Web,但它的使用场景远不止于此。此外,WebAssembly不是编程语言,它是一种中间格式,叫字节码,可以作为其他语言的编译目标。

它是如何工作的?

第一步:你使用 C、C++ 或其他语言生成源代码,这段代码应该可以解决某个问题,或者完成某段对浏览器中的 JavaScript 来说太过复杂的流程。

第二步:使用 Emscripten 将你的源代码编译为 WebAssembly,这一步完成时,你将得到一个 wasm文件。

第三步:你将在网页上使用这个 wasm文件,将来你可以像其他 ES6 模块一样加载这个文件。

下面以简单的代码示例来说明这个过程:

首先,你需要一小段 C++ 代码来编译。以下是一个添加两位数的函数:

int add(int firstNumber, int secondNumber) {return firstNumber + secondNumber;
}

接着转到你选择的 Linux 发行版。第一步是下载并安装 Emscripten:

安装依赖项(是的,你可以使用 python 的较新版本)

sudo apt-get install python2.7 git

通过一个 git 克隆获取 emscripten

git clone https://github.com/emscripten-core/emsdk.git

下载,安装并激活 sdk

cd emsdk
./emsdk install latest
./emsdk activate latestl
source ./emsdk_env.sh

确认安装的内容可以正常运行

emcc --version

将这个 c++ 文件编译到一个 webassembly 模板

emcc helloWebassembly.cpp -s WASM=1 -o helloWebassembly.html

启动 HTML 并观察结果

emrun helloWebassembly.html

如代码所示,这是极客处理 wasm 文件的办法。

接下来,将你的 C++ 代码放在左侧。然后,你将在 WAT 部分中获得导出函数的名称(_Z3addii),你只需点进 download ,就可以获取 wasm文件,非常简单。

现在,你就可以让 WebAssembly直接运行在浏览器中了,没有那么多麻烦的事情。

<html><head><title>WASM test</title><link rel="stylesheet" href="/stylesheets/style.css" /></head><body><script>const getRandomNumber = () => Math.floor(Math.random() * 10000);WebAssembly.instantiateStreaming(fetch("https://012q1.sse.codesandbox.io/wasm/add.wasm")).then(obj => obj.instance.exports._Z3addii).then(add => {document.getElementById("addTarget").textContent = add(getRandomNumber(),getRandomNumber());});</script><h1>Résultat du C++</h1><p id="addTarget"></p></body>
</html>

以上就是今天的内容,你可以点击原文链接了解完整的分享,希望能给你带来启发。
英文原文:https://www.jesuisundev.com/en/understand-webassembly-in-5-minutes/

asm.js 和 Emscripten 入门教程https://www.ruanyifeng.com/blog/2017/09/asmjs_emscripten.html

WebAssembly简介相关推荐

  1. webassembly_全球最简单的WebAssembly简介?

    webassembly by Martin Olsansky (olso) 由Martin Olsansky(olso) 全球最简单的WebAssembly简介? (The world's easie ...

  2. 通过 Serverless 加速 Blazor WebAssembly

    Blazor ❤ Serverless 我正在开发 Ant Design 的 Blazor 版本,预览页面部署在 Github Pages 上,但是加载速度很不理想,往往需要 1 分钟多钟才完成. 项 ...

  3. 《WebAssembly 权威指南》(7)WebAssembly 表

    本文是<WebAssembly 权威指南>系列文章第 7 篇,系列文章列表: <WebAssembly 权威指南>连载公告 <WebAssembly 权威指南>(1 ...

  4. python wasm_Go WebAssembly (Wasm) 简明教程

    Go WebAssembly (Wasm) 简明教程 1 WebAssembly 简介WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二 ...

  5. 代码实现sql编译器_TiDB-Wasm 原理与实现 | Hackathon 优秀项目介绍

    作者:Ti-Cool 上周我们推送了<让数据库运行在浏览器里?TiDB + WebAssembly 告诉你答案>,向大家展示了 TiDB-Wasm 的魅力:TiDB-Wasm 项目是 Ti ...

  6. 【科普文】JavaScript前世今生 and 安全隐患

    目录 ECMAScript javascript前世今生 版本 ES6 特性 引擎 V8 SpiderMonkey JavaScriptCore ChakraCore JScript JerryScr ...

  7. 浅谈WebAssmebly,在浏览器上进行图像处理

    浅谈WebAssmebly,在浏览器上进行图像处理 自从2008年各大浏览器为JavaScript执行引擎加入JIT(Just in Time, 即时编译器)以来,JavaScript在浏览器的执行性 ...

  8. WASM(WebAssembly)简介

    WASM WASM(WebAssembly)是一种低级别的字节码,可以运行在现代网页浏览器中.这种字节码被设计成与JavaScript紧密结合,使得通过JavaScript API 可以方便地调用WA ...

  9. 【LiveVideoStack线上分享】WebAssembly在Web多媒体领域的相关实践

    随着 Wasm 近些年来的不断发展,已经有越来越多的人开始尝试使用 Wasm 在各个子领域进行创新性实践,其中就不乏 Wasm 在 Web 音视频领域的相关实践.通过借助 Wasm 的高效字节码解析和 ...

最新文章

  1. php中rbac三张表的关系,thinkphp中RBAC数据表分析
  2. ELK环境搭建及client配置
  3. 在PHP中模拟asp的response类
  4. Java 10更新汇总,新的编译器通吃主流编程语言
  5. 增加外键时候的一个小错误
  6. ubuntu12.04配置双显示器
  7. Active Directory相关博客
  8. JQuery选择器中的可见性筛选
  9. c++ 返回数组中最大的值_Swift语言必学秘技:数组里面的使用方法
  10. Java微服务系统项目技术栈总结
  11. 智能陈桥输入法软件测试,智能陈桥拼音输入法
  12. 携程机票数据仓库建设之路
  13. 操作系统 第二章 进程的描述与控制(4)进程同步(重点)
  14. eversync safari_值得推荐的chrome书签同步插件汇总
  15. 关于《推背图》,《奇门遁甲》
  16. python面向对象思想汇报_思想汇报(二)——有关测试
  17. linux服务器http进程CPU异常飙高(轮为免费矿工)
  18. 物联网工程设计与实施知识点
  19. M估计(稳健估计)的matlab实现
  20. 9月25日,AWSUnitimes免费请您吃晚餐啦!

热门文章

  1. 物联网安全业务去哪里找?——拓展认知,增强技术,落地应用
  2. springCloud的了解(四)—分布式事务问题
  3. 中国java水平在全世界什么水平
  4. python小区停车练习题
  5. 读书笔记——《学习科学与技术》
  6. 芒果TV公司软件测试,perfdog-芒果tv视频-性能测试实践
  7. Python实现打字程序
  8. 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)
  9. 大佬们帮我看看这怎么弄
  10. 吴恩达deeplearning.ai系列课程笔记+编程作业(13)序列模型(Sequence Models)-第一周 循环序列模型(Recurrent Neural Networks)