當前位置:首頁 » 編程軟體 » 類文件由編譯器

類文件由編譯器

發布時間: 2022-05-07 00:14:57

java命令解析以及編譯器,虛擬機如何定位類

1、安裝JDK,配置環境變數。 不將JDK所在的目錄配置到系統環境變數中,系統怎麼能找到JDK中的編譯器,解釋器在哪呀?如果不指明JDK的bin文件夾的位置,在shell中是無法找到javac/java命令的。這點就不多說了。 2、編譯,解釋執行Java程序。【 javac命令/java命令】 (1) Test.java源代碼 Java代碼 //預設包,該程序源代所在位置: e:/project/ Test.java public class Test{ ..... public static void main(String[] args){ ..... } } 編譯命令: 【javac e:/project/Test.java 】 在e:/project目錄下生成了Test.class 注意: ① 如果想要將Test.class生成在指定目錄下,可以使用javac -d命令,如【 javac -d c:/ e:/project/Test.java 】 在c:/目錄下生成T est.class(即e:/Test.class) ② javac -cp 中的-cp並不是指定Test.java的目錄,這一點不要誤解了。-cp/-classpath只能是指定類文件(.class文件)的路徑。上面的命令不能寫成: java -cp e:/project Test.java 解釋執行命令 :【 j ava -cp e:/project Test】 將調用解釋器執行e:/project中的Test.class位元組碼。 注意: ① -cp 是指定用戶類文件的位置,比如上面的Test.class的位置。這里因為要尋找Test.class類文件,而不是Test.java源代碼文件,所以要通過-cp指定。千萬沒有這樣的執行命令: java e:/project/Test (2) Test.java源代碼 Java代碼//預設包,但源代碼中引用了一個JAR包內的自定義類,這個JAR包位於c:/目錄下 import net.single.util.SL; //導入自定義JAR包中的類 public class Test{ private SL aObject=new SL(); //初始化JAR中的SL類 public static void main(String[] args){ ...... } } 編譯命令: 【 javac -cp c:/single.jar e:/project/Test.java】 在e:/project目錄下生成了Test.class 注意: 如果當前你要編譯的java文件中引用了其它的類,但該引用類的.class文件不在當前目錄下(或在其他目錄下,或在.zip/.jar內),這種情況下就需要在javac命令後面,加上-cp/-classpath參數來指明這些類的位置。 一般來說有三種指定方式: ① 絕對或相對路徑:javac -cp c:/single.jar Test .java 或 javac -cp ../single.jar Test .java (其中.. 表示上一級目錄)
② 系統變數:javac -cp %CLASSPATH% Test .java (其中:%CLASSPATH%表示使用系統變數CLASSPATH的值進行查找,這里假設single.jar的路徑就包含在CLASSPATH系統變數中) ③ 當前目錄: javac -cp ./single.jar Test.java (其中. 表示當前目錄) 解釋執行命令 :【 java -cp c:/single.jar;e:/project Test】 注意: ① -cp的路徑不僅指定了所需要的single.jar的位置,還必須指出編譯後的Test.class的位置。 ② 類路徑中的不同項目要用分隔符區分,Unix系統的分隔符是冒號(:),Windows的是分號(;) (3) Test.java 源代碼 Java代碼//該類在net.single包中,類中沒有引入其他目錄下的自定義類 package net.single; public class Test{ ..... public static void main(String[] args){ ..... } } 編譯命令:【javac -d . e:/project/Test.java 】 注意: ① 如果沒有-d而直接編譯javac e:/project/Test.java。將會在 e:/project 目錄下直接生成一個Test.class,但此Test.class無法解釋執行,因為它實際上在e.single包中。所以必須將包一起編譯出來,這里用了-d參數。 ② 上面的編譯結果將在e:/目錄下 自動根據包的結構形式創建文件目錄,e:/net/single/Test.class 解釋執行命令 :【java -cp e:/ net.single.Test 】 現在我們總結一下: [a.] 沒有IDE環境,編譯一個大型項目是很困難的,因為必須把需要被其他類引用的類先編譯,而且最好把包結構一起編譯出來。所以一般命令格式如下: 編譯: javac -cp (需要引入的類文件路徑1;需要引入的類文件路徑2;....) -d (編譯出的類文件存放的位置目錄) (待編譯文件路徑) 執行: java -cp (需要解釋執行的類文件路徑) (帶包的類文件) 例:現在要編譯一個類源碼: Test.java,其中該類位於E:/project/下 (1. Test源代碼中使用了一個JAR包中的類,這個single.jar包位於C:/目錄下。 (2. Test源代碼中使用了一個自定義類Content,這個類的源代碼Content.java位於E:/下 (3. Test所在包為net.single,Content所在包為net.single.cont 解決: 步1:由於Test使用了Content類,所以必須先編譯Content,而且Content類在E:/目錄下,而且 屬於包net.single.cont 編譯命令: javac -d . e:/Content.java 編譯結果: 在Content.java的當前目錄下生成了一個 net/single/cont/Content.class 文件(帶包結構),即e:/net/single/cont/Content.class 步2:編譯Test類,並指明所引入的single.jar包和Content.class的位置 編譯命令: javac -cp c:/single.jar;e:/net/single/cont -d . e:/project/Test.java 編譯結果: 在Test的上一級目錄下生成了一個 net/single/Test.class 文件,即e:/ net/single/Test.class 步3:解釋執行Test.class 執行命令: java -cp c:/single.jar;e:/ net.single.Test 3、編譯器,虛擬機如何定位到類的 Java代碼package net.single; import java.util.*; import net.single.util.*; public class Test{ //SingleUtil類在c:/single.jar中的net.single.util包下 private SingleUtil sut=new SingleUtil(); } 編譯命令: javac -cp c:/single.jar -d . e:/project/Test.java 編譯器首先找到e:/project/Test.java。然後對Test源代碼進行編譯,當編譯到創建SingleUtil類對象的語句時,編譯器要開始尋找SingleUtil.class的位置。編譯器首先查找包含這個類的所有包的位置,並查詢所有的import指令,確定其中是否包含了被引用了的類。 如上面的Test.java,編譯器將試圖查找java.lang.SingleUtil,java.util.SingleUtil,net.single.util.SingleUtil以及當前包中的SingleUtil(即net.single.SingleUtil)。編譯器將在三個部分中查找類文件: (1) 在JDK的lib目錄下的標准類庫文件中查找java.lang,java.util和net.single.util包。顯然只能找到java.lang和java.util包。然後在這兩個包中查找SingleUtil類文件。當然是找不到的。 (2) 在編譯命令中-cp參數表明的類路徑(C:/single.jar)下查找java.lang,java.util和net.single.util包。顯然只能找到net.single.util包,然後在裡面找到SingleUtil類文件。 (3) 在Test.java的當前目錄下查找SingleUtil,也是沒有的。 如果沒有找到SingleUtil,或者找到多個SingleUtil。

