WebAssembly:随风潜入夜

What?

  WebAssembly 是一种二进制格式的类汇编代码,可以被浏览器加载和并进一步编译成可执行的机器码,从而在客户端运行。它还可以作为高级语言的编译目标,理论上任何语言都可以编译为 WebAssembly。

  我们知道汇编语言就是机器码的一种直译版本,它是一套指令的集合,必须与特定机器匹配。WebAssembly 虽然也可以看成汇编代码,但有一点不同,它是与特定机器无关的,它的指令被称为虚拟指令,并非真正的处理器指令。也就是说 WebAssembly 是一个平台无关的通用编译目标,可以运行在各种设备上,包括手机和物联网。

  WebAssembly 起源于 Mozilla 的一个项目:ASM.js,这玩意儿简单的说就是 JS 的一个轻简版子集,去除了动态类型、对象、垃圾回收等损耗性能的部件。它的作用是成为 C/C++ 的编译目标,从而能将大中型游戏引入浏览器,事实证明效果不错。然而 ASM.js 毕竟仍然是 JS,它不具备原生代码的一些功能,如 SIMD、线程、共享内存等,因此 ASM.js 进一步发展,就成了 WebAssembly。

  WebAssembly 的实质是 AST,而非字节码(bytecode),使用 AST 的原因是因为 AST 比字节码更容易压缩,也更容易翻译。

  作为浏览器厂商四巨头(谷歌、苹果、火狐、微软)合作共谋的产物,WebAssembly 的应用前景不可小觑。

 

Why?

  随着高计算量 Web 应用(3D图形、游戏、VR等)的出现,JavaScript 的速度又一次显得不够用了。WebAssembly 的目的就是让浏览器多一种运行更快速的代码。

  WebAssembly 比 JS 快这是显然的,一个接近 native code,另一个是动态类型的解释型语言,完全没法比。简单比较一下 JS 和 WebAssembly 的运行时过程就知道 WebAssembly 究竟快在哪儿了:

       WebAssembly 不仅运行更快,传输也更快,因为它是二进制格式的,压缩率更高,体积更小。引用 Opera CTO 罗志宇的说法,WebAssembly 就是对 JS 性能问题的终极填坑方案。

       在浏览器中引入 native code 的尝试其实早就有了,但是几乎没有一个成功的,无论是 Java Applet,还是谷歌的 Portable Native。Brendan Eich 对此的看法是,这些方案试图重建一个系统来替代 JS,这种革命式的改造在无权威的互联网世界是行不通的,因为 JS 已经在 web 端形成了自然垄断地位,如果仅仅为了改善性能问题,就彻底推翻重构,无异于削足适履,浏览器厂商是不干的。

  作为实用主义者,Brendan Eich 认为现实总是以渐进的方式改良,因此 WebAssembly 被设计为与 JS 协同使用,它既不会,也不可能替代 JS。

 

How?

  生成 WebAssembly 的方式有多种,可以直接手写,因为 WebAssembly 提供了文本形式,写起来跟汇编差不多。更通行的方式是将用其它语言——目前主要是静态语言(C、C++、Rust等)编写的代码编译成 WebAssembly(.wasm),编译工具最主要的是 LLVM。如果要支持动态语言,如 Python、Ruby 甚至 JS,那么编译器必须引入更多的扩展。

  LLVM 编译的基本工作机制是:首先使用一种针对特定语言的插件(类似于 webpack 中的 loader)将该语言编译为一种中间态形式(IR),然后再由 LLVM 对 IR 进一步编译、优化,从而得到.wasm。当然也有其它的编译工具,如 Emscripten、Binaryen 等。工具链的便捷程度是影响 WebAssembly 发展的一个重要因素。

       得到 .wasm 文件之后怎么用呢?目前 .wasm 需要由 JS 引入后才能运行,JS 中有一个用于操作二进制代码的 API:ArrayBuffer,JS 使用 ArrayBuffer 加载 .wasm,然后调用编译方法,然后再创建实例。WebAssembly 还没有集成 Web API,要调用 Web API,就必须借助 JS。未来计划允许 WebAssembly 直接调用 Web API,并且让 .wasm 模块像 ES6 模块一样易于使用。

  目前 Chrome、FF、Edge、Safari 最新版都已支持 WebAssembly,对于不支持 WebAssembly 的浏览器,会有 polyfill 把 WebAssembly 重新翻译为 JavaScript。

 

Pros?

  1、WebAssembly 使得 web 应用具备了原生应用的性能;

  2、WebAssembly 提供了一种符合 W3C 标准的技术,从而可以取代私有的、非标的、安全性差的插件,如 flash 和 Silverlight;

  3、从古至今,浏览器只支持一种程序语言:JS,WebAssembly 使得有更多语言能够用于打造 web 应用;

  4、WebAssembly 是一个渐进式的方案,而非疾风骤雨,势不两立的革命,因此更具有现实可操作性。

 

Cons?

  现在还不好说,咱们拭目以待吧。

 

参考资料:

https://www.smashingmagazine.com/2017/05/abridged-cartoon-introduction-webassembly/#

https://medium.com/javascript-scene/why-we-need-webassembly-an-interview-with-brendan-eich-7fb2a60b0723


原文地址:http://www.cnblogs.com/kidney/p/7120300.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让java的多重继承成为现实!

点击上方蓝色关注我们!大家好,我是雄雄,前两天给大家说了说java中的四种内部类,推文分别为:静态内部类和成员内部类方法内部类和匿名内部类在内部类的基础上,我们来看看今天的知识点儿。众所周知&#xff0…

