當前位置:首頁 » 編程軟體 » 編譯器流程

編譯器流程

發布時間: 2022-01-12 22:42:26

編譯器的發展史

編譯器編譯器,是將便於人編寫,閱讀,維護的高級計算機語言翻譯為計算機能識別,運行的低級機器語言的程序。編譯器將源程序(Sourcenbsp;program)作為輸入,翻譯產生使用目標語言(Targetnbsp;language)的等價程序。源程序一般為高級語言(High-levelnbsp;language),如Pascal,C++等,而目標語言則是匯編語言或目標機器的目標代碼(Objectnbsp;code),有時也稱作機器代碼(Machinenbsp;code)。一個現代編譯器的主要工作流程如下:源程序(sourcenbsp;code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(objectnbsp;code)→連接器(鏈接器,Linker)→可執行程序(executables)nbsp;目錄nbsp;[隱藏]1nbsp;工作原理nbsp;2nbsp;編譯器種類nbsp;3nbsp;預處理器(preprocessor)nbsp;4nbsp;編譯器前端(frontend)nbsp;5nbsp;編譯器後端(backend)nbsp;6nbsp;編譯語言與解釋語言對比nbsp;7nbsp;歷史nbsp;8nbsp;參見nbsp;工作原理翻譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。編譯器種類編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高級語言作為輸入,輸出也是高級語言的編譯器。例如:nbsp;自動並行化編譯器經常採用一種高級語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。預處理器(preprocessor)作用是通過代入預定義等程序段將源程序補充完整。編譯器前端(frontend)前端主要負責解析(parse)輸入的源程序,由詞法分析器和語法分析器協同工作。詞法分析器負責把源程序中的『單詞』(Token)找出來,語法分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句nbsp;,函數等等。nbsp;例如「anbsp;=nbsp;bnbsp;+nbsp;c;」前端詞法分析器看到的是「a,nbsp;=,nbsp;bnbsp;,nbsp;+,nbsp;c;」,語法分析器按定義的語法,先把他們組裝成表達式「bnbsp;+nbsp;c」,再組裝成「anbsp;=nbsp;bnbsp;+nbsp;c」的語句。nbsp;前端還負責語義(semanticnbsp;checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstractnbsp;syntaxnbsp;tree,或nbsp;AST),這樣後端可以在此基礎上進一步優化,處理。編譯器後端(backend)編譯器後端主要負責分析,優化中間代碼(Intermediatenbsp;representation)以及生成機器代碼(Codenbsp;Generation)。一般說來所有的編譯器分析,優化,變型都可以分成兩大類:nbsp;函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。編譯器分析(compilernbsp;analysis)的對象是前端生成並傳遞過來的中間代碼,現代的優化型編譯器(optimizingnbsp;compiler)常常用好幾種層次的中間代碼來表示程序,高層的中間代碼(highnbsp;levelnbsp;IR)接近輸入的源程序的格式,與輸入語言相關(languagenbsp;dependent),包含更多的全局性的信息,和源程序的結構;中層的中間代碼(middle

Ⅱ 高級語言的編譯過程,經過哪幾個步驟

開發C程序有四個步驟:編輯、編譯、連接和運行。

任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。

1、預處理:導入源程序並保存(C文件)。

2、編譯:將源程序轉換為目標文件(Obj文件)。

3、鏈接:將目標文件生成為可執行文件(EXE文件)。

4、運行:執行,獲取運行結果的EXE文件。

(2)編譯器流程擴展閱讀:

將C語言代碼分為程序的幾個階段:

1、首先,對源代碼文件進行測試。以及相關的頭文件,比如Stdio。H.CPP預處理為。我的文件。預編譯。該文件不包含任何宏定義,因為所有宏都已展開,且包含的文件已插入。我提起。

2、編譯過程是對預處理後的文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程通常是整個程序的核心部分,也是最復雜的過程之一。

3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可運行的可執行程序。也就是說,您需要鏈接到大量文件以獲得最終可執行文件「a.out」。

4、在鏈接過程中,其他目標文件中定義的函數調用指令需要重新調整,而其他目標文件中定義的變數也存在同樣的問題。

Ⅲ 什麼是編譯器

編譯器

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

[編輯]編譯器工作方法
首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為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),如何合並幾句代碼成一句等等。

Ⅳ 簡述編譯程序的工作過程

1識別出句子中的一個個單詞
2分析句子的語法結構
3根據句子的含義進行初步翻譯
4對譯文進行修飾
5寫出最後的譯文

Ⅳ 用C編寫一個流程圖編譯器

用C編寫, 要寫 Win API 程序。
建窗(畫布):
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
。。。
在 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 里
調 hdc=GetDC(hwnd); 得到 DC 可以畫圖寫字。
例如:
color=RGB(0,128,128); // 設顏色
hP1=CreatePen(PS_SOLID,0,color); // 線型
SelectObject(hdc,hP1); // 建畫筆
MoveToEx( hdc,x0, y0, NULL ); //落筆
LineTo(hdc,x1,y1);LineTo(hdc,x2,y2);
LineTo(hdc,x0,y0); // 畫線
TextOut(hdc,。。。。); // 寫字
自己定一個數據文件,記錄畫的東西,例如:
rect 40 80 100 30 -- 表示畫矩形,原點(40,80),長100寬30。
lingxin x0 y0 x1 y1 x2 y2 x3 y3 -- 表示畫菱形
用屏幕抓圖存圖像(或畫圖在dib設備):
keybd_event(VK_LMENU,0xA4,0,0);
keybd_event(VK_SNAPSHOT,0x2C,0,0);
keybd_event(VK_SNAPSHOT,0x2C,KEYEVENTF_KEYUP,0);
keybd_event(VK_LMENU,0xA4,KEYEVENTF_KEYUP,0);
從Clipboard取出圖像:
h_bitmap = GetClipboardData(CF_BITMAP);
h_dib = GetClipboardData(CF_DIB);
memcpy(&bmi,h_dib,sizeof(bmi));
調 PNG 庫 存 bitmap 到 PNG。
修改,重畫 要用 前面的 自己定那個數據文件,不能用 PNG。

Ⅵ 編譯器本身是如何進行測試的

編譯器最重要的性質就是保證語義的正確。比如,從高級語言翻譯到機器指令之後,指令必須正確的表達原來程序的意思。所以一般編譯器測試都包含一些源程序,用來覆蓋可能出現的各種情況。基本的原則是:原來程序的結果 = 編譯後機器指令運行的結果。機器指令運行的結果很容易知道,運行一下就知道了。可是原來程序的結果你怎麼知道呢?
為了解決這個「原來程序語義」的問題,最好是寫一個解釋器,准確無誤的表達原來的代碼的語義。所以我們的要求就是:
高級語言解釋器(源程序) = 機器執行(機器代碼)
由於處理器其實就是一個用來執行機器代碼的解釋器,這里有一個很美好的對稱關系:
interp1(L1) = interp2(L2)
另外還有一個問題,就是編譯器一般需要經過多個轉化步驟(叫做 pass)才能最後編譯為機器指令。比如,
L2 = pass1(source)
L3 = pass2(L2)
L4 = pass3(L3)
Ln = passN(Ln-1)
machine_code = codegen(Ln)
由於源程序經過了很多步驟猜得到最後的機器指令,如果你使用上面的公式,就會出現以下一些情況:
1. 知道結果錯了,但是卻不知道到底是哪一個 pass 錯了。
2. 結果沒有錯,但是中間卻有 pass 實際上是錯的。但是由於之前的 pass 把輸入程序的一些結構給「優化」掉了,所以錯的那個 pass 其實沒能得到觸發錯誤的那個數據結構。所以測試沒能發現錯誤。如果以後前面的那個 pass 被修改,錯誤就會暴露出來。這是非常難以發現的潛伏的危險。
為了防止這些情況出現,一些編譯器(比如 Chez Scheme 和 Kent Dybvig 的課程編譯器)使用了對每一個 pass 進行測試的做法。具體的方法就是為每一個中間語言都寫一個解釋器,把這語言的語義完全的表示出來。這樣我們就需要檢查一組等式:
L2 = pass1(source)
高級語言編譯器(源程序) = interp2(L2) // 測試 pass1 的正確性
L3 = pass2(L2)
interp2(L2) = interp3(L3) // 測試 pass2 的正確性
這樣一來我們就能獨立的判斷每一個 pass 的正確性了。
這些是基本的語義測試原理。另外除了語義,可能還有一些「表面」一些的測試,它們看代碼本身,而不只看它的語義。比如尾遞歸優化的測試應該確保輸出程序的尾遞歸得到正確的處理,等等。這些是語義測試檢查不到的,因為尾遞歸沒有正確處理的程序大部分也能輸出正確的結果。
普通的單元測試方法也可以用來測試一些編譯器里的輔助函數,但那些不是編譯器特有的,所以就不講了。
另外,就像所有測試的局限性一樣,你沒法枚舉所有可能出現的輸入,所以以上的測試方法其實也不能保證編譯器的完全正確。

Ⅶ 什麼是編譯程序

編譯程序指將某一種程序設計語言寫的程序翻譯成等價的另一種語言的程序的程序, 稱之為編譯程序

編譯程序也稱為編譯器,是指把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。編譯程序屬於採用生成性實現途徑實現的翻譯程序。

它以高級程序設計語言書寫的源程序作為輸入,而以匯編語言或機器語言表示的目標程序作為輸出。編譯出的目標程序通常還要經歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。

編譯程序的實現演算法較為復雜,這是因為它所翻譯的語句與目標語言的指令不是一一對應關系,而是一多對應關系,同時也因為它要處理遞歸調用、動態存儲分配、多種數據類型,以及語句間的緊密依賴關系。

由於高級程序設計語言書寫的程序具有易讀、易移植和表達能力強等特點,編譯程序廣泛地用於翻譯規模較大、復雜性較高、且需要高效運行的高級語言書寫的源程序。

(7)編譯器流程擴展閱讀:

編譯流程分為了四個步驟:

1.預處理,生成預編譯文件(.文件)

2.編譯,生成匯編代碼(.s文件)

3.匯編,生成目標文件(.o文件)

4.鏈接,生成可執行文件

Ⅷ 高級的程序編譯必須經過哪些階段

匯編語言或高級語言程序,由計算機代表必須首先到計算機中,變換成目標程序(這一過程被編譯)的機器語言來執行。執行被稱為編譯程序的轉換處理程序。未編譯的匯編語言源文件匯編。
轉換編譯器叫做目標程序,這也是該機的語言。組裝式,解釋和編譯:
編譯器在三個方面的工作。鍵入用於編譯的匯編語言程序的編譯器,根據一個關系,並將其轉換成用機器語言表示的程序。解釋聲明編譯高級語言程序,首先解釋為一組機器語言指令,然後立即執行完畢,取出一組語句的解釋和執行,因此繼續完成計劃為止。由編譯器解釋,執行速度是很慢的,但它可以是一台電腦和「對話」,你可以隨時的高級語言程序。 BASIC語言是一種解釋性高級語言。編譯編譯器將翻譯寫在高級語言程序,程序就會部成機器語言表示,和過程很快,在這個過程中,不能進行人機對話的變化。 FORTRAN語言編譯高級語言。

Ⅸ 什麼是編譯程序 編譯程序的工作過程

編譯程序是變成語言在計算機上面運行的一種方式。
比如你現在編寫(編譯型語言)了你個程序文件並要運行它,但是計算機是不認識這個文件裡面的東西的(其實計算機只認識0和1這樣的數字),所以這里就需要把你自己寫的程序文件翻譯一遍,翻譯過後並生成一個計算機能夠識別的文件,把你原來的源文件翻譯成計算機能夠識別的文件的過程就叫編譯,其實計算機運行的真正文件是編譯過後的編譯文件。

Ⅹ 編譯器翻譯流程

是的。
機器碼的前一個階段就是匯編碼。
所有的高級語言翻譯到機器碼的過程,必須經過匯編碼這個階段。

熱點內容
小螞蟻電動汽車哪個配置好 發布:2024-11-15 01:53:18 瀏覽:24
c語言聯合體 發布:2024-11-15 01:52:36 瀏覽:108
雲伺服器下載軟體提示 發布:2024-11-15 01:51:55 瀏覽:755
ip廣播音柱必須要伺服器嗎 發布:2024-11-15 01:51:46 瀏覽:643
本地伺服器怎麼搭建路由器 發布:2024-11-15 01:42:34 瀏覽:280
pythonnlst 發布:2024-11-15 01:11:12 瀏覽:284
安卓手機怎麼注冊蘋果雲 發布:2024-11-15 01:05:00 瀏覽:408
資料庫設計模板 發布:2024-11-15 00:47:25 瀏覽:826
編程的悟性 發布:2024-11-15 00:47:24 瀏覽:734
主流可編譯語言 發布:2024-11-15 00:42:23 瀏覽:730