背景

由于js的灵活语法特定, 比如对象内的成员有很多种可能的类型, 导致JIT的优化效果变差.

如下图所示代码, 这里的sum 和a的每一个元素里面每一次计算前后,

从什么类型变成什么类型, 对于编译器来说,

难以一次确定下来, 于是JIT方式就无法在这里起到很好的优化效果.

Asm.js

2012年,Mozilla 的工程师 Alon Zakai 在研究 LLVM 编译器时产生的想法,

专门做了一个编译器项目 Emscripten。这个编译器可以将 C / C++ 代码编译成 JS 代码,

但不是普通的 JS,而是一种叫做 asm.js 的 JavaScript 变体

Javascript 去掉动态类型和垃圾回收之后, 就可以像C++一样快速生成机器码.

其实最大的瓶颈是动态类型, 垃圾回收去掉之后, 代码的稳定性会下降

asm.js 只提供两种数据类型, 32位整形,  64位浮点

data | 0表示整数,+data 表示浮点数

asm.js 在浏览器里的运行速度相比JS 提升了几倍.

Asm.js对语法进行了限制, 比如只准使用特定的集中元类型, 整形, 浮点型等.

asm.js对静态类型的问题做的再好,它始终逃不过要解释编译的过程,

而这两步是JavaScript代码在引擎执行过程当中消耗时间最多的两步.

支持更多语言

WebAssembly在Asm.js之后. 提出了更完善的方案.

是可以使用更多类型的语言编写代码, 编译生成wasm在浏览器上运行

支持的语言包括C, Rust, Go, Typescript, C#等.

先生成IR 中间码, 中间码是一种很原始的语言叫lisp, 在60年提出, 比C语言的诞生还早13年.

然后从IR再生成.wasm, 其实我们在使用命令编译时, 是没有呈现IR这一个环节的.

当浏览器加载wasm之后, 就会生成特定硬件环境下的, x86/x64或arm机器码.

这里不直接给机器码, 是考虑浏览器是跨平台运行的.

Build wasm

Asm.js 对比 Webassembly

Benchmark测试了一个hash算法, js和wasm在相同计算量的情况下, 性能差别可达几十倍.

Asm.js比js快几倍, Webassembly 又比asm.js快一倍, 或者更多.

wast/wat

wasm速度快, 文件小, 但是是二进制文件, 所以不便于阅读.

所以官方提供了一种wast的文本格式, 方便阅读和调试.

Wast是文本形式, 如果能习惯这种语法, 可以直接编写.

然后通过工具wast2wasm可以编译生成wasm.

Vscode也能找到了插件来以wast的语言形态, 直接浏览wasm文件.

AssemblyScript init and build

Assemblyscript可以让我们基于typescript语言开发

Webassembly的模块.

由于我们比较熟悉这种语言,

所以我选择从这个角度来进行讲解和演示.

这个环境搭建起来比官方推荐的emscripten方便多了.

AssemblyScript sample

编写一个简单的index.ts.

通过命令编译生成wasm和wat

然后就可以在页面上加载执行了.

这是最简单的演示, 真实的情况, 还有内存创建和传入,

传参, 传回调等.

这里语法上, ts 限制使用从i8~64, u8~u64, f32~f64, bool等类型,

其实就跟native语言差不多了, 比如bool只有一个bit, Array, String等等

What the Webassembly can do?

• 虚拟机 : TeaVM
• 3D 和图形 :  Figma , AutoCAD, Google Earth
• 游戏引擎 : Unity, Unreal
• 音视频 : Web-DSP

除此之外, AI, 加密解密的计算也可以通过webassembly来优化的.

Problems

• 不便于调试
• 只有基本计算型语法和函数导出
• 缺乏垃圾回收机制 ,  需要管理内存
• 缺乏异常处理
• 不能直接操作 DOM
• 与 JS 互相调用比较慢

Try.net and Blazor

浏览器限制直接加载本地dll文件的.

有一种古老的技术 COM, 可以将dll包装成可被其它语言调用的文件,

但是只在windows, IE上兼容, 太局限, 不安全, 难用, 后来随着IE的份额滑落, 渐渐没人用了.

微软基于webassembly技术, 推出Try.net 和Blazor 在网页上的提供C#.net运行的能力.

实现的方法是依托wasm的native运行能力, 远程加载.net的dll文件, 构建运行环境.

Try.net and Blazor

有了webassembly, 网页上要下载运行一个操作系统也是没问题的了.

我打开了这个页面, 可一直在下载, 下了几分钟还只有12M, 目标文件有47M,

而且卡死在这个文件上, 后面还有没有文件还不知道, 我就懒得运行它了.