㈡ C語言程序編譯後產生哪些類型的文件這些文件的作用是什麼

1、以GCC編譯器為例,可以分為四步。
第一步是預處理,包括語法檢查等工作。
gcc
-P
abc.c
第二步由源程序生產匯編語言代碼。
gcc
-S
abc.c
會生成abc.s文件,這個文件里就是匯編代碼。
第三步編譯器生成目標代碼,一個源文件生成一個目標代碼。
gcc
-c
abc.c
會生成abc.o
第四步連接器從目標代碼生成可執行文件。
gcc
abc.o
2、目標代碼包括機器碼和符號表(函數及變數名)。連接器的主要作用是通過符號表在庫文件和其他模塊中找到在目標代碼中引入或未定義的符號(函數及變數名),將幾個目標代碼合成可執行文件。

㈢ C#類被編譯之後成為什麼文件

類被編譯不會生成文件,編譯器也會組織你進行編譯。
如果你想做dll,要創建dll工程

㈣ eclipse類文件編譯器源文件找不到 80分答案!!!

在網上找到的,希望對你有幫助.
用Eclipse平台進行C/C++開發
關鍵詞: eclipse
我們將概述如何在 C/C++ 開發項目中使用 Eclipse 平台。盡管 Eclipse 主要是一個 Java 開發環境,但其體系結構確保了對其它編程語言的支持。在本文中,您將學習如何使用 C/C++ 開發工具箱(C/C++ Development Toolkit,CDT),它是可用於 Eclipse 的最佳 C/C++ 工具箱。

