2012-08-07 115 views
16

如何用Java編寫的代碼需要用JVM解釋的字節代碼編譯,但用JavaScript等語言編寫的代碼不需要編譯並可以直接在瀏覽器中運行?爲什麼需要編譯Java代碼,但JavaScript代碼不需要

有沒有簡單的方法來理解這一點?

寫這兩種語言的方式有什麼根本區別,這可能有助於理解這種行爲?

我不是CS學生,所以請原諒這個問題的天真。

+3

JavaScript由瀏覽器解釋,而不是由計算機的實際硬件(如C程序集)解釋。 – thatidiotguy 2012-08-07 20:18:17

+2

@thatidiotguy wat。目前JavaScript很少被解釋(Chrome的名氣V8甚至沒有*解釋器),「C程序集」根本沒有任何意義,而且彙編代碼根本不被執行,它只是簡單地變成機器碼。雖然我不得不給你實現機器碼的道具也只是在一天結束時解釋。 – delnan 2012-08-07 20:27:18

+1

[編譯與解釋語言]可能的重複(http://stackoverflow.com/questions/3265357/compiled-vs-interpreted-languages) – jbabey 2012-08-07 20:30:22

回答

19

歷史上,JavaScript是一種解釋型語言。這意味着解釋器接受源代碼並一步執行。這裏的優勢在於簡單性和靈活性,但解釋器非常緩慢。編譯器將高級語言轉換爲較低級別的語言,可以直接執行本機處理器或VM(本例中爲Java VM)。這要快得多。

現代瀏覽器中的JavaScript現在即時編譯。所以當腳本被加載時,JavaScript引擎所做的第一件事就是將它編譯成字節碼,然後執行它。從最終用戶的角度來看,整個編譯步驟缺失的原因是因爲瀏覽器開發人員(幸好)維護了JavaScript沒有明確編譯的要求。

Java是getgo的一種語言,它總是有一個明確的編譯步驟。但在很多情況下,這不再是事實。像IntelliJ或Eclipse這樣的IDE可以即時編譯Java,並在很多情況下刪除顯式編譯步驟。

3

JavaScript和Java不是一回事。他們可能會分享一個類似的名字,但我會將您推薦給JS guru - Douglas Crockford以幫助消除他們根本不相關的事實。現實情況是沒有什麼能夠阻止Java成爲一種解釋型語言,同樣也沒有什麼能夠阻止JavaScript成爲一種編譯語言(Chrome的JavaScript引擎確實可以編譯來提高速度,並且做得很好)。

在瀏覽器的上下文中,Java的運行方式與Flash或Silverlight相同 - 需要插件並且瀏覽器充當該插件的主機;託管一個Java運行時環境。

Javascript被設計爲瀏覽器的腳本語言,這就是爲什麼瀏覽器本身可以理解它。 如何瀏覽器實際上實現了代碼的運行,但是,完全取決於瀏覽器。也就是說 - 它可以純粹在腳本級別運行,假定對下一行代碼無知識並運行純粹基於軟件的堆棧;或者它可以執行一些JIT以使代碼更接近硬件並且(希望)提高速度。

2

任何語言都可以編譯和解釋。在這兩種情況下,一段軟件都必須讀取源代碼,將其分解,解析等,以檢查某些要求,然後爲程序的每個部分分配含義。唯一的區別是,編譯器隨後繼續生成代碼,而其他語言(JVM字節碼,或JavaScript,或機器代碼,或其他完全不同)的代碼具有(幾乎)相同的含義,而解釋器立即執行程序的含義。

現在,實際上它既簡單又複雜。在許多語言中,更簡單的是可以更好地適應其中的一種語言 - Java是靜態類型的,並且對於程序的意義而言,動態性相對較弱,因此您可以編譯它,從而完成一些本來需要完成的工作運行。 JavaScript是動態類型的,你不能在運行時決定很多事情(比如+是加法還是串聯),所以編譯並不能提供很多性能。然而,編譯器和解釋器的混合(編譯爲簡化的中間表示,然後解釋和/或編譯)在動態語言實現中越來越受歡迎。然後有一個事實,即現代JavaScript實現編譯,事實上V8 從來沒有解釋任何東西。

0

由於Java和Javascript之間編譯級別的複雜性,JavaScript中存在一些限制。由於字節碼在針對特定操作系統編寫的JVM平臺上執行,並且硬件字節碼執行對於訪問系統資源具有更多優勢。即使C代碼也可以嵌入到Java字節碼中。另一方面,由於Javascript只能在瀏覽器上運行,因此與它無關。

在Java平臺上有兩個主要部分。 Java編程語言和JVM。它使每個部分只關注他們自己的領域。這就是爲什麼JVM不會使用Java編程語法進行降級的原因。它類似於運行C代碼鏈接時不處理C代碼但彙編。

字節碼在JVM平臺很可能在C.

的組裝最終所有表示被轉換成二進制表示,然後將electirical信號以某種方式。它證明我們需要編程水平。

+0

C代碼不能嵌入到JVM代碼中。那麼,它可能可以但它不會被執行。 CLR確實允許「不安全」的代碼,但這是完全不同的事情。另外,關於JS和外部世界,請參閱V8,node.js和common.js。 – delnan 2012-08-07 20:29:47

+0

我的意思是使用JNI。你可以調用目標文件中的任何方法(dll,so) – 2012-08-07 20:31:02

+0

好的,這是真的(儘管我不會稱它爲「嵌入在java字節碼中」)。但是你也可以通過任何JavaScript引擎公開本地代碼。 – delnan 2012-08-07 20:32:36