據我所知,JavaScript是HTML文件已經從服務器檢索後,將在客戶端執行的唯一語言。
這是不對的。至少在HTML 4.01中,<script>
元素具有type
屬性,允許您指定任何您想要的語言。 HTML 4.01規範本身在VBScript和Tcl中有例子。
的Internet Explorer的舊版本,例如,支持VBScript作爲一種替代的腳本語言ECMAScript的。有支持Dart作爲替代腳本語言的Chrome版本。有一個項目增加了對PHP,Perl,Python,Ruby,Tcl和其他Firefox的支持。
您還可以使用任何具有輸出ECMAScript的編譯器的語言,並且幾乎所有語言現在都具有該語言,例如,有編譯器可以將C,C++,Java,Scala,Ruby,C♯,F♯以及許多其他語言編譯爲ECMAScript。還有一些語言被明確設計成ECMAScript的超集(例如TypeScript),語義上接近ECMAScript(例如CoffeeScript),或者易於編譯成ECMAScript(例如Dart)。
據我所知,JavaScript決不會被編譯,因此它是一種解釋型語言。
這是錯誤的。目前所有瀏覽器中的ECMAScript執行引擎都至少有一個編譯器。許多編譯器都有。至少有一個沒有任何解釋:
- V8純屬編譯,從未有任何解釋怎麼回事,它總是編譯ECMAScript的源代碼,二進制機器碼。原始版本有一個編譯器,當前版本有兩個。
- SpiderMonkey always將ECMAScript編譯爲SpiderMonkey字節碼。然後這個字節碼首先被解釋幾次以收集統計數據,然後通過幾個編譯器之一將「熱」部分編譯成二進制本機機器碼。
- Nitro always將ECMAScript編譯爲Nitro字節碼。然後這個字節碼首先被解釋幾次以收集統計數據,然後由另一個編譯器將「熱」部分編譯成二進制本機機器碼。
- Chakra 總是將ECMAScript編譯爲Chakra字節碼。然後這個字節碼首先被解釋幾次以收集統計數據,然後由另一個編譯器將「熱」部分編譯成二進制本機機器碼。
事實上,術語「解釋性語言」和「編譯語言」甚至沒有意義。語言不被解釋或編譯。僅有的語言是。編譯和解釋不是一種語言的特徵,它們是編譯器或解釋器的特徵(杜!)語言是一組數學規則和限制。而已。 「語言」的概念和「解釋」的概念生活在兩個完全不同的抽象層次上。如果英文是一種類型語言,那麼術語「解釋語言」將是一種類型錯誤。
每種語言都可以通過解釋器來實現,每種語言都可以通過編譯器來實現。有C和C++的解釋器,有ECMAScript,PHP,Python和Ruby的編譯器。
我正確地認爲互操作語言的編譯速度較慢嗎?
不是。首先,就像我上面解釋的那樣,根本就沒有解釋或編譯語言那樣的東西。只有解釋或編譯的語言實現。其次,說一種語言比另一種語言慢是沒有意義的。您可以說的是,某個特定程序在特定機器上的特定環境中由特定實現的特定版本執行時運行速度快於不同版本的不同實現在不同環境中執行的不同的程序機。
一般而言,典型程序在特定實現方面的表現主要取決於花費多少金錢,資源,精力,智力,研究,工程和人力,而不是語言的任何特定特徵。 Oracle HotSpot JVM的速度並不快,並不是因爲它是一個編譯的實現,而不是因爲Java是靜態類型的(事實上,這完全不相關,因爲HotSpot JVM執行JVM字節碼,甚至不瞭解Java的任何內容!),但是因爲Oracle Sun已經投入了大量的資源。具有諷刺意味的是,在Sun收購Smalltalk(!!!)公司及其VM技術之前,Java實際上很慢。是的,沒錯:HotSpot JVM實際上只是一個稍微修改過的Smalltalk VM,即動態語言的VM。實際上,VM HotSpot基於,是開源的,也是VM V8的基礎(這並不奇怪,因爲V8是由一些開發HotSpot JVM和Smalltalk的人開發的它基於的VM)。
注意,有上獲得通過瀏覽器接受一種新的語言兩次嘗試廠商:
asm.js是ECMAScript中的句法和語義的子集的語言(意思是任何asm.js程序也是一個語義相同的ECMAScript程序,以及一個對asm.js一無所知的瀏覽器會簡單地認爲它是ECMAScript並將其作爲ECMAScript執行,並且它將會正常工作),並具有一定的限制條件,使其成爲編譯器的良好目標(例如創建一個將C編譯爲asm.js的編譯器相對容易),同時還有一個很好的用於生成本地代碼的源代碼(即它的語義相對接近現代主流通用CPU的語義)。
同樣,WebAssembly是一種(二進制)語言,它與asm.js基本上具有相同的目標,除非沒有要求它是ECMAScript的真正子集。它是自己的獨立語言,受asm.js,LLVM位碼,ANDF,CIL,JVM字節碼,Pascal P代碼等的啓發。
Asm.js已經有了一些瀏覽器的支持,並且因爲它只是ECMAScript的一個子集,甚至在沒有支持的瀏覽器中工作......只是速度較慢。雖然WebAssembly仍處於實驗和原型設計階段,但它正在獲得牽引力。
如果您打算投票回答問題,請告訴我爲什麼我可以改變它,以便我下次可以提出更好的問題。簡單地投下它就不會向我或其他社羣提供有關提問的有用信息。 –
它的解釋並不完全準確。現代瀏覽器中的大部分Javascript都是JIT編譯的,除了一些無法編譯的構造外。 – PMV
是的,你說得對。從技術上說,JS是使用Just-In-Time編譯編譯的。但即便如此,事實仍然是這比AOT編譯速度慢。 –