C 和 C++ 語言都是世界上最流行且使用最普遍的編程語言,因此 Eclipse 平台(Eclipse Platform)提供對 C/C++ 開發的支持一點都不足為奇。因為 Eclipse 平台只是用於開發者工具的一個框架,它不直接支持 C/C++;它使用外部插件來提供支持。本文將向您演示如何使用 CDT — 用於 C/C++ 開發的一組插件。CDT 項目致力於為 Eclipse 平台提供功能完全的 C/C++ 集成開發環境(Integrated Development Environment,IDE)。雖然該項目的重點是 Linux,但它在可使用 GNU 開發者工具的所有環境(包括 Win32(Win 95/98/Me/NT/2000/XP)、QNX Neutrino 和 Solaris 平台)中都能工作。

CDT 是完全用 Java 實現的開放源碼項目(根據 Common Public License 特許的),它作為 Eclipse SDK 平台的一組插件。這些插件將 C/C++ 透視圖添加到 Eclipse 工作台(Workbench)中,現在後者可以用許多視圖和向導以及高級編輯和調試支持來支持 C/C++ 開發。

由於其復雜性,CDT 被分成幾個組件,它們都採用獨立插件的形式。每個組件都作為一個獨立自主的項目進行運作,有它自己的一組提交者、錯誤類別和郵件列表。但是,所有插件都是 CDT 正常工作所必需的。下面是 CDT 插件/組件的完整列表:

主 CDT 插件(Primary CDT plug-in)是「框架」CDT 插件。

CDT 功能 Eclipse(CDT Feature Eclipse)是 CDT 功能組件(Feature Component)。

CDT 核心(CDT Core)提供了核心模型(Core Model)、CDOM 和核心組件(Core Component)。

CDT UI 是核心 UI、視圖、編輯器和向導。

CDT 啟動(CDT Launch)為諸如編譯器和調試器之類的外部工具提供了啟動機制。

CDT 調試核心(CDT Debug Core)提供了調試功能。

CDT 調試 UI(CDT Debug UI)為 CDT 調試編輯器、視圖和向導提供了用戶界面。

CDT 調試 MI(CDT Debug MI)是用於與 MI 兼容的調試器的應用程序連接器。

現在,讓我們研究一下如何在實際應用程序中使用這些組件。圖 1 顯示了 Eclipse 中的 C/C++ 項目:

圖 1. 在帶有 CDT 插件的 Eclipse 中編輯 C/C++ 項目

安裝和運行 CDT

在下載和安裝 CDT 之前,首先必需確保 GNU C 編譯器(GNU C compiler,GCC)以及所有附帶的工具(make、binutil 和 GDB)都是可用的。如果正在運行 Linux,只要通過使用適用於您分發版的軟體包管理器來安裝開發軟體包。在 Windows 平台上,將需要安裝 Cygwin 工具箱。Cygwin 是用於 Windows 的類 UNIX 環境,它包括 GCC 移植以及所有必需的開發工具,包括 automake 和 GNU 調試器(GNU Debugger,GDB)。Cygwin 是在 cygwin1.dll 庫基礎上構建的。Cygwin 的備用解決方案是 Minimalist GNU for Windows(MinGW)。該工具是一組可免費獲取、自由分發的特定於 Windows 的頭文件和導入庫,這些頭文件和導入庫與 GNU 工具集(它們允許您生成不依賴於任何第三方 DLL 的本機 Windows 程序)結合在一起。如果您想要創建與 POSIX 兼容的 Windows 應用程序,那麼 MinGW 是最佳選擇。MinGW 甚至可以在 Cygwin 安裝之上工作。Solaris 和 QNX 要求您從網際網路下載並安裝其特定的 GCC、GNU Make binutils 和 GDB 移植。

假設您安裝了適當的 Java SDK/JRE 和 Eclipse 平台 SDK,並且它們都正常運行。CDT 以兩種「方式」可用:穩定的發行版和試運行版(nightly build)。試運行版未經完全測試,但它們提供了更多的功能並改正了當前錯誤。安裝之前,請檢查磁碟上是否存在先前版本的 CDT,如果存在,請確保完全除去它。因為 CDT 沒有可用的卸載程序,所以需要手工除去它。為了檢查先前版本是否存在,轉至 CDT 插件所駐留的目錄:eclipse/plugins。接著,除去所有以 org.eclipse.cdt 名稱開頭的目錄。需要做的最後一件事情是從 workspace/.metadata/.plugins 和 features 除去 CDT 元數據目錄 or.eclipse.cdt.*。

