JavaScript 正慢慢變成 Java 中 ;P

Browser 功能愈來愈強大, 核心以 JavaSript 驅動著各種 API 產生不同的應用. 雖然, 還不能跟一般如 Python, Ruby 之類的功能性相比較, 但其開發便利性以及普及程度, 則是其他開發平台無法比擬的, 可參考先前有關於 CrossWalk 的介紹.

Deepin 2014 時, 很大膽的嘗試以 HTML5 技術實現桌面環境, 有意思的是, 雖然現在 Deepin 15 出了, 為了資源的結約及效能捨棄 HTML5 改採用 QT & QML, 但社群還有朋友在先前的版本試著實現自己的特效及功能.

這說明 HTML5 不可行? 非也, 近年 browser 的成熟度飛速進步, 如果當初採用了 Chromium 的話 (先前是基於 WebKit), 可能結果會相當的不一樣.

但 JavaScript 跟 C/C++ 的效能, 甚至是 Java, 都還有不小的落差, 程序大了複雜了以後, 影響就會愈來愈明顯, 怎麼辨?

JavaScript 為什麼慢? 或是換個問題, JavaScript 現在都會配合 JIT compiler 了, 為什麼效能還是有不小的落差?

原因在於, JavaScript 本身的 type system 為 weak & static 的, 在編程時有其便利性 (但有時候也很蛋疼), 因為是 weak typed, 所以不好將變量直接對應到機器上的資料類型, 例如, 你想要 int, 但 JavaScript 中所有的數質都是以 64bit float point 存放, 就算經過 JIT, 出來的結果還是會比 int (一個 machine word 的 integer 運算) 來得慢上許多.

所以, 先前 mozilla 就提出了 asm.js, 在不加進新語法的情況下, 以跟 0 做 or 運算的方式加上 annotation, 提示 JIT compiler 變量的類型, 如此達成更好的優化.

但, asm.js 還沒有根本的解決掉運算效能的問題, 如

  1. 如何很好的利用硬件平台上的 SIMD 指令處理資料?
  2. JavaScript 源碼載入時需要重新 parse 一遍, 花時間
  3. 在移植像是 Game or 2D/3D engine 時, 通常來源都是 C/C++ 代碼, 能否做少量變動就移植上 HTML5 平台?

第一點的話, 目前有 Intel 提出的 SIMD.js 達成, 在重覆處理大量同類型運算時, 能非常明顯的提高運算效率, 因為 SIMD (Single Instruction, Multi Data) 的設計至少就能大量的減少 CPU 來回於內存搬動指令及資料時的等待時間, 再加上矢量運算指令為特定類型運算的優化使然.

第二點的話, 由各大 Browser 廠家 (Google, Apple, Mozilla, Microsoft) 一起努力著, 正在制定一個叫 WebAssembly, 讓 HTML5 平台有自己的 assembly 可用, 哈! 成果將會是一堆指令, 然後是對應的編碼, 最終 browser 會像是 JVM 一樣 interpret & JIT 標準的 bytecode, 可減少許多 parsing 的時間及內存的使用.

有了 WebAssembly 後, 要將 C/C++ 甚至是其他語言轉換到 HTML5 平台上並優化的效果就更好了, 再於 [LLVM 上實現 backend] (https://github.com/WebAssembly/design/blob/master/HighLevelGoals.md) 的話, 以後要開發 HTML5 程序, JavaScript 的學習將不會是必要的.