简单易懂的解释什么是WebAssembly相关推荐

  1. 机器学习---“没有免费的午餐”(no free lunch)定理简单易懂的解释

    初入机器学习领域的同学都知道机器学习中有一个普适的定理:没有免费的午餐(no free lunch). 对它的简单易懂的解释就是: 1.一种算法(算法A)在特定数据集上的表现优于另一种算法(算法B)的 ...

  2. webassembly类型_WebAssembly 现状与实战

    为什么需要 WebAssembly 自从 JavaScript 诞生起到现在已经变成最流行的编程语言,这背后正是 Web 的发展所推动的.Web 应用变得更多更复杂,但这也渐渐暴露出了 JavaScr ...

  3. WebAssembly:系统编程语言的逆袭

    引子 Any application that can be written in JavaScript, will eventually be written in JavaScript. --At ...

  4. 双连通图强连通图概念解释以及tarjan算法求解该类问题总结

    最近看了看类的相关题,感觉简单的题过于模板,但是对于难题的转化,如果对与这方面的概念不清楚,很难写,故总结一下. PS:博客里部分内容会和离散数学中的图论知识有联系,如果没有了解过相关知识可能比较难理 ...

  5. WebAssembly 学习笔记

    第一次听到 WebAssembly 的是来自于同事,他描述了一种不通过 JavaScript编程语言也能够实现前端开发的方式.刚听到的时候很惊艳,想到前端开发竟然可以避开JavaScript,简直神乎 ...

  6. 从Rust到远方:WebAssembly 星系

    来源:https://mnt.io/2018/08/22/from-rust-to-beyond-the-webassembly-galaxy/ 这篇博客文章是这一系列解释如何将Rust发射到地球以外 ...

  7. 7月Python和机器学习最佳开源项目Top 10!

    [导读]七月就要结束了,在即将到来的 7 月最后一个周末,人工智能头条为大家整理了本月 ML 和 Python 最受欢迎的十大开源项目.就算放假在家也可以知道大家现在都在学些什么,学习放假两不误.这个 ...

  8. 一文图解卡尔曼滤波(Kalman Filter)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 译者注:这恐怕是全网有关卡尔曼滤波最简单易懂的解释,如果你认真的读 ...

  9. IEEE深度对话Facebook人工智能负责人Yann LeCun:让深度学习摆脱束缚

    本文原载IEEE,作者Lee Gomes,由机器之心翻译,微信公众号:机器之心(ID:Almosthuman2014) 人工智能经历了几次低潮时期,这些灰暗时光被称作"AI寒冬". ...

最新文章

  1. java param request_SpringMvc之@RequestParam详解
  2. 奇怪吸引子---QiChen
  3. python npy文件_python实现npy格式文件转换为txt文件操作
  4. Windows下安装GTK+的最佳攻略
  5. Scala _02基础
  6. 平安夜海报PNG免扣素材来了,全都在这|搜图114
  7. 不推荐使用getResources()。getColor()[重复]
  8. 【李宏毅2020 ML/DL】P51 Network Compression - Knowledge Distillation | 知识蒸馏两大流派
  9. 关于caffe-ssd训练时smooth_L1到底参与运算与否的问题
  10. Java开发者的十大戒律
  11. linux卸载nvdia驱动_Ubuntu 卸载 Nvidia 驱动和安装最新驱动
  12. 小米note2鸿蒙ROM,【ROM】小米note优化开发版MIUI9
  13. mysql分区表检验,MySQL分区表管理
  14. 【项目复习篇】EGO电商项目技术总结与学习笔记
  15. 使用containerd管理容器【同docker】【或称之为docker替代品】
  16. MySQL必知必会二:MySQL简介
  17. nuxt 更新部署因浏览器缓存导致页面错误解决方法
  18. centos6 安装redis
  19. 基于外卖平台POI的城市餐饮业空间热点分析系统
  20. 计算机桌面怎么能添加文字,怎么在桌面上添加文字便签

热门文章

  1. 【Delphi】阿里车主服务 ECO API SDK D7 D2007 D2010 XE2 XE7 XE8 XE10跨平台
  2. OpenCV 中的轮廓-轮廓的层次结构
  3. 均方根误差,均方误差,均方根,均方差,方差的区别
  4. java pushlet_pushlet 之 官方示例解读与改造
  5. Java高级开发0-1项目实战-青鸟商城-Day01
  6. Worthington核心酶——胰蛋白酶的应用领域
  7. 学习笔记26-- 在solidwork里面绘制世界环境,制作成gazebo的.world世界文件基本方法
  8. Windows Service编程
  9. js控制div滚动条的显示/隐藏
  10. 【分布式锁】三种分布式锁的实现【原创】