下一步是下載 CDT 二進制文件。注意:請下載適合於您操作系統的正確的 CDT。遺憾的是,即使 CDT 是用 Java 編寫的,它也不是與平台無關的。接著,將歸檔文件解壓到臨時目錄中,從臨時目錄將所有插件目錄內容都移到 Eclipse plugins 子目錄。還需要將 features 目錄內容移到 Eclipse features 子目錄中。現在,重新啟動 Eclipse。Eclipse 再次啟動之後,更新管理器將告訴您它發現了更改並詢問您是否確認這些更改。現在您將能夠看到兩個可用的新項目:C 和 C++。

創建新項目

在 Eclipse 中安裝 CDT 之後,瀏覽至 File => New => Project,在那裡,您將發現三個新的可用項目類型:C(「Standard C Make Project」)、C++(「Standard C++ Make Project」)和「Convert to C or C++ Projects」。從「Standard Make C++ Project」開始,為您的項目創建源代碼文件。在 C/C++ Projects 視圖中,單擊滑鼠右鍵,然後選擇 New => Simple => File。命名您的文件並保存它。您可能會用這種方法創建許多頭文件以及 C/C++ 實現代碼文件。最後當然是 Makefile,GNU Make 將使用它來構建二進制文件。對該 Makefile 使用常見的 GNU make 語法(請參閱參考資料)。請記住:Makefile 要求您使用 Tab 字元而不是空格來產生縮進行。

您通常會將現有的源代碼導入 Eclipse(請參閱圖 2)。CDT 為執行這一操作提供了一種便捷的方法:即使用 Import 向導,將文件從文件系統目錄復制到工作台。轉至主菜單欄,選擇 File => Import => File System。單擊 Next,打開源目錄,選擇您想要添加文件的目錄。單擊 Select All 以選擇目錄中的所有資源,然後從頭到尾檢查,取消選擇您不打算添加的那些資源。指定將作為導入目標的工作台項目或文件夾。還可以通過從文件系統拖動文件夾和文件並將它們放入 Navigator 視圖中,或者通過復制和粘貼來導入文件夾和文件。

圖 2. 將現有的源代碼導入 CDT 項目

關鍵的 CDT IDE 功能

CDT IDE 是在 CDT UI 插件所提供的通用可擴展編輯器基礎上構建的。然而,該模塊仍處於開發階段,所以它仍缺少一些重要的實用程序,如類瀏覽器或語言文檔瀏覽器。CDT IDE 的主要功能是:

語法突出顯示:CDT IDE 識別 C/C++ 語法,並為語法突出顯示提供了完全可配置的代碼著色以及代碼格式化功能:

圖 3. 不成功的編譯之後突出顯示的語法錯誤標記

提綱:Outline 窗口模塊提供了有關出現在源代碼中的過程、變數、聲明以及函數的快速視圖。利用 outline,您可以方便地找到源代碼中的適當引用,或者甚至搜索所有項目源代碼。

代碼輔助:這個代碼完成功能類似於可在 Borland C++ Builder 或 MS Visual Studio 中找到的功能。它使用了代碼模板,並且只有助於避免愚蠢的語法錯誤:

圖 4. 有助於使用正確的語言語法的代碼輔助功能

代碼模板:由代碼輔助功能使用的代碼模板是標准 C/C++ 語言語法結構的定義。您也可以定義自己的代碼模板來擴展您自己的快捷鍵,如用於 author 或 date 關鍵字的快捷鍵。在 Window => Preferences => C/C++ => Code Templates 中,可以添加新模板並查看完整的模板列表。也可以將模板作為 XML 文件導出和導入。

圖 5. 預定義的 C/C++ 代碼模板

代碼歷史記錄:即使您沒有使用 CVS 或其它源代碼版本管理軟體,也可以跟蹤項目源代碼中的本地更改。在選擇的文件上單擊滑鼠右鍵,從上下文菜單選擇 Compare With => Local History...:

圖 6. 用 Local History 功能檢查源代碼中的更改

構建並運行項目

CDT 提供了一種設置項目構建選項的簡單方法。CDT 依賴於三個 GNU 工具:GCC、GDB 和 Make。因此,對用於調試的 GDB 或用於編譯的 GCC 和 Make 的依賴要求這些應用程序可用於用戶想要使用的平台。大多數 Linux(通常和類 POSIX)源代碼軟體包使用 autoconf 腳本來檢查構建環境,所以您必需運行 configure 命令,該命令在編譯之前創建「Makefile」。CDT 沒有提供編輯 autoconf 腳本的方法,所以必需手工編寫它們;然而,您可以配置構建選項以在編譯之前調用 configure 命令。

