1. 程式人生 > >編譯器和交叉編譯

編譯器和交叉編譯

bootstra oss 打包 虛擬 rec 輸出 應用程序 目的 program

來自維基百科 點擊打開。

編譯器compiler),是一種計算機程序,它會將用某種編程語言寫成的源代碼(原始語言),轉換成另一種編程語言(目標語言)。

它主要的目的是將便於人編寫、閱讀、維護的高級計算機語言所寫作的源代碼程序,翻譯為計算機能解讀、運行的低階機器語言的程序,也就是可執行文件。編譯器將原始程序(source program)作為輸入,翻譯產生使用目標語言(target language)的等價程序。源代碼一般為高級語言(High-level language),如Pascal、C、C++、C# 、Java等,而目標語言則是匯編語言或目標機器的目標代碼(Object code),有時也稱作機器代碼(Machine code)。

一個現代編譯器的主要工作流程如下:

源代碼(source code)→ 預處理器(preprocessor)→ 編譯器(compiler)→ 匯編程序(assembler)→ 目標代碼(object code)→ 鏈接器(Linker)→ 可執行文件(executables),最後打包好的文件就可以給計算機去判讀運行了。

編譯器輸出

編譯器的一種分類方式是按照生成代碼所運行的系統平臺劃分,這個平臺稱為目標平臺。

有一些編譯器輸出的代碼,將運行於與編譯器所在相同類型的計算機和操作系統之上,這種編譯器叫做本地編譯器。輸出可以運行於不同的平臺之上的編譯器,叫做交叉編譯器。由於嵌入式系統通常沒有軟件開發環境,因此,為這類系統開發軟件時,通常需要使用交叉編譯器。

編譯器所輸出於虛擬機上運行之代碼,編譯器和編譯器輸出的運行平臺有可能相同,也有可能不同。因此,對於這類編譯器,不去區分它是本地編譯器還是交叉編譯器。


交叉編譯器英語:Cross compiler)是指一個在某個系統平臺下可以產生另一個系統平臺的可執行文件的編譯器。交叉編譯器在目標系統平臺(開發出來的應用程序序所運行的平臺)難以或不容易編譯時非常有用。

交叉編譯器的存在對於從一個開發主機為多個平臺編譯代碼是非常有必要的。直接在平臺上編譯有時行不通,例如在一個嵌入式系統的單片機 ,因為它們沒有操作系統,所以直接編譯行不通。

交叉編譯器和源代碼至源代碼編譯器不同,交叉編譯器用於二進制代碼的跨平臺軟件開發,而源到源編譯器是將某種編程語言的程序源代碼作為輸入,生成以另一種編程語言構成的等效源代碼的編譯器,但兩者都是編程工具。

交叉編譯器的基本用法就是將構建環境與目標環境分開。常在下面幾種情況中使用:

  • 嵌入式計算機。這種設備的資源有限,舉例來說:微波爐有一個非常小的計算機來讀取其觸摸板和門傳感器,並向數字顯示器和揚聲器提供輸出,以控制用於烹飪食物。這臺計算機不足以運行編譯器,文件系統或開發環境,因為調試和測試需要更多的嵌入式系統資源,使得在目標機上編譯變得更不可能。采用交叉編譯,在資源足夠的機器上完成構建工作,就可以解決這個問題。
  • 編譯多個目標庫。舉個例子,一個公司可能希望支持不同版本或不同種類的操作系統,有了交叉編譯,便可以為每個目標設置一個編譯環境進行編譯。如:在Windows中為底層構造完全不同的Linux編譯程序;在計算機上為移動端操作系統構建程序。
  • 在服務器上編譯。類似於在多個機器進行編譯,一個復雜的編譯可能會涉及到許多的編譯操作,可以將這些編譯操作放到空閑的機器上執行,無論其底層硬件或其運行的操作系統版本如何。
  • 引導一個新平臺。在為新平臺開發軟件,或者開發/使用未來平臺的仿真器時,則使用交叉編譯器來編譯必要的工具,如操作系統和本機編譯器。

程序虛擬機(比如JVM)也借鑒了當初開發交叉編譯器的理念。它可以用同一份輸出在多個目標系統上運行,但是編譯後的代碼必須運行在虛擬機上。

編譯器和交叉編譯