我正在閱讀Herbert Schildt的書「Java:The Complete Reference」,他在那裏寫道Java是可移植的並且與架構無關。這兩個概念有什麼區別?我無法從文本中理解它。「architecture-neutral」和「portable」有什麼區別?
回答
看看這個white paper on Java。
基本上他們說除了在多個環境中運行(因爲在JVM中被解釋)之外,它也運行相同而不管環境如何。前者是它的便攜性,後者是使其與建築無關的原因。例如,int的大小不會基於平臺而變化;它由JVM建立。
本書意味着字節碼獨立於程序運行的底層平臺,與架構無關。例如,如果您的操作系統是32位或64位,則Java字節代碼是完全相同的。您不必重新編譯32位或64位的Java源代碼。 (所以,「架構」是指CPU架構)。
「便攜式」意味着一個編寫爲在一個操作系統上運行的程序可以在另一個操作系統上運行而不會改變任何內容。使用Java,您甚至不必重新編譯源代碼;例如,在Windows上編譯的* .class文件適用於Linux,Mac OS X或您擁有Java虛擬機的任何其他操作系統。
請注意,您必須注意一些事情,以使Java代碼真正可移植。例如,如果您在Java應用程序中硬編碼Windows風格的文件路徑(C:\ Users \ Myself ...),則無法在其他操作系統上運行。
我懷疑他意味着代碼可以在許多平臺上運行而無需重新編譯。 也可以編寫處理底層系統的代碼而不用重寫或條件。
E.g.來自32位Windows系統的序列化對象可以在64位Linux系統上讀取。
環顧四周,我發現了另一本書,描述了兩者之間的區別。
對於架構中立,編譯器將生成一個與架構無關的對象文件,這意味着編譯的Java代碼(字節碼)可以在許多處理器上運行,因爲存在Java運行時。
對於便攜式,這意味着規範中沒有實現相關的方面。例如,在C++中,int可以是16位或32位,取決於誰在實現規範,因爲在Java中,int總是32位。
我從另一本書(Core Java 2:Fundamentals)中獲得了我的信息,因此它可能與他的含義有所不同。這裏是一個鏈接:Core Java 2: Fundamentals
可移植的C程序:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Hello, World!");
return (EXIT_SUCCESS);
}
您可以採取的C程序和一個C語言編譯器編譯它在任何機器上就了事(假設它支持的printf ...我猜測一些事情可能沒有)。
如果你在Windows上編譯它並嘗試在Mac上運行該二進制文件,它將無法工作。
用Java編寫的相同類型的程序也可以在任何安裝了Java編譯器的機器上編譯,但生成的.class文件也可以在任何帶有Java VM的機器上運行。這是建築中立的部分。
所以,便攜式是一個源代碼的想法,而建築中立是一個可執行的想法。
用於在此場景中比較C和java的+1 ... – iAmLearning 2014-03-12 11:08:44
java中有3個相關的特性。
- 平臺無關 - >這意味着Java程序可以在任何操作系統上運行,而無需考慮其供應商。它通過使用稱爲「BYTE CODE」的MAGIC CODE來實現。 JVM然後在運行時解釋它,或使用JIT(Just in Time)編譯將其編譯爲正在運行的體系結構(例如i386)的機器代碼。
- 架構中立 - >這意味着Java程序可以在任何處理器上運行,而不考慮其供應商和體系結構。所以它避免了重建問題。
- 便攜式 - >如果一個編程語言/技術滿足上述兩個特點,就被認爲是純便攜式的。
.class文件是可移植的,因爲它可以在任何操作系統上運行。原因是,由JVM生成的.class文件對於所有操作系統都是相同的。另一方面,JVM與操作系統不同,但它爲所有操作系統生成相同的.class文件,因此JVM在架構上保持中立。
Architecture Neutral和Portable之間的區別是什麼? 架構中立:Java是架構中立的編程語言,因爲Java允許其應用程序在一個硬件架構上編譯並在另一個硬件架構上執行。便攜式:Java是一種可移植的編程語言,因爲Java能夠執行其應用程序以及所有操作系統和所有硬件系統。
在條款的Java
Java體系結構中立的 - 在這裏,我們正在談論的操作系統架構即Java的生成中間字節碼(二進制代碼)(由JVM處理),並允許Java代碼在任何可以使用Java虛擬機的操作系統上運行(不論其OS操作系統體系結構如何處理內存分配,兌現,註冊處理,處理32位或64位位代碼,同時解釋代碼就像每個解釋器一行一行地執行代碼 - 這是由jvm在硬件和操作系統配置方面的處理)。
便攜式(如轉移,平臺無關,甚至在源代碼中的條款一般含義是解決所有,即簡單地意味着許多支持)
Java的便攜式裝置在一臺機器渣機代碼編寫和運行在任何具有適當操作系統的JVM的機器上
- 1. APR(Apache Portable Runtime)1.3和0.9有什麼區別?
- 2. 有什麼區別`和$(Bash中有什麼區別?
- 3. 有什麼區別? :和||
- 4. &&和||有什麼區別?
- 5. 「/」和「/ *」有什麼區別?
- 6. 有什麼區別:。!和:r!?
- 7. ==和===有什麼區別?
- 8. Appender和〜有什麼區別?
- 9. $ @和$ *有什麼區別?
- 10. is和=有什麼區別?
- 11. #.00和#。##有什麼區別?
- 12. `==`和`is`有什麼區別?
- 13. '=='和'==='有什麼區別?
- 14. /和/#/有什麼區別?
- 15. | 0和~~有什麼區別?
- 16. `&`和`ref`有什麼區別?
- 17. ==和===有什麼區別?
- 18. ==和===有什麼區別?
- 19. `{}`和`[]`有什麼區別?
- 20. JavaScript和=== ===有什麼區別?
- 21. difftime和' - '有什麼區別?
- 22. =和==有什麼區別?
- 23. xtype和別名有什麼區別?
- 24. Mixpanel:識別()和people.identify()有什麼區別?
- 25. 有什麼區別
- 26. 有什麼區別
- 27. 有什麼區別?
- 28. 有什麼區別?
- 29. 有什麼區別?
- 30. 有什麼區別
偉大的鏈接,謝謝! – Sergey 2011-04-28 04:17:02
我覺得它含糊不清,但兩者基本上都是一樣的。可以移植到任何架構。 – xploreraj 2016-07-25 11:31:01
沒有。如果一個程序可以移植到任何體系結構中,但是在不同的體系結構上運行的方式會有所不同,而不是與體系結構無關。 – 2016-07-25 12:31:38