簡單的編譯流程

簡易編譯器流程圖:

一個典型的編譯器,可以包含為一個前端,一個后端。前端接收源程序產生一個中間表示,后端接收中間表示繼續生成一個目標程序。所以,前端處理的是跟源語言有關的屬性,后端處理跟目標機器有關的屬性。

復雜的編譯器:

詞法分析器:

1.詞法分析器讀入源代碼,然后對字符流(源代碼)做切分成記號流。舉個例子:

    這是一個程序員看到的字符流(源代碼)

2.詞法分析器將字符流讀入,根據關鍵字、標識符、標點、字符串、整形數等進行劃分,形成記號流(單詞):

    

?舉個例子: 假如源語句if(x>5),則詞法分析器返回token{k=IF,lexeme=0};token{k=LPAREN,lexeme=0};token{k=ID,lexeme="X"};……

詞法分析器的任務:字符流到記號流。

       字符流:和被編譯語言密切相關(ASCII,Unicode,or……)

       記號流:編譯器內部定義的數據結構,編碼所識別出的詞法單元

語法分析器:

?語法分析器(Parser)通常是作為編譯器或解釋器的組件出現的,它的作用是進行語法檢查(檢查語法是否符合這個語言的規則)、并構建由輸入的單詞組成的數據結構(一般是語法分析樹、抽象語法樹等層次化的數據結構)。語法分析器通常使用一個獨立的詞法分析器從輸入字符流中分離出一個個的“單詞”,并將單詞流作為其輸入。實際開發中,語法分析器可以手工編寫,也可以使用工具(半)自動生成。

抽象語法樹是對程序語法的抽象表示

例如,當在開發語言時,可能在開始的時候,選擇LL(1)文法來描述語言的語法規則,編譯器前端生成LL(1)語法樹,編譯器后端對LL(1)語法樹進行處理,生成字節碼或者是匯編代碼。但是隨著工程的開發,在語言中加入了更多的特性,用LL(1)文法描述時,感覺限制很大,并且編寫文法時很吃力,所以這個時候決定采用LR(1)文法來描述語言的語法規則,把編譯器前端改生成LR(1)語法樹,但在這個時候,你會發現很糟糕,因為以前編譯器后端是對LL(1)語樹進行處理,不得不同時也修改后端的代碼。

1.抽象語法樹的第一個特點為:不依賴于具體的文法。無論是LL(1)文法,還是LR(1),或者還是其它的方法,都要求在語法分析時候,構造出相同的語法樹,這樣可以給編譯器后端提供了清晰,統一的接口。即使是前端采用了不同的文法,都只需要改變前端代碼,而不用連累到后端。即減少了工作量,也提高的編譯器的可維護性。

2.抽象語法樹的第二個特點為:不依賴于語言的細節。在編譯器家族中,大名鼎鼎的gcc算得上是一個老大哥了,它可以編譯多種語言,例如c,c++,java,ADA,Object C,?FORTRAN,?PASCAL,COBOL等等。在前端gcc對不同的語言進行詞法,語法分析和語義分析后,產生抽象語法樹形成中間代碼作為輸出,供后端處理。要做到這一點,就必須在構造語法樹時,不依賴于語言的細節,例如在不同的語言中,類似于if-condition-then這樣的語句有不同的表示方法

語義分析器:

對語法樹的合法性進行處理(例如:一個變量在使用之前是否先定義聲明,所調用的函數是否有對應的定義),產生相應的中間代碼或目標代碼.

語義分析是編譯過程的一個邏輯階段, 語義分析的任務是對結構上正確的源程序進行上下文有關性質的審查,進行類型審查。語義分析是審查源程序有無語義錯誤,為代碼生成階段收集類型信息。比如語義分析的一個工作是進行類型審查,審查每個算符是否具有語言規范允許的運算對象,當不符合語言規范時,編譯程序應報告錯誤。如有的編譯程序要對實數用作數組下標的情況報告錯誤。又比如某些程序規定運算對象可被強制,那么當二目運算施于一整型和一實型對象時,編譯程序應將整型轉換為實型而不能認為是源程序的錯誤。

經過上面的處理,程序中就沒有在包括語言和語義的錯誤(除非編譯器本身就有bug)

中間代碼

??中間代碼也叫中間語言

(Intermediate code /language)是:源程序的一種內部表示,不依賴目標機的結構,復雜性介于源語言和機器語言之間。

中間代碼的優點

1、邏輯結構清楚;

2、利于不同目標機上實現同一種語言;

3、利于進行與機器無關的優化;

中間代碼可以生成例如 三地址代碼 SSA 控制流圖 等 (中間碼的生成也是取決于編譯器設計中的考慮,例如需不需要優化,或者追求速度,性能等).

