回答

1

我認爲,不管你是編譯的一種或多種語言,回答你的編譯代碼將在不同平臺上運行是否依賴於虛擬機的存在,如JVM(Java虛擬機)或CLR(公共語言運行時),可以解釋指令並在不同的平臺上執行它們。由於不同的機器體系結構支持不同的指令集(這裏的指令集是指彙編),因此不可能將代碼編譯爲機器語言,以便它可以在不同的平臺上運行。正如你對最後一個問題的迴應所表明的那樣,多種語言將編譯成Java字節碼(例如),它可以鏈接在一起並在任何具有JVM的機器上運行。因爲有許多不同機器體系結構的JVM的實現,所以Java字節碼可以在任何這些體系結構上運行。

2

如果您編譯爲與機器無關的字節碼(或類似的東西),然後解釋每個目標機器上的字節碼,則這相對容易,因爲它與編譯多種語言以在單臺機器上運行相同。很多人已經解決了這個問題,以不同程度的解決方案。

如果你想編譯絕對機器代碼,你必須包括對每臺機器將運行在機器代碼,然後爲每個目標機器加載器必須知道如何選擇合適的機器代碼。

蘋果試圖與「胖二進制」,在未來的日子時的PowerPC Mac和Mac電腦68K不得不和平共處。它的工作,但它不完全是一個嚎叫的成功。

0

是的,可以一起編譯多種語言,以便它們可以在多個平臺上工作。有幾個方法:

虛擬機

ScalaJava都編譯到JVM,它運行在多種平臺。另一個例子是.NET,它包含許多種語言,可以通過Mono Project在Windows或Linux上運行。

脂肪的二進制文件

一些文件格式是基於不同的平臺上運行fat binaries。 Apple曾兩次使用它們在硬件實現之間進行轉換。

0

還有另外一種方法,我剛纔聽說過。

而是分發您的應用程序二進制的機器(或字節碼),你在「大多編譯」的形式分發,在編譯器的中間語言。只要所有語言的編譯器都使用通用中間表單,並且所有後端代碼生成器都使用該通用中間表單,則可以在目標上安裝所需的特定後端,然後分發中間體。

MacOberon使用該方法來同時靶向680X0和PowerPC MAC硬件。他們呼籲「苗條的二進制文件」。完全相同的「二進制」被分配給機器的任何一種風格,而後端通過生成適當的代碼基本上完成了編譯。有趣的是,這種方法並不比傳統方法慢很多,因爲從磁盤物理讀取「二進制」到存儲器中的成本絕對控制着應用程序的啓動時間。

相關問題