用C++寫Web應用是一種怎樣的體驗?

概述

在2015.06.17, JavaScrpt之父Brendan Eich宣佈了新項目WebAssembly:將新的底層原語帶入web中,  這將使在瀏覽器或其他JavaScript環境中採用類似於C & C++等語言編寫的項目的編譯更加容易。WebAssembly, 縮寫爲“wasm”,.wasm 爲文件名後綴,是一種新的用於底層安全代碼的二進制語法。

wasm的最終目的是成爲任何語言的編譯目標,使它們編寫的應用程序可以運行在瀏覽器或其他JS代理中,以取代javascript成爲性能更好的web世界彙編語言

歷史

Web在近些年取得了很大的進展,且無論好壞與否,JavaScript 都是它的編程語言。但在過去幾年,我們看到越來越多的項目問世,它們試圖通過開發編譯程序,將其他語言代碼轉化爲 JavaScript,以此讓開發者克服 JavaScript 自身存在的一些短板。

  • 一些項目專注於給編程語言增加新的功能,比如微軟的 TypeScript、Google的Dart。
  • 一些項目是爲了提升JavaScript 的執行速度,例如 Mozilla 的 asm.js 項目、Google的PNaCl。

TypeScript

由於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的一個超集,而且本質上向這個語言添加了可選的靜態類型和基於類的面向對象編程。

asm.js

在默認環境下,JavaScript 文檔其實就是簡單的文本文件,先是從服務器下載,然後由瀏覽器中的 JavaScript 引擎解析並編譯。WebAssmbly 團隊之所以決定推出新的二進制格式,原因有兩個,一是代碼可以被壓縮爲其他的文本文件,而不僅限於標準的 JavaScript 文本文件,二是相比解析 asm.js 代碼,JavaScript 引擎破譯二進制格式的速度要快得多——在當前的原型標準下,最多快了 23 倍。

長期以來,Mozilla asm.js 旨在將接近於本地的速度帶給 Web。而旨在在瀏覽器中運行本地代碼的谷歌 Native Client 項目 ,也具有類似的目標,只是影響力相對較小。看起來,WebAssmbly 如今可以將這些項目中最好的元素融入瀏覽器。

Dart

PNaCl

如今,衆多此類項目開始聯合起來,以 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 這樣的項目,所以,他們的合作會帶來什麼樣的成果,肯定值得我們在未來幾個月乃至幾年保持關注。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章