|
為什么要學(xué)習(xí)編譯原理作為程序員,不管是前端開發(fā)工程師還是后端開發(fā)工程師,編譯技術(shù)都與我們的工作息息相關(guān)。在實際工作中也經(jīng)常會碰到需要編譯技術(shù)的場景。比如,前端開發(fā)工程師想要了解TypeScript是如何把一門語言翻譯成另一門語言的,以及babel是如何編譯JavaScript的等等。學(xué)習(xí)編譯技術(shù)有助于提升我們的職場競爭力,更有助于程序員在技術(shù)的道路上走的更遠(yuǎn)。那么學(xué)習(xí)完本篇文章你會對編譯原理有個初步的認(rèn)識,比如:
什么是編譯原理編譯原理是介紹如何將高級程序設(shè)計語言轉(zhuǎn)換成計算機(jī)硬件能識別的機(jī)器語言,以便計算機(jī)進(jìn)行處理 編譯與計算機(jī)程序設(shè)計語言的關(guān)系日常開發(fā)過程中我們使用的語言一般都是高級語法比如 JAVA、Python、PHP、JavaScript等等,但是計算機(jī)只能識別0、1這樣的機(jī)器碼。那么這些高級語言是如何翻譯成機(jī)器能識別的0、1等呢?這就用的了編譯,首先我們通過下面這幅圖看下編譯與計算機(jī)程序語言的關(guān)系,有助于我們直觀的了解編譯的作用。
程序設(shè)計語言的轉(zhuǎn)換方式翻譯:指把某種語言的源程序,在不改變語義的條件下,轉(zhuǎn)換成另一種語言程序即目標(biāo)語言程序 真正的實現(xiàn)有兩種方式,編譯及解釋
編譯的轉(zhuǎn)換過程
編譯器在語言處理系統(tǒng)中的位置了解了編譯與程序設(shè)計語言的關(guān)系,那么我們接下來再來看下編譯器在語言處理系統(tǒng)中所處位置,如下圖
編譯系統(tǒng)的結(jié)構(gòu)那么機(jī)器是如何把高級語言翻譯為匯編語言程序或機(jī)器語言程序的呢? 我們先來看下人工進(jìn)行英文翻譯的例子,這里引用的哈工大編譯原理中的圖示
根據(jù)上圖可以看出要進(jìn)行語義分析首先需要劃分句子成分,那么我們是如何劃分句子成分的呢?
詞法分析(掃描)編譯的第一個階段,從左到右逐行掃描源程序的字符,識別出各個單詞(是高級語言中有是在意義的最小語法單元,由字符構(gòu)成),確定單詞的類型。將識別的單詞轉(zhuǎn)換成統(tǒng)一的機(jī)內(nèi)表示即詞法單元 簡稱Token
語法分析(parsing)語法分析的定義語法分析器從詞法分析器輸出的token序列中識別出各類短語,并構(gòu)造語法分析樹(parse tree),語法分析樹描述了句子的語法結(jié)構(gòu) 語法分析的規(guī)則即語法規(guī)則又稱文法,規(guī)定了單詞如何構(gòu)成短語、句子、過程和程序。 語法規(guī)則的標(biāo)示如下,含義是A定義為B或者C 來看下賦值語句的語法規(guī)則:
語法分析的方法推導(dǎo)(derive)和歸約(reduce)
最右推導(dǎo)、最左歸約: 語法樹計算機(jī)通過語法樹來進(jìn)行分析,即語法分析過程也可以用一顆倒著的樹來標(biāo)示,這顆樹叫語法樹。正確的語法樹葉子節(jié)點數(shù)必須是表達(dá)式的符號,例如
賦值語句的分析樹:
變量聲明語句的分析樹: 首先看下變量聲明語句的文法(文法是由一系列規(guī)則構(gòu)成的): <D> -> <T> <IDS>;
語義分析語義的任務(wù)主要有兩個 一. 收集標(biāo)識符的屬性信息
二. 語義檢查
中間代碼生成通常和語義分析一起實現(xiàn)。對語法分析識別出的各類語法范疇,分析他的含義,進(jìn)行初步翻譯,產(chǎn)生介于源代碼和目標(biāo)代碼質(zhì)檢的一種代碼 常用的中間代碼表示形式
三地址指令的表示:
下面圖中展示了一個中間代碼生成的例子
代碼優(yōu)化對前面生成的中間代碼進(jìn)行加工變換,以便在最后極端產(chǎn)生更為高效的目標(biāo)代碼 ,需要遵循等價變換的原則,優(yōu)化的方面包括:公共子表達(dá)式的提取、合并已知量、刪除無用語句、循環(huán)優(yōu)化。 目標(biāo)代碼生成把經(jīng)過優(yōu)化的中間代碼轉(zhuǎn)化成特定機(jī)器上的低級語言 目標(biāo)代碼的形式:
其他出錯處理如果源程序有錯誤,編譯程序應(yīng)設(shè)法發(fā)現(xiàn)錯誤并報告給用戶。由專門的出錯處理程序來完成。錯誤類型:
遍指對源程序或源程序的中間結(jié)果從頭到尾掃描一次,并做有關(guān)的加工處理,生成新的中間結(jié)果或目標(biāo)代碼。遍與階段的含義毫無關(guān)系 多遍掃描: 優(yōu)點:節(jié)省內(nèi)存空間,提高目標(biāo)代碼的質(zhì)量,使編譯的邏輯結(jié)構(gòu)清晰。缺點:編譯時間長。在內(nèi)存許可的情況下還是遍數(shù)盡可能少較好
編譯程序生成
|
|
|