編譯原理(一)

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

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纸肉,一起剝皮案震驚了整個(gè)濱河市春寿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌观谦,老刑警劉巖浩螺,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靴患,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡要出,警方通過(guò)查閱死者的電腦和手機(jī)鸳君,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)患蹂,“玉大人或颊,你說(shuō)我怎么就攤上這事】龃啵” “怎么了饭宾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵批糟,是天一觀的道長(zhǎng)格了。 經(jīng)常有香客問(wèn)我,道長(zhǎng)徽鼎,這世上最難降的妖魔是什么盛末? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮否淤,結(jié)果婚禮上悄但,老公的妹妹穿的比我還像新娘。我一直安慰自己石抡,他們只是感情好檐嚣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著啰扛,像睡著了一般嚎京。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隐解,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天鞍帝,我揣著相機(jī)與錄音,去河邊找鬼煞茫。 笑死帕涌,一個(gè)胖子當(dāng)著我的面吹牛摄凡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚓曼,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亲澡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了纫版?” 一聲冷哼從身側(cè)響起谷扣,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捎琐,沒(méi)想到半個(gè)月后会涎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑞凑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年末秃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籽御。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡练慕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出技掏,到底是詐尸還是另有隱情铃将,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布哑梳,位于F島的核電站劲阎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鸠真。R本人自食惡果不足惜悯仙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吠卷。 院中可真熱鬧锡垄,春花似錦、人聲如沸祭隔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疾渴。三九已至千贯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間程奠,已是汗流浹背丈牢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞄沙,地道東北人己沛。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓慌核,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親申尼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垮卓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容