如果通過調用 make 命令來構建項目,那麼預設設置沒問題,但是,如果使用一種更復雜的方法進行構建,則必需在 Build Command 文本框中輸入適當的命令(例如,make -f make_it_all)。接下來,在 C/C++ Projects 視圖中,選擇 C/C++ project,然後單擊滑鼠右鍵並選擇 Rebuild Project。所有來自 make、編譯器和鏈接程序的編譯消息都被重定向到控制台窗口:

圖 7. 帶編譯器輸出的控制台窗口

編譯成功之後,您或許想要運行您的應用程序。所有用於運行和調試的選項都位於主 Eclipse 菜單的 Run 菜單下。然而,必須在早期定義用於運行項目的選項。可以通過轉至主菜單(在那裡,有用於運行應用程序的不同概要文件)中的 Run... 選項來完成這一步;例如,可以將一個概要文件用於測試目的,而將另一個概要文件用於運行最終版本。另外,可以定義希望要傳遞給應用程序的參數,或者可以設置環境變數。其它選項用於設置調試選項,例如使用哪個調試器(GNU GDB 或 Cygwin GDB)。圖 8 顯示了正在為項目創建運行概要文件(run profile)。

圖 8. 為項目創建運行概要文件

當進入 C/C++ Projects 視圖,選擇您的項目,單擊滑鼠右鍵並在 Build Settings 選項卡上選擇 Properties 之後,就可以使用更多的用於構建項目的常用選項。這些選項主要影響因遇到編譯錯誤而使構建停止時所發生的情況。

調試 C/C++ 項目

CDT 擴展了標準的 Eclipse Debug 視圖,使之具備了調試 C/C++ 代碼的功能。Debug 視圖允許您在工作台中管理程序的調試或運行。要開始調試當前項目,只要切換到 Debug 視圖,您將能夠在代碼中設置(並在執行過程中隨時更改)斷點/監測點並跟蹤變數和寄存器。Debug 視圖顯示正在調試的每個目標的暫掛線程的堆棧框架。程序中的每個線程都作為樹中的一個節點出現,Debug 視圖顯示正在運行的每個目標的進程。

Eclipse 通過 CDT 調試 MI(CDT Debug MI)插件(其組件之一)支持與機器介面(Machine Interface,MI)兼容的調試器。但 MI 調試器究竟是什麼呢?通常情況下,象 ddd 和 xxgdb之類的第三方 GUI 調試器在實現調試功能時都依賴於 GDB 的命令行介面(Command Line Interface,CLI)。遺憾的是,經過證實該介面非常不可靠。GDB/MI 提供了一種新的面向機器的介面,它非常適合於想要直接解析 GDB 輸出的程序。

㈤ 一個Java源程序一般是由哪三個基本部分組成的

一個簡單的java程序由java包(如:import java.awt.*)、類聲明 、變數、構造方法(可預設)、方法 這幾部分構成。
java程序中至少要有一個類被聲明為public。

㈥ 編譯器是什麼

簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器 (Linker) → 可執行程序 (executables)
高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
對於C#、VB等高級語言而言,此時編譯器完成的功能是把源碼(SourceCode)編譯成通用中間語言(MSIL/CIL)的位元組碼(ByteCode)。最後運行的時候通過通用語言運行庫的轉換,編程最終可以被CPU直接計算的機器碼(NativeCode)。
編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器語言)的翻譯過程。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的EXE,
所以我們電腦上的文件都是經過編譯後的文件。

㈦ 簡述JAVA程序的編輯編譯和運行過程

第一步(編譯): 創建完源文件之後,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點象make。

如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報「cant find symbol」的錯誤。

第二步(運行):java類運行的過程大概可分為兩個過程:1、類的載入 2、類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去載入該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都載入到內存中,而是到不得不用的時候才把它載入進來,而且只載入一次。

特別說明:java類中所有public和protected的實例方法都採用動態綁定機制,所有私有方法、靜態方法、構造器及初始化方法<clinit>都是採用靜態綁定機制。而使用動態綁定機制的時候會用到方法表,靜態綁定時並不會用到。

(7)類文件由編譯器擴展閱讀:

Java整個編譯以及運行的過程相當繁瑣,本文通過一個簡單的程序來簡單的說明整個流程。

Java代碼編譯:是由Java源碼編譯器來完成;

