2010-11-16 68 views
1

讓我們考慮一下在Windows中編譯的簡單C程序。C程序對CPU和操作系統的依賴關係

  1. 我可以在英特爾CPU機器上編譯程序,並在AMD CPU(相同操作系統)上運行它。那麼這是否意味着CPU的指令集是相同的?

  2. 爲什麼不相同程序的機器上使用不同的操作系統和相同的CPU上運行?

+0

關於2),請參閱http:// stackoverflow的答案。com/questions/1442921/how-un-portable-is-assembly-language-really – 2010-11-16 23:46:37

回答

3

Intel和AMD線在指令中的大的重疊設置,他們實現(例如有時一個接一個發明一些新的東西,還有一定的差距,直到其他公司趕上) - 這就是爲什麼你可以在兩種架構上運行程序。這同樣是你無法在其他CPU架構上運行它的原因 - 它們對於初學者沒有相同的指令集,但有很多不同的東西。

操作系統也有其不同之處。例如,在Windows下編譯程序時,通常會得到一個.exe文件。該.exe的格式只有Windows可以理解,並且與Linux所使用的格式完全不同。

此外,OS給出的支持完全不同--Windows具有不同的內核函數,您可以調用與例如OpenBSD的。即使在更抽象的層面上,它也是不兼容的。例如。 Windows使用驅動器號如C:\,D:\等來標記驅動器,例如在Linux下,它是一個安裝不同分區的大文件系統,例如在/媒體等等。

有不同的嘗試,例如Wine和Cygwin,在另一個平臺上執行程序。使用Wine,您可以直接在Linux上執行Windows可執行文件,因爲它試圖模擬Windows提供的內容(但並非一切正常)。 Cygwin的是不同的產品 - 你可以運行同樣的工作在Linux上的GNU程序的Windows程序,但它們需要專門編寫 - 只是給你一個暗示,它只是兩個世界。

這就是爲什麼Java和.NET(在Linux上支持Mono)嘗試將這兩者結合在一起的原因。當你創建一個Java應用程序時,你應該可以在Linux上運行它,代碼大致相同 - 有些東西可能不一樣,但大部分是。

+0

很好的解釋總體感謝 – bege 2010-11-16 23:54:55

0

它們是一樣的,或者至少你的程序只使用一個公共子集。

關於第二個問題,有幾個常見的原因包括:

  1. 不同的操作系統需要的可執行文件的不同格式
  2. 不同的操作系統通常具有不同的功能的程序使用
  3. 不同的操作系統使用不同調用它們提供的方法
0

1)Intel CPU和AMD CPU是故意用這種方式生產的。您不能運行爲例如ARM CPU上的SPARC CPU編譯的程序 。

2)理論上可以。比方說,Linux有這個Wine的東西來模擬Windows。 許多Windows程序在Wine下的Linux上完美運行。在通用處理器的