JavaScript is Untyped

untyped

上週去聽 Gias Kay LeeAnimation in AngularJS,說到 JavaScript 其實是 untyped language,因為我沒受過 Computer Science 的正統教育,這名詞對我來說是新的,所以回來花了些時間看網路上的文件。

Wikipedia 上的文章不少,不過看起來比較吃力,Stack Overflow 上也有幾則不錯的問答,對我來說幫助很大,這個問題其實也沒很複雜,在 Computer Science 上來說,是不使用 strong type 和 weak type 來形容程式語言的,因為沒有明確的定義,取而代之的,是數個有明確定義的相關特性:type safety、memory safety、static/dynamic type checking、type conversions。

所以我之前 文章 說到 JavaScript 是 weak type 那段其實應該要說是 untyped 會比較好。其實講到 type 的問題,就會想到 JavaScript 的效能問題,Brendan Eich 說過 JavaScript 引擎很難跑得快的原因就是因為它是 untyped 的。在 Performance Tips for JavaScript in V8 這篇文章有提到,V8 引擎其中有一個提升速度的設計是給變數 hidden class,這個 hidden class 其實就是隱藏的變數型別,如果你的變數從頭到尾都維持同樣的型別,例如整數永遠是整數、字串永遠是字串,而不會有中間換型別的情形,那 V8 引擎就可以利用 hidden class 的資訊來提升運算速度,我覺得這個 tip 很不錯,不只是 V8 可以跑比較快,即使其他引擎沒有受益,作為寫程式時的 good practice 也很受用,減少了程式內的不可預期性。

另外一個我覺得很相似的例子是這兩年新的 asm.js,asm.js 是一個 JavaScript 的子集,設計上可以直接做一些比較低階的操作,像是直接 allocate 記憶體還有 Typed Array 等,而其中還定義了一組相容於普通 JavaScript 的寫法來宣告變數的型別:

function f(x, y) {
    x = x|0;      // int parameter
    y = +y;       // double parameter

    return;
}

只是 asm.js 會直接手寫的應該很少,像 asm.js 有名的例子: Unreal Engine 就是用工具 compile 過去的。

PS: 我還找不到上面那張圖片的投影片出處,有人知道的話麻煩告訴我,感謝。