1. 程式人生 > >編譯過程的五個階段

編譯過程的五個階段

編譯程式的工作,從輸入源程式開始到輸出目標程式為止的整個過程,是非常複雜的。但就其過程而言,它與人們進行自然語言直接的翻譯有許多相近之處。當我們把一種文字翻譯為另一種文字,例如把一段英文翻譯為中文時,通常需經下列步驟:

(1)識別出句子中的一個個單詞;

(2)分析句子的語法結構;

(3)根據句子的含義進行初步翻譯;

(4)對譯文進行修飾;

(5)寫出最後的譯文。

類似地,編譯程式的工作過程一般也可以劃分為五個階段:詞法分析、語法分析、語義分析與中間程式碼產生、優化、目的碼生成。

第一階段:詞法分析

詞法分析的任務是:輸入源程式,對構成源程式的字串進行掃描和分解,識別出一個個的單詞(亦稱單詞符號或簡稱符號),如基本字(begin、end、if、for、while),識別符號、常數、運算子和界符(標點符號、左右括號)。

單詞符號是語言的基本組成成分,是人們理解和編寫程式的基本要素。識別和理解這些要素無疑也是翻譯的基礎。如同將英文翻譯成中文的情形一樣,如果你對英語單詞不理解,那就談不上進行正確的翻譯。在詞法分析階段的工作中所依循的是語言的詞法規則(或稱構詞規則)。描述詞法規則的有效工具是正規式和有效自動機。

第二階段:語法分析

語法分析的任務是:在詞法分析的基礎上,根據語言的語法規則,把單詞符號串分解成各類語法單位(語法範疇),如“短語”、“句子”、“程式段”和“程式”等。通過語法分析,確定整個輸入串是否構成語法上正確的“程式”。語法分析所依循的是語言的語法規則。語法規則通常用上下文無關文法描述。詞法分析是一種線性分析,而語法分析是一種層次結構分析。例如:

Z = X + 0.618 * Y;

代表一個“賦值語句”,而其中的X + 0.618 * Y 代表一個“算術表示式”。因而,語法分析的任務就是識別X + 0.618 * Y為算術表示式,同時,十倍上述整個符號串屬於賦值語句這個範疇。

第三階段:詞義分析與中間程式碼產生

這一階段的任務是:對語法分析所識別出的各類語法範疇,分析其含義,並進行初步翻譯(產生中間程式碼)。這一階段通常包含兩個方面的工作。首先,對每種語法範疇進行語義i安插,例如,變數是否定義、型別是否正確等等。如果語義正確,則進行另一方面工作,即進行中間程式碼的解釋。這一階段所依循的是語言的語義規則。通常使用屬性文法描述語義規則。

“翻譯”僅僅在這裡才開始涉及到。所謂“中間程式碼”是一種含義明確、便於處理的記號系統,它通常獨立於具體的硬體。這種記號系統或者與現代計算機的指令形式有某種程度的接近,或者能夠比較容易地把它變換成現代計算機的機器指令。例如,許多編譯程式採用了一種與“三地址指令”非常近似的“四元式”作為中間程式碼。這種寺院是的形式是:

算符 左運算元 右運算元 結果

它的意義是:對“左右運算元”進行某種運算(由“算符”指明),把運算所得的值作為“結果”保留下來。在採用四元式作為中間程式碼的情形下,中間程式碼產生的任務就是按語言的語法規則把各類範疇翻譯成四元式序列。例如,下面的賦值語句

Z = (X + 0.418) * Y / W;

可被翻譯為如下的四元式序列:

image

其中,T1和T2是編譯期間引進的臨時工作變數;第一個四元式意味著把X的值加上0.418存放在T1中;第二個四元式值將T1的值和Y的值相乘存於T2中;第三個四元式指將T2的值除以Y的值留結果於Z中。

一般而言,中間程式碼是一種獨立於具體硬體的記號系統。常用的中間大媽,除了四元式之外,還有三元式、間接三元式、逆波蘭記號和樹形表示等等。

第四階段:優化

優化的任務在於對前段產生的中間程式碼進行加工變換,以期在最後階段能產生出更為高效(省時間和空間)的目的碼。優化的主要方面有:公關子表示式的提取、迴圈優化、刪除無用程式碼等等。有時,為了便於“並行運算”,還可以對程式碼進行並行化處理。優化所依循的原則是程式的等價變換規則。