Java位元組碼的執行:是由JVM執行引擎來完成

Java程序從源文件創建到程序運行要經過兩大步驟:

1、源文件由編譯器編譯成位元組碼(ByteCode)

2、位元組碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。

㈧ 編譯器的工作原理

編譯 是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器語言)的翻譯過程。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的EXE,
所以我們電腦上的文件都是經過編譯後的文件。

㈨ 什麼是編譯器

編譯器

編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。

[編輯]編譯器工作方法
首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為obj文件。再經過鏈接器的鏈接就可以生成最後的可執行代碼了。有些時候我們需要把多個文件產生的目標文件進行鏈接,產生最後的代碼。我們把一過程稱為交叉鏈接。

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

* 源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables)

工作原理

編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。

典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。

編譯器種類

編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高級語言作為輸入,輸出也是高級語言的編譯器。例如: 自動並行化編譯器經常採用一種高級語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。

預處理器(preprocessor)

作用是通過代入預定義等程序段將源程序補充完整。

編譯器前端(frontend)

前端主要負責解析(parse)輸入的源程序,由詞法分析器和語法分析器協同工作。詞法分析器負責把源程序中的『單詞』(Token)找出來,語法分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如「a = b + c;」前端詞法分析器看到的是「a, =, b , +, c;」,語法分析器按定義的語法,先把他們組裝成表達式「b + c」,再組裝成「a = b + c」的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣後端可以在此基礎上進一步優化,處理。

編譯器後端(backend)

編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。

一般說來所有的編譯器分析,優化,變型都可以分成兩大類: 函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。

編譯器分析(compiler analysis)的對象是前端生成並傳遞過來的中間代碼,現代的優化型編譯器(optimizing compiler)常常用好幾種層次的中間代碼來表示程序,高層的中間代碼(high level IR)接近輸入的源程序的格式,與輸入語言相關(language dependent),包含更多的全局性的信息,和源程序的結構;中層的中間代碼(middle level IR)與輸入語言無關,低層的中間代碼(Low level IR)與機器語言類似。 不同的分析,優化發生在最適合的那一層中間代碼上。

常見的編譯分析有函數調用樹(call tree),控制流程圖(Control flow graph),以及在此基礎上的變數定義-使用,使用-定義鏈(define-use/use-define or u-d/d-u chain),變數別名分析(alias analysis),指針分析(pointer analysis),數據依賴分析(data dependence analysis)等等。

上述的程序分析結果是編譯器優化(compiler optimization)和程序變形(compiler transformation)的前提條件。常見的優化和變新有:函數內嵌(inlining),無用代碼刪除(Dead code elimination),標准化循環結構(loop normalization),循環體展開(loop unrolling),循環體合並,分裂(loop fusion,loop fission),數組填充(array padding),等等。優化和變形的目的是減少代碼的長度,提高內存(memory),緩存(cache)的使用率,減少讀寫磁碟,訪問網路數據的頻率。更高級的優化甚至可以把序列化的代碼(serial code)變成並行運算,多線程的代碼(parallelized,multi-threaded code)。

機器代碼的生成是優化變型後的中間代碼轉換成機器指令的過程。現代編譯器主要採用生成匯編代碼(assembly code)的策略,而不直接生成二進制的目標代碼(binary object code)。即使在代碼生成階段,高級編譯器仍然要做很多分析,優化,變形的工作。例如如何分配寄存器(register allocatioin),如何選擇合適的機器指令(instruction selection),如何合並幾句代碼成一句等等。

熱點內容
subplotpython 發布:2025-05-14 06:53:51 瀏覽:660
豎屏大屏導航工廠密碼一般是多少 發布:2025-05-14 06:49:29 瀏覽:805
如何在手機里設置無線網密碼 發布:2025-05-14 06:47:54 瀏覽:119
動態ip文件伺服器 發布:2025-05-14 06:44:22 瀏覽:890
文字分行的腳本有什麼 發布:2025-05-14 06:33:10 瀏覽:288
svn小烏龜怎麼配置 發布:2025-05-14 06:31:43 瀏覽:393
視頻播放器android 發布:2025-05-14 06:31:43 瀏覽:720
android工作室 發布:2025-05-14 06:26:00 瀏覽:658
汽車官方配置表如何下載 發布:2025-05-14 06:21:41 瀏覽:800
停車項目源碼 發布:2025-05-14 06:20:05 瀏覽:358