通俗理解决策树算法中信息增益的

转载自 通俗理解决策树算法中信息增益的 通俗理解决策树算法中的信息增益 在决策树算法的学习过程中,信息增益是特征选择的一个重要指标,它定义为一个特征能够为分类系统带来多少信息,带来的信息越多,说明该特征越重要&#x…

DDD理论学习系列(6)-- 实体

1.引言 实体对应的英语单词为Entity。提到实体,你可能立马就想到了代码中定义的实体类。在使用一些ORM框架时,比如Entity Framework,实体作为直接反映数据库表结构的对象,就更尤为重要。特别是当我们使用EF Code First时&#xf…

班级日常 | 一天一瞬间!

点击上方蓝色关注我们!欢迎来到今天的“一天一瞬间”专栏在学习word操作时,同学们的兴趣还是较高的,但是,比起“一天一个黑科技”来说,还是差了许多!前面两天都是学的一些简单的DOS命令,比如进某…

ASP.NET Core Web 资源打包与压缩

本文将介绍使用的打包和压缩的优点,以及如何在ASP.NET Core应用程序中使用这些功能。 概述 在ASP.Net中可以使用打包与压缩这两种技术来提高Web应用程序页面加载的性能。通过减少从服务器请求的次数和减少资源文件的体积来提高加载性能。 打包是一地将多个文件&a…

班级日常分享 | 一天一瞬间!

点击上方蓝色关注我们!介于最近同学们的学习劲头十足的样子,我和丁老师商量决定晚上不布置作业,看一部电影放松放松!昨晚下晚自习后,零零散散的还有一部分同学在教室里面学习,值班老师都催促多次&#xff0…

句法分析(syntactic parsing)在NLP领域的应用是怎样的

转载自 句法分析(syntactic parsing)在NLP领域的应用是怎样的 句法分析(syntactic parsing)在NLP领域的应用是怎样的? 文章整理自郭江师兄问题回答(被收录于知乎编辑推荐)!已取得…

新的学期、新的开始、新的付出、新的收获!

点击上方蓝色关注我们!本文原创:王晓丹同学初次,我漫步在静静的校园,深情的黄昏,显得格外惹人喜爱。哇!那是什么?我情不自禁的喊了出来,一颗石榴树 ,引起了我满满的回忆&…

ASP.NET Core Web API 最小化项目

ASP.NET Core中默认的ASP.NET Core 模板中有Web API 模板可以创建Web API项目。 有时,只需要创建一个API,不需要关心Razor,本地化或XML序列化。通过删除无用的NuGet软件包和代码,可以提高 API 的加载时间并减少部署包大小。 新建…

LinkedHashSet VS HashSet

LinkedHashSet的使用 LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个 数据和后一个数据。 优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet

隐马尔科夫模型-基本模型与三个基本问题

转载自 隐马尔科夫模型-基本模型与三个基本问题 隐马尔科夫模型-基本模型与三个基本问题 这次学习会讲了隐马尔科夫链,这是一个特别常见的模型,在自然语言处理中的应用也非常多。 常见的应用比如分词,词性标注,命名实体识别等…

日常技术分享 : 一定要注意replcaceAll方法,有时候会如你所不愿!

点击上方蓝色关注我们!今天,踩过了一个雷,特此整理了一下,以防大家也被中招!事情是这样的,在做一个项目时,需要用到String类的replcaceAll方法,可以这么说,该方法就是替换…

在微服务中如何管理数据

来自Stitch Fix团队的工程副总裁Randy Shoup在QCon纽约2017会议上讨论了如何在基于微服务的应用中管理数据和隔离持久化。他还介绍了将事件(Event)作为微服务的第一类构造。他介绍自己的团队将机器学习技术应用到了业务的各个组成部分,比如购…

jozj3419-最大利润【树形dp】

前言 树形dp是前天学的,题目也是前天做的,可博客却是今天发的。 正题 题目大意 一棵树一样的火车站,每个站点有不同的利润,不能连续选择相连的两个站点的利润,求最大利润。 输入输出(建议无视&#xf…

隐马尔科夫模型-前向算法

转载自 隐马尔科夫模型-前向算法 隐马尔科夫模型-前向算法 在该篇文章中讲了隐马尔科夫模型(HMM)一基本模型与三个基本问题 隐马尔科夫模型-基本模型与三个基本问题,这篇文章总结一下隐马尔科夫链(HMM)中的前向与后…

线段树初见——区间询问与改变最大值

前言 昨天某B组讲主席树,然后就作死的去听了,也没听懂(因为连线段树都不懂),然后好奇心就去问了一下老师线段树是个蛤,然后这篇博客就诞生了。 正题 首先线段树就是一个可以快速区间改变和询问的东东&am…

关系数据库理论

依赖 候选码 三大范式 公理系统 求最小函数的依赖集 例 解 模式分解

19级:班级日常分享 | 一天一瞬间

点击上方蓝色关注我们!昨天没有看到他们早读,有点失落。今天再一次去教室,还未走到门口呢,就听见教室里面的早读生透过门缝传出,甚是开心。在陪他们早读的时候,自己顺便读了几篇散文和古诗古文,…

在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

前言 Visual Studio 2017已经发布了很久了。做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧。 随着Google Angular4的发布。我一直在想,怎么能够用这个地表最强IDE工具编写Angular4的Asp.Net Core项目。经过不懈的研究。终…