編譯原理(一)

語言處理器
術(shù)語解釋:
源語言:等待被轉(zhuǎn)換的語言.
目標語言:轉(zhuǎn)換后輸出的語言.
編譯器:一次將所有源語言轉(zhuǎn)換成目標語言的軟件系統(tǒng).
解釋器:在執(zhí)行一句代碼前才對該代碼進行轉(zhuǎn)換的軟件系統(tǒng).
編譯器與解釋器的區(qū)別:
編譯器一次將所有源語言轉(zhuǎn)換成目標語言,之后只用執(zhí)行不用再次編譯,但每次更改代碼后都需要耗費大量時間編譯.
解釋器則一邊轉(zhuǎn)換一邊執(zhí)行,每次執(zhí)行都需要進行轉(zhuǎn)換,但省去了編譯全部目標語言的時間.
即時編譯器(JIT):
將源語言編譯成中間語言,在執(zhí)行時再將中間語言解釋執(zhí)行.
Java語言采用的就是JIT,程序編寫完成后,先是通過javac將java文件編譯成class文件,等需要執(zhí)行時再通過java虛擬機(jvm)解釋執(zhí)行.
宏:
預處理器:負責將位置離散的源程序聚合在一起的程序,也負責宏展開.
鏈接器:解決外部內(nèi)存地址問題.
加載器:把所有可執(zhí)行目標文件放入內(nèi)存中執(zhí)行.

語言處理系統(tǒng)對源語言的處理過程:
源語言->預處理器->經(jīng)過預處理的源語言->編譯器->匯編語言->匯編器->可重定位機器代碼->連接器與加載器->目標機器代碼
編譯器通常會生成匯編語言而不是機器碼的原因:
相比機器碼,匯編語言更容易輸出和調(diào)試.

編譯器結(jié)構(gòu)
編譯器由兩大部分組成,分析部分與綜合部分,分別對應編譯器的前端與后端.
分析部分:
將源程序分解成多個組成要素,并在這些要素上加上語法結(jié)構(gòu).該結(jié)構(gòu)用來創(chuàng)建該程序的一個中間表示,該表示可以用來分析語法構(gòu)成是否正確和語義是否一致,并能提供給用戶修正錯誤的提示信息.并將源程序相關(guān)信息存放在被稱為符號表(symbol table)的數(shù)據(jù)結(jié)構(gòu)中.最后將中間表示和符號表傳遞給綜合部分.
該部分包括詞法分析器,語法分析器,語義分析器與中間代碼生成器
綜合部分:
用分析部分提供的中間表示與符號表來生成用戶期待的目標程序.
該部分包括機器無關(guān)代碼優(yōu)化器,代碼生成器與機器相關(guān)代碼優(yōu)化器.
術(shù)語解釋:
符號表:存放程序符號的一張表.
詞法分析:是將讀入的源程序字符串流組織成有意義的詞素序列的詞法分析器.
詞素:語法功能最小單位.
詞法單元:每一個詞素都會有一個詞法單元(token).
形如<token-name,attribute-value>
token-name是語法分析步驟使用的抽象符號同時也是分析部分輸出的中間表示.
attribute-value是符號表中關(guān)于這個詞法單元的條目.
語法分析:是使用由詞法分析器生成的各個詞法單元的第一個分量來創(chuàng)建樹形中間表示(即語法樹)的語法分析器.
語義分析:是使用語法樹和符號表中的信息來檢查源程序是否和語言定義的語義一致的語義分析器.
中間代碼生成:這里生成的代碼是中間表示的一種,與語法樹不同,這里生成的中間表示是低級語言或類機器語言.該中間代碼由編譯器構(gòu)造,可構(gòu)造多個.該中間表示有兩個重要的性質(zhì):易于生成和能夠被輕易的轉(zhuǎn)換成目標機器上的語言.該中間表示是介于源語言與目標語言之間的過渡語言.
三地址指令:它是中間代碼生成的一種中間表示.
該指令有三個特點:
每個三地址賦值指令最多只有一個運算符.
編譯器應該生成一個臨時名字存放一個三地址指令計算得到的值.
部分三地址指令運算分量少于三個(id1=t3,該三地址指令只有2個分量).
代碼優(yōu)化:機器無關(guān)代碼優(yōu)化用于改進中間代碼,使其在某一方面更加優(yōu)越(更快,更短等).
代碼生成:將輸入的中間代碼轉(zhuǎn)換成目標代碼的過程.涉及寄存器分配與內(nèi)存地址選擇.
符號表管理:符號表是一種數(shù)據(jù)結(jié)構(gòu),用于記錄變量的名字,類型等信息.
將多個步驟組合成趟:上述的多個過程可以組合成一趟,針對源代碼的是前端趟,針對目標機上的是后端趟,優(yōu)化是可選趟.一個前端趟可以與不同的后端趟組合使用.