關于語法分析器和中間代碼:

LINK:?https://blog.csdn.net/yongchaocsdn/article/details/79056504

代碼生成:

中間代碼可以被最終的一個代碼生成的階段處理為最后的目標代碼(例如機器碼,JVM字節碼)

符號表

符號表是存儲程序編譯過程中重要信息,可以給每個階段提供支持

在計算機科學中,符號表是一種用于語言翻譯器(例如編譯器和解釋器)中的數據結構。在符號表中,程序源代碼中的每個標識符都和它的聲明或使用信息綁定在一起,比如其數據類型、作用域以及內存地址。

符號表在編譯程序工作的過程中需要不斷收集、記錄和使用源程序中一些語法符號的類型和特征等相關信息。這些信息一般以表格形式存儲于系統中。如常數表、變量名表、數組名表、過程名表、標號表等等,統稱為符號表。對于符號表組織、構造和管理方法的好壞會直接影響編譯系統的運行效率。

舉個例子:

一個加法表達式(sum)在編譯中的過程:

例如sum的語法規則是:

1.整數數字 n

2.加法表達式式 n1+n2

根據上面的規則

3

1+2

1+2+3? (加法表達式遵循左結合也就是 1+2 的結果 3+3 這也屬于加法表達式的一種)

這上面的三種都遵守了加法表達式的規則? 所以都是加法表示式的一種

目標機器: 棧式計算機(stack)

是一個LIFO的一個先入后出存儲器,跟它向對應的是FIFO存儲器先入先出傳統順序

有兩條指令:

1.push n (將指定的參數壓入棧中)

2.add (將棧頂的兩個索引的數據彈出并進行加法運算,再將運算后的結果壓入棧中)

//x和y表示棧頂的數據 pop[]表示彈出棧頂的數據
x = pop[]y = pop[]//加法運算
n = x+y//壓棧
push n

例如1+2+3加法運算經過語法分析器翻譯抽象語法樹(AST):

1+2+3 =語法分析器:      語法樹(+)(+)     (3)(1)   (2)

先從左結合開始:

1+2 = 3

3+3 = 6

生成棧式計算機(stack)的代碼:

代碼生成使用樹的后續遍歷(從樹的左邊子節點開始遍歷,然后遍歷右邊子節點最后遍歷根節點)

代碼生成規則:

1. 遍歷樹中時如果遇到整數 n 生成代碼: push n

2.遍歷樹中時如果遇到 + 生成代碼: add

最后生成的棧式計算機的代碼:

push 1push 2addpush 3add

?

轉載于:https://www.cnblogs.com/sybk/p/10004706.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388555.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388555.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

廣告投手_測量投手隱藏自己的音高的程度

廣告投手As the baseball community has recently seen with the Astros 2017 cheating scandal, knowing what pitch is being thrown gives batters a game-breaking advantage. However, unless you have an intricate system of cameras and trash cans set up, knowing wh…

linux事務隔離級別,事務的隔離級別(Transaction isolation levels)2

READ COMMITTEDREAD COMMITTED這是數據庫默認的隔離級別。它能保證你不能讀取那張表格數據,只要有其它事務還在改變這張表格數據。可是,因為sql server在select操作的時,鎖表格時間就那么一小會兒,如果一個事務在READ COMMITTED級…

Asp導出到Excel之二

response.contentType "application/vnd.ms-excel" response.addheader "Content-Disposition", "attachment; filename引出文件.xls" 一、適用于動態和表態表。 二、頁面最好只存放數據表,不要有其它內容。 三、對于分頁的情…

warning C4996: “strcpy”被聲明為否決的解決辦法

VC2005中,使用了很多標準的C函數,比如fopen,strcpy之類的。編譯時會出現警告,比如這個: d:\xxxx.c(1893) : warning C4996: “strcpy”被聲明為否決的 緊接著IDE有提示說:“This function or variable…

驗證部分表單是否重復

