複製鏈接
請複製以下鏈接發送給好友

編譯並執行

鎖定
編譯並執行是指編譯一個程序並把目標程序裝入主內存執行的一種過程。能夠執行這種功能的編譯程序稱為“裝入並執行編譯程序”。當編譯以同一源語言編寫的批量源程序並逐個執行時,常常用到這種編譯程序。裝入並執行編譯程序能夠保留在內存中,直到整個批量執行完成為止,而不必在每次編譯新的源程序時都裝入內存一次。
中文名
編譯並執行
外文名
compile and go
領    域
電子工程

編譯並執行編譯器

編譯器(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), 最後打包好的文件就可以給電腦去判讀運行了。 [1] 

編譯並執行歷史

早期的計算機軟件都是用匯編語言直接編寫的,這種狀況持續了數年。當人們發現為不同類型的CPU編寫可重用軟件的開銷要明顯高於編寫編譯器時,人們發明了高級編程語言。由於早期的計算機的內存很少,當大家實現編譯器時,遇到了許多技術難題。
大約在20世紀50年代末期,與機器無關的編程語言被首次提出。隨後,人們開發了幾種實驗性質的編譯器。第一個編譯器是由美國女性計算機科學家葛麗絲·霍普(Grace Murray Hopper)於1952年為A-0系統編寫的。但是1957年由任職於IBM的美國計算機科學家約翰·巴科斯(John Warner Backus)領導的FORTRAN則是第一個被實現出具備完整功能的編譯器。1960年,COBOL成為一種較早的能在多種架構下被編譯的語言。
高級語言在許多領域流行起來。由於新的編程語言支持的功能越來越多,計算機的架構越來越複雜,這使得編譯器也越來越複雜。
早期的編譯器是用匯編語言編寫的。首個能編譯自己源程序的編譯器是在1962年由麻省理工學院的Hart和Levin製作的。從20世紀70年代起,實現能編譯自己源程序的編譯器變得越來越可行,不過還是用PascalC語言來實現編譯器更加流行。製作某種語言的第一個能編譯器,要麼需要用其它語言來編寫,要麼就像Hart和Levin製作Lisp編譯器那樣,用解釋器來運行編譯器。

編譯並執行教學用的編譯器

編譯器的構造與優化是計算機專業的大學課程,課程名稱一般為“編譯原理”或“編譯器”。通常在課程中包含了如何實現一種教學用程序語言的編譯器。一個著名的例子是20世紀70年代,瑞士計算機科學家尼克勞斯·維爾特(Niklaus Emil Wirth)用於講解編譯器的構造時使用的PL/0編譯器。儘管它很簡單,PL/0編譯器介紹了這個領域的幾個有影響的概念:
  1. 逐步求精的程序開發(也是 1971年 Wirth 的論文的標題)。
  2. 使用遞歸下降解析器。
  3. 使用EBNF指定語言的語法。
  4. 代碼生成器產生便攜P-code
  5. 在自舉問題的正式描述中使用T-diagram。 [2] 

編譯並執行編譯器輸出

編譯器的一種分類方式是按照生成代碼所運行的系統平台劃分,這個平台稱為目標平台。
有一些編譯器輸出的代碼,將運行於與編譯器所在相同類型的計算機和操作系統之上,這種編譯器叫做本地編譯器。輸出可以運行於不同的平台之上的編譯器,叫做交叉編譯器。由於嵌入式系統通常沒有軟件開發環境,因此,為這類系統開發軟件時,通常需要使用交叉編譯器。
編譯器所輸出於虛擬機上運行之代碼,編譯器和編譯器輸出的運行平台有可能相同,也有可能不同。因此,對於這類編譯器,不去區分它是本地編譯器還是交叉編譯器。 [3] 

編譯並執行即時編譯

即時編譯(英語:Just-in-time compilation),又譯及時編譯實時編譯動態編譯的一種形式,是一種提高程序運行效率的方法。通常,程序有兩種運行方式:靜態編譯與動態解釋。靜態編譯的程序在執行前全部被翻譯為機器碼,而解釋執行的則是一句一句邊運行邊翻譯。
即時編譯器則混合了這二者,一句一句編譯源代碼,但是會將翻譯過的代碼緩存起來以降低性能損耗。相對於靜態編譯代碼,即時編譯的代碼可以處理延遲綁定並增強安全性。
即時編譯器有兩種類型,一是字節碼翻譯,二是動態編譯翻譯。
微軟的.NET Framework,還有絕大多數的Java實現,都依賴即時編譯以提供高速的代碼執行。Mozilla Firefox使用的JavaScript引擎SpiderMonkey也用到了JIT的技術。Ruby的第三方實現RubiniusPython的第三方實現PyPy也都通過JIT來明顯改善了解釋器的性能。 [3] 

編譯並執行參見

參考資料
  • 1.    陳火旺, 劉春林, 譚慶平,等. 程序設計語言編譯原理 : 第3版[M]. 國防工業出版社, 2008.
  • 2.    孫家驌. 編譯原理[M]. 北京大學出版社, 2008.
  • 3.    戴桂蘭, 張素琴, 田金蘭,等. 編譯系統中間代碼的一種抽象表示[J]. 電子學報, 2002, 30(s1):2134-2137.