在2015.06.17, JavaScrpt之父Brendan Eich宣布了新项目WebAssembly:将新的底层原语带入web中, 这将使在浏览器或其他JavaScript环境中采用类似于C & C++等语言编写的项目的编译更加容易。
WebAssembly
, 缩写为“wasm”,.wasm 为文件名后缀,是一种新的用于底层安全代码的二进制语法。
wasm的最终目的是成为任何语言的编译目标,使它们编写的应用程序可以运行在浏览器或其他JS代理中,以取代javascript成为性能更好的web世界汇编语言
。
Web在近些年取得了很大的进展,且无论好坏与否,JavaScript 都是它的编程语言。但在过去几年,我们看到越来越多的项目问世,它们试图通过开发编译程序,将其他语言代码转化为 JavaScript,以此让开发者克服 JavaScript 自身存在的一些短板。
由于JavaScript 的语法(严格来讲是ECMAScript 262 3/e 或5/e) 在typing (变量类型) 上没有很完美的解决方案,而且又有一些眉眉角角跟几个大家熟悉的编程语言(如:C/C++、Java、C# 等)习惯不同,所以要使用JavaScript 开发大型的应用程式,必须要有很小心的规范以及开发人员必须很深入了解JavaScript 的「good/ugly/awful parts」(参考:JavaScript语言精粹 )
所以一直以來都有各式各樣的 project 想要改善這個問題(參考這裡有人整理了一個列表),最常被大家提到的就像 GWT (Google Web Toolkit) 、Script# 或是 CoffeeScript,它們都希望減輕 JavaScript 開發人員的負擔,改用一些結構良好或是更輕鬆的語言來開發應用程式(GWT 是 Java、Script# 是 C# 而 CoffeeScript 則是自定的語法),再透過各自的編譯器(compiler)來產出 JavaScript 程式碼。這些 projects 各有各的優缺點,也有其市場(減低語言轉換成本),乍看之下 TypeScript 好像也是在做類似的事,但它與上述提到的這些 project 不同的地方在於:它完全相容 JavaScript 原本的語法。也就是如果你過去剛好是一位 JavaScript developer,你可以在不改變過去撰寫 JavaScript 的習慣繼續撰寫程式,如同 TypeScript 官網上的範例:
這段程式碼,你可以儲存為 sample1.ts 這樣的檔案,然後透過 TypeScript 編譯器去編譯它,最後會產出一模一樣的 JavaScript 程式碼,這就顯示了它完全相容 JavaScript 語法,同時也證明可以繼續整合既有的 JavaScript libraries(如:jQuery, YUI 等),這都是其它 projects 比較少見的作法。
所以只要是寫 JavaScript 的環境(瀏覽器、NodeJS)都可以運用 TypeScript。
TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。
在默认环境下,JavaScript 文档其实就是简单的文本文件,先是从服务器下载,然后由浏览器中的 JavaScript 引擎解析并编译。WebAssmbly 团队之所以决定推出新的二进制格式,原因有两个,一是代码可以被压缩为其他的文本文件,而不仅限于标准的 JavaScript 文本文件,二是相比解析 asm.js 代码,JavaScript 引擎破译二进制格式的速度要快得多——在当前的原型标准下,最多快了 23 倍。
长期以来,Mozilla asm.js 旨在将接近于本地的速度带给 Web。而旨在在浏览器中运行本地代码的谷歌 Native Client 项目 ,也具有类似的目标,只是影响力相对较小。看起来,WebAssmbly 如今可以将这些项目中最好的元素融入浏览器。
如今,众多此类项目开始联合起来,以 WebAssmbly 的形式出现在大家面前。
这种新的格式旨在让编程人员为浏览器编译代码(目前浏览器的专注点是 C/C++,其他语言的重要性次之),然后在 JavaScript 引擎内进行执行。由于不必解析完整的代码——这种操作往往会耗费相当长的一段时间(尤其是在移动端),因此 WebAssmbly 被解码的速度可以大大加快。
WebAssmbly 团队的想法是,这种新的二进制格式将向开发者提供单一的 Web 编译目标,最终成为一种可在所有浏览器中执行的 Web 标准。
作为第一步,WebAssmbly 团队的目标是提供与 asm.js 相同的功能性,开发者将可以在 WebAssmbly 上面使用相同的 Emscripten 工具,就像他们今天使用这种工具编译 asm.js 代码一样。
在早期阶段,WebAssmbly 团队还计划推出一个所谓的 polyfill 库 ,用以将 WebAssmbly 代码转化为 JavaScript,这样就能运行于任意浏览器上——甚至是没有获得本地 WebAssmbly 支持的浏览器上(很显然,这有点荒谬,但如果浏览器可以在本地运行这种代码,那么最后一步就不需要了)。随着时间的推移,WebAssmbly 团队还将开发更多的工具(比如编译程序和调试程序等),同时支持更多的语言(例如 Rust、Go 和 C#)。
正如“JavaScript 之父” 布兰登·艾奇(Brendan Eich)在今天所指出的,一旦主要的浏览器全都能在本地支持新的二进制格式,那么 WebAssmbly 和 JavaScript 就可以再次分离。
WebAssmbly 团队还指出,他们推出 WebAssmbly 不是为了取代 JavaScript,而是为了让更多的语言可以支持 Web 编译。实际上,JavaScript 和 WebAssembly 很有可能会被开发者同时使用,例如,某款应用的部分元素可能会使用 WebAssembly 模块(如动画、可视化和压缩等),而用户界面仍然可以主要使用 JavaScript 语言编写。
我们很少看到所有主要的浏览器厂商携手推出像 WebAssembly 这样的项目,所以,他们的合作会带来什么样的成果,肯定值得我们在未来几个月乃至几年保持关注。