2011-10-16 55 views
2

Java是獨立於平臺的,因爲它使用依賴於平臺的JVM來啓動Java程序。 JVM理解字節代碼並執行程序。我知道做這件事的老方法是口譯員。但是現在JVM正在使用JIT。但我不清楚JIT概念。我認爲,一個JVM可以將字節碼轉換成一個exe文件(對於Windows),然後我可以在沒有JVM的情況下運行這個翻譯後的程序。但我可以看到.net JIT生成的exe文件,但是我看不到在Java中生成的exe文件。Java程序和JVM生成的exe

  1. 我該怎麼做(從Java創建本機exe文件)?
  2. JVM生成的exe與同一個C應用程序的性能如何?
  3. Java如何處理靜態鏈接和動態鏈接?
+0

我不確定,但我認爲你不能從java創建本地代碼。 Java是一種解釋型語言,不能用本機代碼編譯。 –

+0

@Thomas Uhrig我也認爲java解釋語言,但爲什麼不解釋只有一次,當程序開始和aftter永遠使用所有的解釋代碼。像編譯 – ayengin

+0

Java是面向對象和c結構我也知道這一點too.But面向對象是必需的使編寫源代碼時的開發軟件變得容易。但是生成的輸出並不是面向對象的,因此jvm代碼優化可以採取這種方式。 – ayengin

回答

4

的幾點思考:

  1. 您可以直接用核心Java不生成EXE和JVM肯定不能做到這一點。它仍然在JVM中運行字節碼。這裏運行的實際exe文件是java.exe。
  2. 由於JIT生成相當快速的代碼,因此很難說exe是否會顯着更快。
  3. 如果這是你的意思,Java不會創建dll,但它可以通過JNI和JNA與格式良好的dll(不是.Net dll's)進行交互。如果你想與.Net庫進行交互,我認爲你需要走另外一條路徑,比如套接字或者COM接口。

同樣作爲之外,還有做存在從Java類創建EXE的程序,但大多數創建仍需要一個JVM文件,和良好的是那些不相信是不是免費的。

+0

爲什麼「它仍然運行JVM中的字節碼」。 – ayengin

2
  1. 這樣做沒有多大意義。
  2. 有時會更快,有時會更慢。
  3. 不知道。
1

我認爲,一個JVM可以字節碼轉換成(適用於Windows)一個exe和在此之後,我可以運行沒有JVM這個轉換的程序。

這是不正確的。

實際上,Hotspot JIT編譯器通過將各個方法編譯爲正在運行的JRE中的本機代碼來工作。它們通常只會在編譯方法被調用幾次之後編譯才能收集典型執行路徑上的統計信息。 Hotspot JIT編譯器沒有生成「exe」。

1)我該怎麼做(從Java創建本機exe文件)?

有第三方應用程序會這樣做。但是,通過這樣做,您將失去JIT編譯的許多優點,例如優化當前程序運行的執行模式。

2)JVM生成的exe與同一個C應用程序的性能如何?

這取決於應用程序。

3)Java如何處理靜態鏈接和動態鏈接?

Java不處理這個問題。它取決於您用來創建可執行文件的第三方應用程序。


我會建議不要走這條路。如果將代碼作爲「.exe」文件分發至關重要,則可能不應使用Java。

0

我怎麼能做到這一點(創建從Java本機exe文件)?

有一種常見的錯誤概念,認爲這在某種程度上會更好。不過,我還沒有看到它的情況。有像Excelsior JET這樣的產品可以編譯二進制文件。 GCC可以爲Java 1.4編譯一個二進制文件,但這不是當前的項目AFAIK。

JVM生成的exe與同一個C應用程序的性能如何?

你不能比較兩者。如果你想要一個面向對象的程序,你不能用C編寫這個程序,並且如果不運行它肯定會慢得多。如果你想寫一個C風格的程序,用C編寫它。

Java如何處理靜態鏈接和動態鏈接?

JVM執行動態的後期鏈接。如果事實上它可以在加載和卸載類加載器時多次鏈接和重新鏈接代碼。