第五階段:目的碼生成

這一階段的任務是:把中間程式碼(或經優化處理之後)變換成特定機器上的低階語言程式碼。這階段實現了最後的翻譯,它的工作有賴於硬體系統結構和機器指令含義。這階段工作非常複雜,設計到硬體系統功能部件的運用,機器指令的選擇,各種資料型別變數的儲存空間分配,以及暫存器和後援暫存器的排程,等等。

目的碼的形式可以是絕對指令程式碼或可重定位的指令程式碼或彙編指令程式碼。如目的碼是絕對指令程式碼,則這種目的碼可立即執行。如果目的碼是彙編指令程式碼,則需彙編器彙編之後才行執行。必須指出,現在多數實用編譯程式所產生的目的碼都是一種可重定位的指令程式碼。這種目的碼在執行前必須藉助於一個連線裝配程式把各個目標模組(包括系統提供的庫函式)連線在一起,確定程式變數(或常數)在主存中的位置,裝入記憶體中指定的起始地址,使之成為一個可以執行的絕對指令程式碼程式。

原文連結:http://blog.csdn.net/aben_2005/article/details/6444333

相關推薦

編譯過程階段

編譯程式的工作,從輸入源程式開始到輸出目標程式為止的整個過程,是非常複雜的。但就其過程而言,它與人們進行自然語言直接的翻譯有許多相近之處。當我們把一種文字翻譯為另一種文字,例如把一段英文翻譯為中文時,通常需經下列步驟: (1)識別出句子中的一個個單詞; (2)分析句子

雲計算安全有哪階段

自己 勒索軟件 承諾 中心 廣播 通用 雲計算服務 最好的 維護 無論是有意識的決策,自然發生,還是企業IT戰略的關鍵部分,在關鍵任務或基礎設施需求的某個層面上采用雲計算已成為當今絕大多數企業的標準,因為他們希望降低IT總擁有成本,並提高運行效率。      在過去的幾年中

cloud-init階段介紹

cloud-init五個階段:generator、local、init(network)、config、final  1.generator階段   決定cloud-init是否啟動,順序啟動剩餘四個階段服務,按照時間順序分為:cloud-init-local.service, cloud-in

第103講 zendstudio的使用 專案開發階段,僱員管理系統①

zendStudio 快捷鍵跟eclipse差不多 僱員管理系統的開發文件 1、需求分析: 該專案完成如下功能: 1.1、管理員可以登陸管理介面 1.2、可以對僱員資訊增刪改查 附帶功能:可以儲存使用者在一定時間內不用反覆登陸;統計網站被訪問的次數 2、畫

新睿雲:看懂這階段,才知道企業怎麼上雲

對企業來說,即便有服務商的整體解決方案,上雲都不可能是一步到位的,需要一個循序漸進的過程。關於企業上雲的程序,不同機構有不同認知,但最終要實現的都是企業經營全流程都在“雲操作”之中,即企業融入工業網際網路之中。 在去年的中國資訊化百人會第四屆資訊戰略論壇上,工信部副司長安筱鵬將把“工業雲到

大資料學習路線 階段 層層深入

大資料從入門到精通,一套專業的學習路線是必不可少的,尤其是對於想要自學的同學來說,這個至關重要。個人也整理了一套大資料學習路線,像我一樣是從零基礎開始的同學,可以作為自己的學習參考。 大資料學習路線圖是分為五個大的階段的,學習時間不確定,要看自己的學習能力和集中學習的精力。

軟體測試流程階段

軟體測試按照研發階段一般分為5個部分:單元測試、整合測試、確認測試、系統測試、驗收測試,下面將不同階段需要的一些工作內容做一下梳理希望可以幫助到大家。 //No.1// 單元測試 單元測試又稱為模組測試,是針對軟體設計的最小單位程式模組進行正確性檢查的測試工作,

2. 程式編譯的四階段

0.引言 hello.c(源程式)是一條高階C語言程式,雖然它是以一種易讀的形式,讓人們容易理解。但是,它卻無法直接驅動硬體CPU直接執行。為了我們編寫的hello.c程式可以被執行,驅動硬體電路工作,hello.c程式必須經過一些列處理步驟,將源程式轉化為可

DHCP實驗過程階段

DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)是一個區域網的網路協議,使用UDP協議工作, 主要有兩個用途:給內部網路或網路服務供應商自動分配IP地址,給使用者或者內部網路管理員作為對所有計算機作中央管理的手

Linux 編譯的四階段

這個過程主要指的是:源程式到可執行的二進位制程式碼這整個過程 四個階段主要是: 1.預處理階段 2.編譯階段 3.彙編階段 4.連結階段 四個階段的詳細資訊如下: 1.預處理階段 主要執行展開原始檔裡的巨集,插入include包含的檔案. 2.編譯階段.

關於土地革命、土地改革、三民主義兩階段民生等階段中土地問題的總結

三個部分的內容都涉及到土地問題,下面進行區分: 1、舊三民主義(1905),主要在同盟會時期,民生主義即指“平均地權”,孫中山主張核定全國土地地價,其現有之地價仍屬原主;革命後的增價則歸國家,為國民共享,國家還可以按照原定的地價收買地主的土地;總結下來即:徵收地價稅和土地增

程式編譯的幾階段

程式編譯的過程中就是將使用者的文字形式的原始碼(c/c++)轉化成計算機可以直接執行的機器程式碼的過程。主要經過這麼幾個過程: 1、編譯,由編譯器將c原始碼(.cpp)轉變成彙編程式碼(.s) 2、彙編,由彙編器將彙編程式碼(.s)轉變成目的碼(.o) 3

軟體設計師學習筆記-編譯程式的階段

第一階段:詞法分析:任務是輸入源程式,對構成源程式的字串進行掃描和分解,識別出一個個的單詞。第二階段:語法分析:任務是在詞法分析的基礎上,根據語言的語法規則,把單詞符號串分解成各類語法單位(語法範疇),如“短語”、“句子”、“程式段”、和“程式”等。詞法分析和語法分析本質都是

Java程式設計師進階架構師的階段,你到了哪各階段

之前有個討論:實現同樣功能,簡潔程式碼一定比複雜程式碼效率高嗎?有的說,還得看演算法,如果演算法相同,簡潔程式碼效率應該會高一些。有的說,即使演算法相同,簡潔程式碼也不見得比複雜程式碼效率高,而應儘可能減少迴圈的使用,特別是少用多重迴圈,或者儘可能在一個迴圈中做更多的事。如此

拆解GCC命令的預處理-編譯-彙編-連結4階段

原文連結:http://blog.csdn.net/jmy5945hh/article/details/7435234 在linux下使用gcc命令編譯程式時,整個過程實際上在底層處理分為四個步驟--預處理/編譯/彙編/連線。 下面通過gcc的不同命令引數來拆解這四個步驟。 原始碼:

.linux開發之uboot移植()——uboot配置和編譯過程詳解

一.uboot主Makefile分析1 1、uboot version確定(Makefile的24-29行) Makefile程式碼部分 (1)uboo

gcc編譯程式的四階段(預處理-編譯-彙編-連結)

gcc的編譯流程分為四個步驟,分別為: ・ 預處理(Pre-Processing) ・ 編譯(Compiling) ・ 彙編(Assembling) ・ 連結(Linking) 下面就具體來檢視一下gcc是如何完成四個步驟的。 hello.c原始碼 #include

程式編譯的4過程

0.引言 hello.c(源程式)是一條高階C語言程式,雖然它是以一種易讀的形式,讓人們容易理解。但是,它卻無法直接驅動硬體CPU直接執行。為了我們編寫的hello.c程式可以被執行,驅動硬體電路工作,hello.c程式必須經過一些列處理步驟,將源程式轉化為可執行性的目標程式。 而我們知道,機器

C++ —— C++程式編譯的四過程

C++ —— C++程式編譯的四個過程        g++是Linux下C++的編譯器;我為什麼會選擇Linux下的g++編譯器,就是因為g++可以看到程式從編譯到執行的過程做了些什麼。而VS等整合開發環境看不到這些,並不是說VS工具不好,(VS還是相當好用的...)。

Linux之GCC命令 -- 解析GCC編譯的四過程

在Linux下進行C語言程式設計,必然要採用GNU GCC來編譯C原始碼生成可執行程式。Gcc指令的一般格式為: Gcc [選項] 要編譯的檔案 [選項] [目標檔案]。其中,目標檔案可預設,Gcc預設生成可執行的檔名為:編譯檔案.out 看一下經典入門程式"Hello W