2010-07-05 95 views

回答

39

Java在編譯時編譯爲中間「字節碼」。這與編譯時編譯爲機器語言的C語言形成對比。 Java字節碼不能在編譯C代碼的方式下直接在硬件上執行。相反,字節代碼必須在運行時由JVM(Java虛擬機)解釋才能執行。像C這樣的語言的主要缺點是編譯時,該二進制文件只能在一個特定的體系結構(例如x86)上運行。

像PHP這樣的解釋型語言實際上是獨立於系統的,並且依賴於系統和體系結構特定的解釋器。這導致更大的可移植性(相同的PHP腳本在Windows機器和Linux機器上工作等)。但是,這種解釋導致顯着的性能下降。像PHP這樣的高級語言需要更多時間來解釋,而不是硬件可以執行的特定於機器的指令。

Java試圖找到純粹編譯語言(沒有可移植性)和純粹解釋語言(顯着更慢)之間的折衷。它通過將代碼編譯成更接近機器語言的形式(實際上,Java字節碼是一種機器語言,簡單地用於Java虛擬機)來實現此目的,但仍然可以在架構之間輕鬆傳輸。由於Java仍需要一個用於執行的軟件層(JVM),因此它是一種解釋型語言。但是,解釋器(JVM)在稱爲字節碼的中間形式上運行,而不是在原始源文件上運行。這個字節碼是Java編譯器在編譯時生成的。因此,Java也是一種編譯語言。通過這種操作,Java獲得了編譯語言的一些好處,同時也獲得瞭解釋型語言的一些好處。但是,它也繼承了這兩種語言的一些限制。

正如Bozho指出的那樣,通過使用Just in Time(JIT)編譯,有一些策略可以提高Java代碼(以及其他字節代碼語言,如.Net)的性能。實際過程根據需求的不同而有所不同,但最終結果是在編譯時將原始代碼編譯爲字節碼,但在運行之前,它將在運行時通過編譯器運行。通過這樣做,代碼可以以接近原生速度執行。有些平臺(我相信.Net會這樣做)保存JIT編譯的結果,替換字節碼。通過這樣做,程序的所有未來執行都將像程序從一開始就本地編譯一樣執行。

+0

「像PHP這樣的解釋型語言完全獨立於系統」 - 並非完全正確:['pow(2,36) '](http://www.php.net/manual/en/function.pow.php)將在32位系統上提供'6.87194767360e + 10',在64位系統上提供'68719476736'。 – amphetamachine 2010-07-05 20:39:36

+0

一個小小的挑逗 - 但字節碼是機器語言。有沒有什麼能阻止你擁有一個實現JVM規範的物理機器。在這種情況下,字節碼將直接在硬件上執行,並且不需要軟件層或解釋。 – emory 2010-07-06 00:20:48

+1

@amphetamachine公平不夠,「有效」如何? – 2010-07-06 02:04:26

6

這是一個很長的話題,你最好讀一下JIT。簡而言之,Java被編譯爲字節碼,稍後將字節碼編譯(在JVM中)爲機器碼。

+0

什麼是簡單的JIT? – JavaUser 2010-07-05 15:00:23

+4

@JavaUser大約需要10分鐘才能讀取這個答案。 – ant 2010-07-05 15:02:57

1

編譯:程序啓動前,程序在語法上是一個正確的Java程序。

解釋:在不同的平臺上運行相同的(字節)代碼。

編譯:當你的程序編譯正確時,你可以確保有80%的軟件錯誤得到控制。並且您的代碼不會停止,因爲您沒有正確關閉代碼塊等。

解釋:您知道小程序是什麼嗎?這是Java推出時的「殺手級」應用程序。您的瀏覽器從網站下載小程序並在瀏覽器中運行小程序代碼。這不是很酷。但是,相同的小程序在Windows,Linux,Macs,Solaris上運行...因爲運行/解釋媒介語言:字節碼。

+2

答案是非常抽象的。你可以推薦使用 – JavaUser 2010-07-05 15:03:03

2

Java被編譯成字節碼而不是二進制文件。字節代碼不能直接執行,它們需要Java虛擬機及時編譯並在運行時再次將它們編譯爲機器代碼。

在一個非常基本的層面上,它將程序員從JVM所在的本地機器上編寫的代碼分開,因此具有更好的可移植性。編譯爲字節碼有助於及時編譯性能,縮小文件大小,並且或多或少有助於隱藏真實代碼。 (它也消除了一些編譯時間錯誤)

2

Java被認爲是「編譯」語言,因爲代碼是編譯爲轉換爲字節碼格式,然後由Java虛擬機(JVM)運行。這在性能和代碼優化領域提供了幾個優勢,更不用說保證代碼的正確性了。

它被認爲是一種「解釋」語言,因爲在字節碼編譯後,它可以在任何安裝了JVM的機器上運行。 Java就是這樣一種解釋型語言,它在很大程度上不依賴於正在運行的平臺。這種行爲與Perl,Python,PHP等其他解釋型語言相似。

Java程序可以在沒有源代碼的情況下在任何系統上運行的一個理論缺點是,雖然這種方法分佈確保跨平臺兼容性,開發人員沒有理由發佈其源代碼,從而在「跨平臺」和「開源」這兩個詞語的意識形態意義之間形成楔形。

11

爲什麼我們說Java是編譯和解釋語言。

因爲源代碼(.java文件)是編譯成字節碼(.class文件),然後執行解釋Java Virtual Machine(也稱爲JVM)(在JVM可以做進一步的優化,但此是另一個故事)。

什麼優勢在這個(被編譯/解釋)

可移植性。只要安裝了JVM(「編譯一次,在任何地方運行」),就可以在任何平臺上執行相同的字節碼。

1

Java是一種完整的面向對象的編程語言。它是獨立的平臺 ,通常被解釋而不像C/C++那樣編譯。 Java使用獨立的體系結構中立的字節碼。也就是說,它被設計成與機器無關。字節代碼由Java虛擬機(JVM)解釋和執行。