編譯器開發(fā)_中國多少人能寫編譯器_編譯器設(shè)計(jì)(第2版)
本文關(guān)鍵詞:編譯器設(shè)計(jì),由筆耕文化傳播整理發(fā)布。
> 其他綜合 > 編譯器設(shè)計(jì)(第2版) 1.2 編譯器結(jié)構(gòu) 2012-12-18 08:37:48 我要投稿
本文所屬圖書 > 編譯器設(shè)計(jì)(第2版)
云計(jì)算徹底改變了應(yīng)用程序的開發(fā)與使用方式,甚至也改變了應(yīng)用程序原本的定義。有了云計(jì)算,應(yīng)用不再運(yùn)行在用戶桌面計(jì)算機(jī)上,而是分布式地運(yùn)行于網(wǎng)絡(luò)上,與全世界千萬用戶同時(shí)使用計(jì)算資源。它還具有傳統(tǒng)應(yīng)用程... 立即去當(dāng)當(dāng)網(wǎng)訂購
編譯器是一個(gè)龐大、復(fù)雜的軟件系統(tǒng)。編譯器社區(qū)自1955年以來一直在構(gòu)建編譯器,多年以來,關(guān)于如何設(shè)計(jì)編譯器的結(jié)構(gòu),我們已經(jīng)學(xué)習(xí)了許多經(jīng)驗(yàn)教訓(xùn)。早期,我們將編譯器描述為一個(gè)簡(jiǎn)單的盒子,能夠?qū)⒃闯绦蜣D(zhuǎn)換為目標(biāo)程序即可。當(dāng)然,現(xiàn)實(shí)比這個(gè)簡(jiǎn)單的圖景更為復(fù)雜。
單盒模型指出,編譯器必須理解輸入源程序并將其功能映射到目標(biāo)機(jī)。這兩項(xiàng)任務(wù)截然不同的性質(zhì)暗示著一種可能的任務(wù)劃分,并最終導(dǎo)致了一種將編譯分解為兩個(gè)主要部分的設(shè)計(jì):前端和后端。
前端專注于理解源語言程序。后端專注于將程序映射到目標(biāo)機(jī)。對(duì)于編譯器的設(shè)計(jì)和實(shí)現(xiàn),這種關(guān)注點(diǎn)的分離隱含著幾個(gè)重要結(jié)論。
前端必須將其對(duì)源程序的認(rèn)識(shí)編碼到某種結(jié)構(gòu)中,以供后端稍后使用。中間表示(IR)成為了編譯器對(duì)所轉(zhuǎn)換代碼的權(quán)威表示。在編譯過程中的每個(gè)點(diǎn),編譯器都有一個(gè)權(quán)威表示。實(shí)際上,隨著編譯過程的進(jìn)展,可以使用幾種不同的IR,但在每個(gè)點(diǎn)上,都只有一種表示會(huì)成為權(quán)威的IR。我們可以將權(quán)威IR看做編譯器各個(gè)獨(dú)立階段之間所傳遞程序的版本,就像是前述圖中從前端傳遞到后端的IR一樣。
IR
編譯器使用一些數(shù)據(jù)結(jié)構(gòu)來表示它處理的代碼,這種形式稱為中間表示(Intermediate Representation,IR)。
在一個(gè)兩階段編譯器中,前端必須確保源程序是良構(gòu)的,而且必須將輸入的代碼映射到IR。后端必須將IR程序映射到目標(biāo)機(jī)的指令集和有限的資源上。由于后端僅處理前端生成的IR,因此它可以認(rèn)為IR不包括任何語法和語義錯(cuò)誤。
生在這個(gè)時(shí)代真好
就編譯器的設(shè)計(jì)和實(shí)現(xiàn)而言,這是一個(gè)令人激動(dòng)的時(shí)代。在20世紀(jì)80年代,幾乎所有的編譯器都是龐大的單塊式系統(tǒng)。它們將一種語言作為輸入,產(chǎn)生針對(duì)某種特定計(jì)算機(jī)的匯編代碼。生成的匯編代碼與其他編譯過程產(chǎn)生的代碼(包括系統(tǒng)庫和應(yīng)用程序庫)粘貼在一起,最終形成一個(gè)可執(zhí)行文件。這個(gè)可執(zhí)行文件存儲(chǔ)在磁盤上,最終的可執(zhí)行代碼在適當(dāng)?shù)臅r(shí)間從磁盤移動(dòng)到內(nèi)存并執(zhí)行。
今天,編譯器技術(shù)應(yīng)用于各種不同環(huán)境下。隨著計(jì)算機(jī)在各種不同的場(chǎng)合獲得應(yīng)用,編譯器必須處理新的不同的限制。速度不再是用于判斷編譯后代碼的唯一標(biāo)準(zhǔn)。當(dāng)今,判斷代碼質(zhì)量的規(guī)則很可能是代碼“占地”有多小,代碼執(zhí)行時(shí)耗能多少,代碼能壓縮到多小,代碼執(zhí)行時(shí)產(chǎn)生多少個(gè)缺頁異常,等等。
同時(shí),編譯技術(shù)已經(jīng)脫離了80年代單塊式系統(tǒng)的窠臼,它們出現(xiàn)在許多新場(chǎng)合。Java編譯器采用部分編譯的程序(Java“字節(jié)碼”格式)作為輸入,并將其轉(zhuǎn)換為目標(biāo)機(jī)的本機(jī)碼。在這種環(huán)境中,成功意味著編譯時(shí)間加上運(yùn)行時(shí)間的總和必須小于解釋執(zhí)行的代價(jià)。分析整個(gè)程序的技術(shù)正在從編譯時(shí)轉(zhuǎn)向鏈接時(shí),鏈接器可以分析整個(gè)應(yīng)用程序的匯編代碼并利用該認(rèn)識(shí)來改進(jìn)程序。最后,可以在運(yùn)行時(shí)調(diào)用編譯器生成定制的代碼,以利用僅能從運(yùn)行時(shí)得知的事實(shí)獲利。如果編譯花費(fèi)的時(shí)間保持在比較短的水準(zhǔn)上,而生成定制代碼的獲利較大,那么這種策略可以產(chǎn)生顯著的改進(jìn)。
在輸出目標(biāo)程序之前,編譯器可以在代碼的IR形式上進(jìn)行多趟迭代。多遍迭代可能會(huì)生成更好的代碼,因?yàn)榫幾g器實(shí)際上可以在一個(gè)階段中研究代碼并記錄相關(guān)細(xì)節(jié)。那么在后續(xù)階段中,編譯器可以利用這些記下的知識(shí)來提高轉(zhuǎn)換的質(zhì)量。這種策略要求第一趟獲得的知識(shí)記錄在IR中,后續(xù)各趟可以查找并利用這些知識(shí)。
最后,兩階段結(jié)構(gòu)可以簡(jiǎn)化編譯器重定目標(biāo)的過程。我們可以輕易地想象到為單個(gè)前端構(gòu)建多個(gè)后端,這樣即可產(chǎn)生輸入同一語言但輸出針對(duì)不同目標(biāo)機(jī)器的編譯器。類似地,我們可以想象針對(duì)不同語言的前端生成同樣的IR并使用共同的后端。這兩種場(chǎng)景,都假定一種IR可以服務(wù)于幾種源和目標(biāo)的組合,實(shí)際上,特定于語言和特定于機(jī)器的細(xì)節(jié)通常都會(huì)進(jìn)入到IR。
重定目標(biāo)
改變編譯器使之針對(duì)新處理器生成代碼的任務(wù),通常稱為將該編譯器重定目標(biāo)。
引入IR使得可以向編譯增加更多階段。編譯器編寫者可以在前端和后端之間插入第三個(gè)階段。這個(gè)中間部分,也稱為優(yōu)化器,以IR程序作為其輸入,產(chǎn)生一個(gè)語義上等價(jià)的IR程序作為其輸出。通過使用IR作為接口,編譯器編寫者插入第三個(gè)階段時(shí),可以將對(duì)前端和后端的破壞降到最低。這就形成了下述的編譯器結(jié)構(gòu),稱為三階段編譯器。
優(yōu)化器
編譯器的中間部分稱為優(yōu)化器,負(fù)責(zé)分析并轉(zhuǎn)換IR,以改進(jìn)IR。
優(yōu)化器是一個(gè)IR到IR的轉(zhuǎn)換器,,試圖在某些方面改進(jìn)IR程序。(請(qǐng)注意,依據(jù)我們?cè)?.1節(jié)中的定義,這些轉(zhuǎn)換器本身就是編譯器。)優(yōu)化器可以對(duì)IR處理一遍或多遍,分析IR并重寫IR。優(yōu)化器重寫IR可以使后端生成一個(gè)可能更快速或更小的目標(biāo)程序。優(yōu)化器還可能有其他目標(biāo),諸如產(chǎn)生更少缺頁異;蚝哪茌^少的程序。
概念上,三階段結(jié)構(gòu)表示了經(jīng)典的優(yōu)化編譯器。實(shí)際上,每個(gè)階段內(nèi)部都劃分為若干趟。前端由兩趟或三趟組成,處理識(shí)別有效源語言程序的各種細(xì)節(jié),并產(chǎn)生該程序的初始IR形式。中間部分包含執(zhí)行不同優(yōu)化的各趟處理。這些趟的數(shù)目和目的因編譯器而異。后端由若干趟處理組成,每一趟都將輸入的IR程序進(jìn)一步處理,使之更接近目標(biāo)機(jī)的指令集。編譯器的三個(gè)階段和其中的各趟處理共享了同一個(gè)基礎(chǔ)設(shè)施,這些結(jié)構(gòu)如圖1-1所示。
將編譯器在概念上劃分為前端、中間部分(優(yōu)化器)以及后端在實(shí)踐中是很有用的做法。這些階段解決的問題各有不同。前端的工作涉及理解源程序并將其分析結(jié)果以IR形式記錄下來;優(yōu)化器部分專注于改進(jìn)IR形式;后端必須將轉(zhuǎn)換過的IR程序映射到目標(biāo)機(jī)的有限資源上,從而能夠有效利用那些資源。
在這三個(gè)階段中,優(yōu)化器的描述最為模糊不清。優(yōu)化這個(gè)術(shù)語,暗含編譯器需要找到某個(gè)問題的最優(yōu)解的意思。優(yōu)化過程中發(fā)生的問題是如此之錯(cuò)綜復(fù)雜,因而這些問題實(shí)際上是得不到最優(yōu)解的。需要進(jìn)一步澄清的是,編譯后代碼的實(shí)際性能取決于優(yōu)化器和后端兩個(gè)階段中應(yīng)用的所有技術(shù)之間的相互影響。因而,即使單個(gè)的某項(xiàng)技術(shù)可以被證明是最優(yōu)的,但它與其他技術(shù)的交互可能產(chǎn)生次優(yōu)的結(jié)果。因此,相對(duì)于未優(yōu)化的代碼版本而言,良好的優(yōu)化編譯器可以改進(jìn)代碼的質(zhì)量。但優(yōu)化編譯器通常無法產(chǎn)生最優(yōu)代碼。
中間部分可以是單塊式的一趟處理,其中應(yīng)用一個(gè)或多個(gè)優(yōu)化技術(shù)來改進(jìn)代碼,也可以從結(jié)構(gòu)上設(shè)計(jì)為若干趟規(guī)模較小的處理過程,其中每趟都讀寫IR。單體式結(jié)構(gòu)可能更為高效;多趟結(jié)構(gòu)有助于降低實(shí)現(xiàn)的復(fù)雜度,同時(shí)在調(diào)試編譯器時(shí)也相對(duì)簡(jiǎn)單。此外還提高了靈活性,可以在不同情況下采用不同的優(yōu)化技術(shù)組合。這兩種方法之間的選擇,取決于構(gòu)建編譯器時(shí)和編譯器實(shí)際運(yùn)行時(shí)的約束條件。
點(diǎn)擊復(fù)制鏈接 與好友分享!回本站首頁 您對(duì)本文章有什么意見或著疑問嗎?請(qǐng)到論壇討論您的關(guān)注和建議是我們前行的參考和動(dòng)力 上一篇:1.1 簡(jiǎn)介 下一篇:1.3 轉(zhuǎn)換概述 相關(guān)文章1.2 多核的未來:異構(gòu)平臺(tái)
1.2 多核處理器的緣起
譯者簡(jiǎn)介
譯者序
譯者序
譯者序
譯者序
譯者序
譯者序
譯者序
圖文推薦本文關(guān)鍵詞:編譯器設(shè)計(jì),由筆耕文化傳播整理發(fā)布。
本文編號(hào):53562
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/53562.html