構(gòu)建一個編譯器的相關(guān)科學
編譯器設計和實現(xiàn)中的建模要求:通用性和功能的要求與簡單性和有效性之間的平衡.
代碼優(yōu)化的科學:使用嚴格的數(shù)學證明,證明一個優(yōu)化是正確的,并且對它所有的輸入都產(chǎn)生預期的結(jié)果.
編譯器優(yōu)化的設計目標:
優(yōu)化不能改變被編譯程序的含義.
優(yōu)化必須改善很多程序的性能.
優(yōu)化所需的時間必須保持在合理的范圍內(nèi).
所需要的工程方面的工作必須是可管理的.
編譯器技術(shù)的應用:
彌補高級語言因為引入高層次抽象導致的低效率.
過程內(nèi)聯(lián)技術(shù):把一個過程(java中的方法)替換為相應的過程體.目的是把多個過程融合成一個,以優(yōu)化代碼.
編譯技術(shù)的應用
高級語言的實現(xiàn):高級語言對底層硬件的控制力很差,而編譯器則提供了優(yōu)化其生成代碼性能的技術(shù).
針對計算機體系結(jié)構(gòu)的優(yōu)化
并行性:編譯器可以安排指令,以使指令級并行更加有效.
內(nèi)存層次結(jié)構(gòu):編譯器可使內(nèi)存層次結(jié)構(gòu)更加高效.
程序設計語言基礎
靜態(tài)語言和動態(tài)語言的區(qū)別:靜態(tài)語言在編譯時確定其變量作用域,動態(tài)語言在運行時確定其變量作用域.
其它例子:java的static關(guān)鍵字則是確保使用該關(guān)鍵字的變量有一個固定的內(nèi)存位置,而不是如同上面所說的用來確保作用域.
抽象來看,靜態(tài)語言和動態(tài)語言,前者在編譯之后就不會改變,而后者會改變.
環(huán)境與狀態(tài)
環(huán)境:從名字到內(nèi)存位置的映射.
狀態(tài):內(nèi)存位置到它們的值的映射.
名字,標識符,變量
名字:術(shù)語名字和變量通常指的是同一個事物,我們還是要很小心的使用它們,以便區(qū)別編譯時刻的名字和名字在運行時刻所指的內(nèi)存位置.
標識符:它用來指向一個實體,比如一個數(shù)據(jù)對象,過程,類或類型.所有標識符都是名字,但不是所有名字都是標識符.名字也可以是一個表達式(表達式不指向?qū)嶓w).
變量:它指向存儲中的某個特定位置.
名字與變量的區(qū)別:
名字:名字可指向多個變量,比如定義在全局作用域的i與局部作用域的i,他們的名字都是’i’,但他們的內(nèi)存地址不一樣.
變量:一個變量僅指向一個內(nèi)存地址.
過程,函數(shù),方法
過程:可以被調(diào)用的子程序,.如同c一樣的語言只有函數(shù),因此c語言把過程當作是具有特殊返回類型’void’的函數(shù)來處理.
函數(shù):函數(shù)返回某個類型的值,過程則不返回.
方法:c++和java這樣面向?qū)ο蟮恼Z言使用術(shù)語’方法’,方法可以想函數(shù)或過程一樣運行,但方法總和某個類有關(guān)聯(lián).
過程,函數(shù),方法的相同點:都是一段可執(zhí)行的代碼.
過程,函數(shù),方法的區(qū)別:
過程:不返回值.
函數(shù):返回值.
方法:與某個類有關(guān)聯(lián).
聲明和定義
聲明:聲明告訴我們事物的類型.
定義:定義告訴我們它的值.
靜態(tài)作用域
一個聲明的作用域由該聲明在程序中出現(xiàn)的位置隱含的決定.
動態(tài)作用域
一個聲明的作用域依賴于所有當前調(diào)用的函數(shù),然后選擇其中最近調(diào)用的且有該聲明的函數(shù).

靜態(tài)作用域與動態(tài)作用域的類比
靜態(tài)作用域?qū)ふ业穆暶魑挥谧顑?nèi)層的,包含變量使用位置的單元中.動態(tài)作用域?qū)ふ业穆暶魑挥谧顑?nèi)層的,包含變量使用時間的單元中.
參數(shù)傳遞機制
值調(diào)用:在該調(diào)用中,會對實參求知(當它是表達式時)或拷貝(當它是變量時),這些值被放在屬于被調(diào)用過程的相應形式參數(shù)的內(nèi)存位置上.諸如c和java等語言,如果實參是數(shù)組,那么實際上拷貝的是該數(shù)組的指針或引用,這導致修改其拷貝就是修改其本身,因此被調(diào)用過程是可以改變對象本身.
引用調(diào)用:實參的地址作為相應形式參數(shù)的值被傳遞給被調(diào)用者.如果實參是表達式,那么就會對表達式求值并放入形參中,修改該變量并不會修改其被拷貝變量本身.
別名:同一個變量的不同名字.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容