1. 效果 圖片中的名稱、機構編碼需要進行重復驗證2. 思路及實現 表單驗證在獲取數據將需要驗證的表單數據進行保存this.nameChangeTemp response.data.orgName;this.codeChangeTemp response.data.orgCode; 通過rule對表單進行驗證 以名字的驗證為例rules: {orgName: [// 設置…

python bokeh_提升視覺效果:使用Python和Bokeh制作交互式地圖

python bokehLet’s face it, fellow data scientists: our clients LOVE dashboards. Why wouldn’t they? Visualizing our data helps us tell a story. Visualization turns thousands of rows of data into a compelling and beautiful narrative. In fact, dashboard vi…

用C#寫 四舍五入函數(原理版)

doubled 0.06576523;inti (int)(d/0.01);//0.01決定了精度 doubledd (double)i/100;//還原 if(d-dd>0.005)dd0.01;//四舍五入 MessageBox.Show((dd*100).ToString()"%");//7%,dd*100就變成百分的前面那一部分了

C++設計UDP協議通訊示例

UDP是一種面向非連接,不可靠的通訊協議,相對于TCP來說,雖然可靠性不及,但傳輸效率較高   一、緒言   UDP是一種面向非連接,不可靠的通訊協議,相對于TCP來說,雖然可靠性不及,但…

浪里個浪 FZU - 2261

TonyY是一個喜歡到處浪的男人,他的夢想是帶著蘭蘭姐姐浪遍天朝的各個角落,不過在此之前,他需要做好規劃。 現在他的手上有一份天朝地圖,上面有n個城市,m條交通路徑,每條交通路徑都是單行道。他已經預先規劃…

C#設計模式(9)——裝飾者模式(Decorator Pattern)

一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手機添加貼膜,手機掛件,手機外殼等,如果此時利用繼承來實現的話,就需要定義無數的類,如StickerPhone(貼膜是手…

北大青鳥c語言課后答案,北大青鳥C語言教程--第一章 C語言基礎.ppt

《北大青鳥C語言教程--第一章 C語言基礎.ppt》由會員分享,可在線閱讀,更多相關《北大青鳥C語言教程--第一章 C語言基礎.ppt(20頁珍藏版)》請在人人文庫網上搜索。1、第一章,C 語言基礎,2,課程地位,.Net ,以 # 開始的語句稱為預處理器指令,#include語句不…

nosql_探索NoSQL系列

nosql數據科學 (Data Science) Knowledge on NoSQL databases seems to be an increasing requirement in data science applications, yet, the taxonomy is so diverse and problem-centered that it can be a challenge to grasp them. This post attempts to shed light on…

C++TCP和UDP屬于傳輸層協議

TCP和UDP屬于傳輸層協議。其中TCP提供IP環境下的數據可靠傳輸,它事先為要發送的數據開辟好連接通道(三次握手),然后再進行數據發送;而UDP則不為IP提供可靠性,一般用于實時的視頻流傳輸,像rtp、r…

程序員如何利用空閑時間掙零花錢

一: 私活 作為一名程序員,在上班之余,我們有大把的時間,不能浪費,這些時間其實都是可以用來挖掘自己潛在的創造力,今天要討論的話題就是,程序員如何利用空余時間掙零花錢?比如說周末…

編寫程序乘法口訣表C語言,陳廣川問:c語言編程九九乘法口訣表 怎樣用c語言寫九九乘法口訣表?...

怎樣用c語言寫九九乘法口訣表?哈哈,我剛剛用javascript寫好乘法口訣表。C語言,如何編寫程序輸出九九乘法表。形式如下 ********* ******** ******* ****** ***** **** *** ** *?兩個循環,一般用for循環 一個循環控制行…

PHP中文亂碼解決辦法

一&#xff0e;首先是PHP網頁的編碼 1. php文件本身的編碼與網頁的編碼應匹配 a. 如果欲使用gb2312編碼&#xff0c;那么php要輸出頭&#xff1a;header(“Content-Type: text/html; charsetgb2312")&#xff0c;靜態頁面添加<meta http-equiv"Content-T…

python中api_通過Python中的API查找相關的工作技能

python中api工作技能世界 (The World of Job Skills) So you want to figure out where your skills fit into today’s job market. Maybe you’re just curious to see a comprehensive constellation of job skills, clean and standardized. Or you need a taxonomy of ski…

欺詐行為識別_使用R(編程)識別欺詐性的招聘廣告

欺詐行為識別背景 (Background) Online recruitment fraud (ORF) is a form of malicious behaviour that aims to inflict loss of privacy, economic damage or harm the reputation of the stakeholders via fraudulent job advertisements.在線招聘欺詐(ORF)是一種惡意行為…

PE文件的感染C++源代碼

PE文件的感染C源代碼 PE文件規定了可執行文件的格式&#xff0c;凡是符合此格式的文件都能在windows系統上運行。PE文件的格式暫且不談&#xff0c;說一些感染PE文件的幾種途徑。 導入表感染。這個涉及比較復雜的操作&#xff0c;首先&#xff0c;要自行寫一個dll文件&#x…

c語言實驗四報告,湖北理工學院14本科C語言實驗報告實驗四數組

湖北理工學院14本科C語言實驗報告實驗四 數組.doc實驗四 數 組實驗課程名C語言程序設計專業班級 14電氣工程2班 學號 201440210237 姓名 熊帆 實驗時間 5.12-5.26 實驗地點 K4-208 指導教師 祁文青 一、實驗目的和要求1. 掌握一維數組和二維數組的定義、賦值和輸入輸出的方法&a…