在意别人的看法,是内心不够强大的表现。

争取风险投资,要选择热门的技术;解决实际问题, 要选择可靠的技术。

技术的热门度曲线图如下(2018-4),本文谈下处于启动期(Innovation Trigger)的WebAssembly以及低谷期(Trough of Disillusionment)的WebRTC。

WebRTC

首先WebRTC是什么? WebRTC — Web browsers with Real-Time Communications (RTC)。
WebRTC是一个免费、开放的项目。使web浏览器通过简单的JavaScript api接口实现实时通信功能。WebRTC组件已经被优化以最好的服务于这个目的。

WebAssembly

WebAssembly(abbreviated Wasm)是一种可以使用非Java编程语言编写代码并且能在浏览器上运行的技术方案(assembly language:汇编语言)。WebAssembly主要试图解决现有技术的一些问题:JavaScript:性能不够理想,以及语言本身的一堆坑(这个大家都懂);Flash:私有技术(而且漏洞一堆),并且是纯二进制格式;Silverlight:私有技术,并且是纯二进制格式;各种插件(Plug-in):安全性问题,平台兼容问题

JS最大的一个坑,就是性能。
以下内容摘抄自知乎回答
性能填坑阶段一
Javascript一开始就是解释性语言,解释性语言的一大特点就是慢,而网页应用越来越复杂,虽然你是解释型语言,但是我可以偷偷的编译你啊。这个也不需要让这帮“非专业编程人员和设计师”们知道,我只要在程序运行前的一刹那,编译即将运行的代码就好。
于是Google在2009年在V8中引入了JIT技术(Just in time compiling 江湖人称即时编译)。有了这个buff, Javascript瞬间提升了20-40倍的速度。直接导致一大波大型网页应用的出现。人类的性能的期望是无穷无尽的,JIT的带来的性能提升很快就榨干了。

性能填坑阶段二
既然JIT遇到的问题是类型不确定问题和有一些语言功能,比如异常、for in。JIT起来很麻烦,我可不可以搞个方法让用户不去用这些功能,同时让他们把用的类型都标注出来啊。按照这个思路,催生了两种实现路径:一种是Typescript、Dart、JSX为代表的,基本思想是,我搞个其他的语言,这个语言是强类型的,所以程序猿们需要指定类型,然后我把它编译成Javacript不就行了嘛。另一种是火狐的Asm.js为代表的,做一个javascript子集,同时试图利用标注的方法,加上变量类型。然后有一个能够识别这些符号的JS引擎,你就可以不用猜类型了哦。

事实上,由于有了类型,连传统的AOT都成为了可能。
第二种的速度提升潜力比第一种要大非常多。因为第一种,无论如何,也就是让JIT(即时编译)快一点, 第二种那可直接就编译了啊(AOT).

WebAssembly就是第二种方式,说到底,Mozilla、Google、Microsoft and Apple觉得Asm.js这个方法有前途,想标准化一下,大家都能用。有了大佬们的支持,WebAssembly比asm.js要激进很多。WebAssembly连标注JS这种事情都懒得做了,不是要AOT吗?我直接给字节码好不好?(后来改成AST树)。使用AST的原因是因为AST比字节码更容易压缩,也更容易翻译。
不了解AST可以看下面这张图,说明Javascript引擎的执行过程。Javascript先编译为AST,然后到Bytecode。AST的抽象程度比Bytecode要高一级。

WebAssembly不支持垃圾回收,内存操作需要手动控制,因此WebAssembly没有垃圾回收。

补充1:

AOT:In computer science, ahead-of-time (AOT) compilation is the act of compiling a higher-level programming language such as C or C++, or an intermediate representation such as Java bytecode or .NET Framework Common Intermediate Language (CIL) code, into a native (system-dependent) machine code so that the resulting binary file can execute natively.

JIT:In computing, just-in-time (JIT) compilation, (also dynamic translation or run-time compilation)[1], is a way of executing computer code that involves compilation during execution of a program – at run time – rather than prior to execution.[2] Most often, this consists of source code or more commonly bytecode translation to machine code, which is then executed directly. A system implementing a JIT compiler typically continuously analyses the code being executed and identifies parts of the code where the speedup gained from compilation or recompilation would outweigh the overhead of compiling that code.

AST:In computer science, an abstract syntax tree (AST), or just syntax tree, is a tree representation of the abstract syntactic structure of source code written in a programming language. Each node of the tree denotes a construct occurring in the source code. The syntax is “abstract” in not representing every detail appearing in the real syntax. For instance, grouping parentheses are implicit in the tree structure, and a syntactic construct like an if-condition-then expression may be denoted by means of a single node with three branches.

LLVM:The LLVM compiler infrastructure project is a “collection of modular and reusable compiler and toolchain technologies”[3] used to develop compiler front ends and back ends.

补充2 asm.js和Emscripten

2012年,Mozilla的工程师Alon Zakai在研究LLVM编译器时突发奇想:许多3D游戏都是用C/C++语言写的,如果能将C/C++语言编译成JavaScript代码,它们不就能在浏览器里运行了吗?众所周知,JavaScript的基本语法与C语言高度相似。
于是,他开始研究怎么才能实现这个目标,为此专门做了一个编译器项目Emscripten。这个编译器可以将C/C++代码编译成JS代码,但不是普通的JS,而是一种叫做asm.js的JavaScript变体。
Emscripten,它基于LLVM,可以将C/C++编译成asm.js,使用WASM标志也可以直接生成WebAssembly二进制文件(后缀是.wasm)。emcc在1.37以上版本才支持直接生成wasm文件。
C/C++编译成JS有两个最大的困难:1、C/C++是静态类型语言,而JS是动态类型语言 2、C/C++是手动内存管理,而JS依靠垃圾回收机制。asm.js就是为了解决这两个问题而设计的:它的变量一律都是静态类型,并且取消垃圾回收机制。
一旦JavaScript引擎发现运行的是asm.js,就知道这是经过优化的代码,可以跳过语法分析这一步,直接转成汇编语言。另外,浏览器还会调用WebGL通过GPU执行asm.js,即asm.js的执行引擎与普通的JavaScript脚本不同。这些都是asm.js运行较快的原因。
asm.js只提供两种数据类型。其他数据类型,比如字符串、布尔值或者对象,asm.js一概不提供。它们都是以数值的形式存在,保存在内存中,通过TypedArray调用。asm.js没有垃圾回收机制,所有内存操作都由程序员自己控制。asm.js通过TypedArray直接读写内存。
asm.js与WebAssembly的异同:两者的功能基本一致,就是转出来的代码不一样:asm.js是文本,WebAssembly是二进制字节码,因此运行速度更快、体积更小。

补充3 浏览器支持
主流的浏览器目前均支持webAssembly:

  • Safari支持WebAssembly的第一个版本是11
  • Edge支持WebAssembly的第一个版本是16
  • Firefox支持WebAssembly的第一个版本是52
  • chrome支持WebAssembly的第一个版本是57

使用WebAssembly,我们可以在浏览器中运行一些高性能、低级别的编程语言,可用它将大型的C和C++代码库比如游戏、物理引擎甚至是桌面应用程序导入Web平台。

Comments

去留言
2018-04-21

⬆︎TOP