關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
編譯器設(shè)計(jì) 1952年第一個(gè)編譯器誕生,至今已經(jīng)過(guò)去了半個(gè)多世紀(jì),編譯器的發(fā)展日臻成熟,關(guān)于編譯器設(shè)計(jì)的著作也出版了不少,但既關(guān)注設(shè)計(jì)細(xì)節(jié),又具備大局觀的經(jīng)典之作鳳毛麟角,《編譯器設(shè)計(jì)(第2版)》即是這樣一本難得的佳作。
深入剖析現(xiàn)代編譯器運(yùn)用的算法和技術(shù) 強(qiáng)調(diào)代碼優(yōu)化和代碼生成 體現(xiàn)編譯原理教學(xué)的最新理念
構(gòu)建編譯器的實(shí)踐方法一直在不斷變化,部分是因?yàn)樘幚砥骱拖到y(tǒng)的設(shè)計(jì)會(huì)發(fā)生變化。例如,當(dāng)我們?cè)?998年開(kāi)始寫作本書(shū)初版時(shí),一些同事對(duì)書(shū)中指令調(diào)度方面的內(nèi)容頗感疑惑,因?yàn)閬y序執(zhí)行威脅到了指令調(diào)度,很有可能會(huì)使其變得不再重要,F(xiàn)在第2版已經(jīng)付印,隨著多核處理器的崛起和爭(zhēng)取更多核心的推動(dòng),順序執(zhí)行流水線再次展現(xiàn)吸引力,因?yàn)檫@種流水線占地較少,設(shè)計(jì)者能夠?qū)⒏嗪诵姆胖迷谝粔K芯片上。短期內(nèi),指令調(diào)度仍然很重要。
同時(shí),編譯器構(gòu)建社區(qū)還將繼續(xù)產(chǎn)生新的思路和算法,并重新發(fā)現(xiàn)原本有效但在很大程度上卻被遺忘的舊技術(shù)。圍繞著寄存器分配中弦圖(chordal graph)使用(參見(jiàn)13.5.2節(jié))的最新研究頗為令人振奮。該項(xiàng)工作承諾可以簡(jiǎn)化圖著色分配器(graph-coloring allocator)的某些方面。Brzozowski的算法是一種DFA最小化技術(shù),可以追溯到20世紀(jì)60年代早期,但卻已有數(shù)十年未在編譯器課程中講授了(參見(jiàn)2.6.2節(jié))。 該算法提供了一種容易的路徑,可以從子集構(gòu)造(subset construction)的實(shí)現(xiàn)得到一個(gè)最小化DFA的實(shí)現(xiàn)。編譯器構(gòu)建方面的現(xiàn)代課程本該同時(shí)包括這兩種思想。 那么,為了讓學(xué)習(xí)者準(zhǔn)備好進(jìn)入這個(gè)不斷變化的領(lǐng)域,我們?cè)撊绾卧O(shè)計(jì)編譯器構(gòu)建課程的結(jié)構(gòu)呢?我們相信,這門課應(yīng)該使每個(gè)學(xué)生學(xué)會(huì)建立新編譯器組件和修改現(xiàn)存編譯器所需的各項(xiàng)基本技能。學(xué)生既需要理解籠統(tǒng)的概念,如鏈接約定中隱含的編譯器、鏈接器、裝載器和操作系統(tǒng)之間的協(xié)作,也需要理解微小的細(xì)節(jié),如編譯器編寫者如何減少每個(gè)過(guò)程調(diào)用時(shí)保存寄存器的代碼總共所占的空間。 第2版中的改變 本書(shū)提供了兩種視角:編譯器構(gòu)建領(lǐng)域中各問(wèn)題的整體圖景,以及各種可選算法方案的詳細(xì)討論。在構(gòu)思本書(shū)的過(guò)程中,我們專注于該書(shū)的可用性,使其既可作為教科書(shū),又可用做專業(yè)人士的參考書(shū)。為此,我們特別進(jìn)行了下述改動(dòng)。 改進(jìn)了闡述思想的流程,以幫助按順序閱讀本書(shū)的學(xué)生。每章章首簡(jiǎn)介會(huì)解釋該章的目的,列出主要的概念,并概述主題相關(guān)內(nèi)容。書(shū)中的示例已經(jīng)重寫過(guò),使得章與章之間的內(nèi)容具有連續(xù)性。此外,每章都從摘要和一組關(guān)鍵詞開(kāi)始,以幫助那些會(huì)將本書(shū)用做參考書(shū)的讀者。 在每節(jié)末尾都增加了本節(jié)回顧和復(fù)習(xí)題。復(fù)習(xí)題用于快速檢查讀者是否理解了該節(jié)的要點(diǎn)。 關(guān)鍵術(shù)語(yǔ)的定義放在了它們被首次定義和討論的段落之后。 大量修訂了有關(guān)優(yōu)化的內(nèi)容,使其能夠更廣泛地涵蓋優(yōu)化編譯器的各種可能性。 現(xiàn)在的編譯器開(kāi)發(fā)專注于優(yōu)化和代碼生成。對(duì)于新雇用的編譯器編寫者來(lái)說(shuō),他們往往會(huì)被指派去將代碼生成器移植到新處理器,或去修改優(yōu)化趟,而不會(huì)去編寫詞法分析器或語(yǔ)法分析器。成功的編譯器編寫者必須熟悉優(yōu)化(如靜態(tài)單賦值形式的構(gòu)建)和代碼生成領(lǐng)域當(dāng)前最好的實(shí)踐技術(shù)(如軟件流水線)。他們還必須擁有相關(guān)的背景和洞察力,能理解未來(lái)可能出現(xiàn)的新技術(shù)。最后,他們必須深刻理解詞法分析、語(yǔ)法分析和語(yǔ)義推敲(semantic elaboration)技術(shù),能構(gòu)建或修改編譯器前端。 本書(shū)是一本教科書(shū)、一門教程,幫助學(xué)生接觸到現(xiàn)代編譯器領(lǐng)域中的各種關(guān)鍵問(wèn)題,并向?qū)W生提供解決這些問(wèn)題所需的背景知識(shí)。從第1版開(kāi)始,我們就維持了各主題之間的基本均衡。前端是實(shí)用組件,可以從可靠的廠商購(gòu)買或由某個(gè)開(kāi)源系統(tǒng)改編而得。但是,優(yōu)化器和代碼生成器通常是對(duì)特定處理器定制的,有時(shí)甚至針對(duì)單個(gè)處理器型號(hào)定制,因?yàn)樾阅車?yán)重依賴于所生成代碼的底層細(xì)節(jié)。這些事實(shí)影響到了當(dāng)今構(gòu)建編譯器的方法,它們也應(yīng)該影響我們講授編譯器構(gòu)建課程的方法。 本書(shū)結(jié)構(gòu) 本書(shū)內(nèi)容劃分為篇幅大致相等的四個(gè)部分。 第一部分(第2章~第4章)涵蓋編譯器前端及建立前端所用工具的設(shè)計(jì)和構(gòu)建。 第二部分(第5章~第7章)探討從源代碼到編譯器的中間形式的映射,這些章考查前端為優(yōu)化器和后端所生成代碼的種類。 第三部分(第8章~第10章)介紹代碼優(yōu)化。第8章提供對(duì)優(yōu)化的概述。第9章和第10章包含了對(duì)分析和轉(zhuǎn)換的更深入的處理,本科課程通常略去這兩章。 第四部分(第11章~第13章)專注于編譯器的后端所使用的算法。 編譯的藝術(shù)性與科學(xué)性 編譯器構(gòu)建的內(nèi)容有兩部分,一是將理論應(yīng)用到實(shí)踐方面所取得的驚人成就,一是對(duì)我們能力受限之處的探討。這些成就包括:現(xiàn)代詞法分析器是通過(guò)應(yīng)用正則語(yǔ)言的理論自動(dòng)構(gòu)建識(shí)別器而建立的;LR語(yǔ)法分析器使用同樣的技術(shù)執(zhí)行句柄識(shí)別,進(jìn)而驅(qū)動(dòng)了一個(gè)移進(jìn)歸約語(yǔ)法分析器;數(shù)據(jù)流分析巧妙有效地將格理論應(yīng)用到程序分析中;代碼生成中使用的近似算法為許多真正困難的問(wèn)題提供了較好的解。 另一方面,編譯器構(gòu)建也揭示了一些難以解決的復(fù)雜問(wèn)題。用于現(xiàn)代處理器的編譯器后端對(duì)兩個(gè)以上的NP完全問(wèn)題(指令調(diào)度、寄存器分配,也許還包括指令和數(shù)據(jù)安排)采用了近似算法來(lái)獲取答案。這些NP完全問(wèn)題,雖然看起來(lái)與諸如表達(dá)式的代數(shù)重新關(guān)聯(lián)這種問(wèn)題相近(示例見(jiàn)圖7-1)。但后者有著大量的解決方案,更糟的是,對(duì)于這些NP完全問(wèn)題來(lái)說(shuō),所要的解往往取決于編譯器和應(yīng)用程序代碼中的上下文信息。在編譯器對(duì)此類問(wèn)題近似求解時(shí),會(huì)面臨編譯時(shí)間和可用內(nèi)存上的限制。好的編譯器會(huì)巧妙地混合理論、實(shí)踐知識(shí)、技術(shù)和經(jīng)驗(yàn)。 打開(kāi)一個(gè)現(xiàn)代優(yōu)化編譯器,你會(huì)發(fā)現(xiàn)各式各樣的技術(shù)。編譯器使用貪婪啟發(fā)式搜索來(lái)探索很大的解空間,使用確定性有限自動(dòng)機(jī)來(lái)識(shí)別輸入中的單詞。不動(dòng)點(diǎn)算法被用于推斷程序行為,通過(guò)定理證明程序和代數(shù)化簡(jiǎn)器來(lái)預(yù)測(cè)表達(dá)式的值。編譯器利用快速模式匹配算法將抽象計(jì)算映射到機(jī)器層次上的操作。它們使用線性丟番圖方程和普瑞斯伯格算術(shù)(Pressburger arithmetic)來(lái)分析數(shù)組下標(biāo)。最后,編譯器使用了大量經(jīng)典的算法和數(shù)據(jù)結(jié)構(gòu),如散列表、圖算法和稀疏集實(shí)現(xiàn)方法等。 本書(shū)嘗試同時(shí)闡釋編譯器構(gòu)建的藝術(shù)和科學(xué)這兩方面內(nèi)容。通過(guò)選取足夠廣泛的題材,向讀者表明,確實(shí)存在一些折中的解決方案,而設(shè)計(jì)決策的影響可能是微妙而深遠(yuǎn)的。另一方面,本書(shū)也省去了某些長(zhǎng)期以來(lái)都列入本科編譯器構(gòu)建課程的技術(shù),隨著市場(chǎng)、語(yǔ)言和編譯器技術(shù)或工具可用性方面的改變,這些技術(shù)已變得不那么重要了。 講述方法 編譯器構(gòu)建是一種工程設(shè)計(jì)實(shí)踐。每個(gè)方案的成本、優(yōu)點(diǎn)和復(fù)雜程度各異,編譯器編寫者必須在多種備選方案中做出抉擇。每個(gè)決策都會(huì)影響到最終的編譯器。最終產(chǎn)品的質(zhì)量,取決于抉擇過(guò)程中所做的每一個(gè)理性決斷。 因而,對(duì)于編譯器中的許多設(shè)計(jì)決策來(lái)說(shuō),并不存在唯一的正確答案。即使在“理解透徹”和“已解決”的問(wèn)題中,設(shè)計(jì)和實(shí)現(xiàn)中的細(xì)微差別都會(huì)影響到編譯器的行為及其產(chǎn)生的代碼的質(zhì)量。每個(gè)決策都涉及許多方面。舉例來(lái)說(shuō),中間表示的選擇對(duì)于編譯器中其余部分有著深刻的影響,無(wú)論是時(shí)間和空間需求,還是應(yīng)用不同算法的難易程度。但實(shí)際上確定該決策時(shí),通常可供設(shè)計(jì)者考慮的時(shí)間并不多。第5章考察了中間表示的空間需求,以及其他一些應(yīng)該在選擇中間表示時(shí)考慮的問(wèn)題。在本書(shū)中其他地方,我們會(huì)再次提出該問(wèn)題,既會(huì)在正文中直接提出,也會(huì)在習(xí)題里間接提出。 本書(shū)探索了編譯器的設(shè)計(jì)空間,既從深度上闡釋問(wèn)題,也從廣度上探討可能的答案。它給出了這些問(wèn)題的某些解決方法,并說(shuō)明了使用這些方案的約束條件。編譯器編寫者需要理解這些問(wèn)題及其答案,以及所作決策對(duì)編譯器設(shè)計(jì)的其他方面的影響。只有這樣,編寫者才能作出理性和明智的選擇。 思想觀念 本書(shū)闡釋了我們?cè)跇?gòu)建編譯器方面的思想觀念,這是在各自超過(guò)25年的研究、授課和實(shí)踐過(guò)程中發(fā)展起來(lái)的。例如,中間表示應(yīng)該展示最終代碼所關(guān)注的那些細(xì)節(jié),這種理念導(dǎo)致了對(duì)底層表示的偏愛(ài)。又比如,值應(yīng)該駐留在寄存器中,直至分配器發(fā)現(xiàn)無(wú)法繼續(xù)保留它為止,這種做法產(chǎn)生了使用虛擬寄存器的例子,以及僅在無(wú)可避免時(shí)才將值存儲(chǔ)到內(nèi)存的例子。每個(gè)編譯器都應(yīng)該包括優(yōu)化,它簡(jiǎn)化了編譯器其余的部分。多年以來(lái)的經(jīng)驗(yàn),使得我們能夠理性地選擇書(shū)的主題和展現(xiàn)方式。 關(guān)于編程習(xí)題的選擇 編譯器構(gòu)建方面的課程,提供了在一個(gè)具體應(yīng)用程序(編譯器)環(huán)境中探索軟件設(shè)計(jì)問(wèn)題的機(jī)會(huì),任何具備編譯器構(gòu)建課程背景的學(xué)生,都已經(jīng)透徹理解了該應(yīng)用程序的基本功能。在多數(shù)編譯器設(shè)計(jì)課程中,編程習(xí)題發(fā)揮了很大的作用。 我們以這樣的方式講授過(guò)這門課:學(xué)生從頭到尾構(gòu)建一個(gè)簡(jiǎn)單的編譯器,從生成的詞法分析器和語(yǔ)法分析器開(kāi)始,結(jié)束于針對(duì)某個(gè)簡(jiǎn)化的RISC指令集的代碼生成器。我們也以另一種方式講授過(guò)這門課程,學(xué)生編寫程序來(lái)解決各個(gè)良好自包含的問(wèn)題,諸如寄存器分配或指令調(diào)度。編程習(xí)題的選擇實(shí)際上非常依賴于本課程在相關(guān)課程中所扮演的角色。 在某些學(xué)校,編譯器課程充當(dāng)高年級(jí)的頂級(jí)課程,將來(lái)自許多其他課程的概念匯集到一個(gè)大型的實(shí)際設(shè)計(jì)和實(shí)現(xiàn)項(xiàng)目中。在這樣的課程中,學(xué)生應(yīng)該為一門簡(jiǎn)單的語(yǔ)言編寫一個(gè)完整的編譯器,或者修改一個(gè)開(kāi)源的編譯器,以支持新的語(yǔ)言或體系結(jié)構(gòu)特性。這門課程可以按本書(shū)的內(nèi)容組織,從頭到尾講授本書(shū)的內(nèi)容。 在另外一些學(xué)校,編譯器設(shè)計(jì)出現(xiàn)在其他課程中,或以其他方式呈現(xiàn)在教學(xué)中。此時(shí),編譯器設(shè)計(jì)教師應(yīng)該專注于算法及其實(shí)現(xiàn),比如局部寄存器分配器或樹(shù)高重新平衡趟這樣的編程習(xí)題。在這種情況下,可以選擇性講解本書(shū)中的內(nèi)容,也可以調(diào)整講述的順序,以滿足編程習(xí)題的需求。例如,在萊斯大學(xué),我們通常使用簡(jiǎn)單的局部寄存器分配器作為第一個(gè)編程習(xí)題,任何具有匯編語(yǔ)言編程經(jīng)驗(yàn)的學(xué)生,都可以理解該問(wèn)題的基本要素。但這種策略,需要讓學(xué)生在學(xué)習(xí)第2章之前,首先接觸第13章的內(nèi)容。 不管采用哪種方案,本課程都應(yīng)該從其他課程取材。在計(jì)算機(jī)組織結(jié)構(gòu)、匯編語(yǔ)言編程、操作系統(tǒng)、計(jì)算機(jī)體系結(jié)構(gòu)、算法和形式語(yǔ)言之間,存在著明顯的關(guān)聯(lián)。盡管編譯器構(gòu)建與其他課程的關(guān)聯(lián)不那么明顯,但這種關(guān)聯(lián)同等重要。第7章中討論的字符復(fù)制,對(duì)于網(wǎng)絡(luò)協(xié)議、文件服務(wù)器和Web服務(wù)器等應(yīng)用程序的性能而言,都發(fā)揮著關(guān)鍵的作用。第2章中用于詞法分析的技術(shù)可以應(yīng)用到文本編輯和URL過(guò)濾等領(lǐng)域。第13章中自底向上的局部寄存器分配器是最優(yōu)離線頁(yè)面替換算法MIN的“近親”。 補(bǔ)充材料 還有一些補(bǔ)充的資源可用,可幫助讀者改編本書(shū)的內(nèi)容,使之適用于自己的課程。這包括作者在萊斯大學(xué)講授這門課程的一套完整的講義以及習(xí)題答案。讀者可以聯(lián)系本地的Elsevier業(yè)務(wù)代表,詢問(wèn)如何獲取這些補(bǔ)充材料 。 致謝 許多人參與了第1版的出版工作,他們的貢獻(xiàn)也體現(xiàn)在第2版中。許多人指出了第1版中的問(wèn)題,包括Amit Saha、Andrew Waters、Anna Youssefi、Ayal Zachs、Daniel Salce、David Peixotto、Fengmei Zhao、Greg Malecha、Hwansoo Han、Jason Eckhardt、Jeffrey Sandoval、John Elliot、Kamal Sharma、Kim Hazelwood、Max Hailperin、Peter Froehlich、Ryan Stinnett、Sachin Rehki、Sa·nak Ta··rlar、Timothy Harvey和Xipeng Shen,在此向他們致謝。我們還要感謝第2版的審閱者,包括Jeffery von Ronne、Carl Offner、David Orleans、K. Stuart Smith、John Mallozzi、Elizabeth White和Paul C. Anagnostopoulos。Elsevier的產(chǎn)品團(tuán)隊(duì),特別是Alisa Andreola、Andre Cuello和Megan Guiney,在將草稿轉(zhuǎn)換成書(shū)的過(guò)程中發(fā)揮了關(guān)鍵作用。所有這些人都以其深刻的洞察力和無(wú)私的幫助,從各個(gè)重要方面提升了本書(shū)的質(zhì)量。 最后,在過(guò)去5年中,無(wú)論是從精神方面,還是從知識(shí)方面,許多人都為我們提供了莫大的支持。首先,我們的家庭和萊斯大學(xué)的同事都在不斷地鼓勵(lì)我們。特別感謝小女Christine和Carolyn,她們耐心容忍了無(wú)數(shù)次關(guān)于編譯器構(gòu)建方面各種主題的長(zhǎng)時(shí)間討論。Nate McFadden以其耐心和出色的幽默感,從開(kāi)始到出版,一直指導(dǎo)著本書(shū)的工作。Penny Anderson對(duì)于日常行政事務(wù)管理方面的幫助對(duì)于本書(shū)的完成至關(guān)重要。對(duì)所有這些人,我們表示衷心的感謝。
Keith D. Cooper,萊斯大學(xué)計(jì)算機(jī)科學(xué)系計(jì)算工程專業(yè)Doerr特聘教授,曾任該系系主任。Cooper博士的研究課題涵蓋過(guò)程間數(shù)據(jù)流分析、標(biāo)量指令優(yōu)化、寄存器分配以及指令調(diào)度等方面。
Linda Torczon,萊斯大學(xué)計(jì)算機(jī)科學(xué)系高級(jí)研究員。Torczon的研究?jī)?nèi)容主要包括代碼生成、過(guò)程間數(shù)據(jù)流分析和優(yōu)化、編程環(huán)境。 譯者簡(jiǎn)介: 郭旭,資深軟件設(shè)計(jì)師。主要興趣是復(fù)雜軟件系統(tǒng)的分析和設(shè)計(jì),目前從事高性能數(shù)據(jù)集成工具的研發(fā)。譯有《深入Linux內(nèi)核架構(gòu)》、《C語(yǔ)言接口及實(shí)現(xiàn)》等書(shū)。
第1章 編譯概觀
1.1 簡(jiǎn)介 1.2 編譯器結(jié)構(gòu) 1.3 轉(zhuǎn)換概述 1.3.1 前端 1.3.2 優(yōu)化器 1.3.3 后端 1.4 小結(jié)和展望 第2章 詞法分析器 2.1 簡(jiǎn)介 2.2 識(shí)別單詞 2.2.1 識(shí)別器的形式化 2.2.2 識(shí)別更復(fù)雜的單詞 2.3 正則表達(dá)式 2.3.1 符號(hào)表示法的形式化 2.3.2 示例 2.3.3 RE的閉包性質(zhì) 2.4 從正則表達(dá)式到詞法分析器 2.4.1 非確定性有限自動(dòng)機(jī) 2.4.2 從正則表達(dá)式到NFA:Thompson構(gòu)造法 2.4.3 從NFA到DFA:子集構(gòu)造法 2.4.4 從DFA到最小DFA:Hopcroft算法 2.4.5 將DFA用做識(shí)別器 2.5 實(shí)現(xiàn)詞法分析器 2.5.1 表驅(qū)動(dòng)詞法分析器 2.5.2 直接編碼的詞法分析器 2.5.3 手工編碼的詞法分析器 2.5.4 處理關(guān)鍵字 2.6 高級(jí)主題 2.6.1 從DFA到正則表達(dá)式 2.6.2 DFA最小化的另一種方法:Brzozowski算法 2.6.3 無(wú)閉包的正則表達(dá)式 2.7 小結(jié)和展望 第3章 語(yǔ)法分析器 3.1 簡(jiǎn)介 3.2 語(yǔ)法的表示 3.2.1 為什么不使用正則表達(dá)式 3.2.2 上下文無(wú)關(guān)語(yǔ)法 3.2.3 更復(fù)雜的例子 3.2.4 將語(yǔ)義編碼到結(jié)構(gòu)中 3.2.5 為輸入符號(hào)串找到推導(dǎo) 3.3 自頂向下語(yǔ)法分析 3.3.1 為進(jìn)行自頂向下語(yǔ)法分析而轉(zhuǎn)換語(yǔ)法 3.3.2 自頂向下的遞歸下降語(yǔ)法分析器 3.3.3 表驅(qū)動(dòng)的LL(1)語(yǔ)法分析器 3.4 自底向上語(yǔ)法分析 3.4.1 LR(1)語(yǔ)法分析算法 3.4.2 構(gòu)建LR(1)表 3.4.3 表構(gòu)造過(guò)程中的錯(cuò)誤 3.5 實(shí)際問(wèn)題 3.5.1 出錯(cuò)恢復(fù) 3.5.2 一元運(yùn)算符 3.5.3 處理上下文相關(guān)的二義性 3.5.4 左遞歸與右遞歸 3.6 高級(jí)主題 3.6.1 優(yōu)化語(yǔ)法 3.6.2 減小LR(1)表的規(guī)模 3.7 小結(jié)和展望 第4章 上下文相關(guān)分析 4.1 簡(jiǎn)介 4.2 類型系統(tǒng)簡(jiǎn)介 4.2.1 類型系統(tǒng)的目標(biāo) 4.2.2 類型系統(tǒng)的組件 4.3 屬性語(yǔ)法框架 4.3.1 求值的方法 4.3.2 環(huán) 4.3.3 擴(kuò)展實(shí)例 4.3.4 屬性語(yǔ)法方法的問(wèn)題 4.4 特設(shè)語(yǔ)法制導(dǎo)轉(zhuǎn)換 4.4.1 特設(shè)語(yǔ)法制導(dǎo)轉(zhuǎn)換的實(shí)現(xiàn) 4.4.2 例子 4.5 高級(jí)主題 4.5.1 類型推斷中更困難的問(wèn)題 4.5.2 改變結(jié)合性 4.6 小結(jié)和展望 第5章 中間表示 5.1 簡(jiǎn)介 5.2 圖IR 5.2.1 與語(yǔ)法相關(guān)的樹(shù) 5.2.2 圖 5.3 線性IR 5.3.1 堆棧機(jī)代碼 5.3.2 三地址代碼 5.3.3 線性代碼的表示 5.3.4 根據(jù)線性代碼建立控制流圖 5.4 將值映射到名字 5.4.1 臨時(shí)值的命名 5.4.2 靜態(tài)單賦值形式 5.4.3 內(nèi)存模型 5.5 符號(hào)表 5.5.1 散列表 5.5.2 建立符號(hào)表 5.5.3 處理嵌套的作用域 5.5.4 符號(hào)表的許多用途 5.5.5 符號(hào)表技術(shù)的其他用途 5.6 小結(jié)和展望 第6章 過(guò)程抽象 6.1 簡(jiǎn)介 6.2 過(guò)程調(diào)用 6.3 命名空間 6.3.1 類Algol語(yǔ)言的命名空間 6.3.2 用于支持類Algol語(yǔ)言的運(yùn)行時(shí)結(jié)構(gòu) 6.3.3 面向?qū)ο笳Z(yǔ)言的命名空間 6.3.4 支持面向?qū)ο笳Z(yǔ)言的運(yùn)行時(shí)結(jié)構(gòu) 6.4 過(guò)程之間值的傳遞 6.4.1 傳遞參數(shù) 6.4.2 返回值 6.4.3 確定可尋址性 6.5 標(biāo)準(zhǔn)化鏈接 6.6 高級(jí)主題 6.6.1 堆的顯式管理 6.6.2 隱式釋放 6.7 小結(jié)和展望 第7章 代碼形式 7.1 簡(jiǎn)介 7.2 分配存儲(chǔ)位置 7.2.1 設(shè)定運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)的位置 7.2.2 數(shù)據(jù)區(qū)的布局 7.2.3 將值保持在寄存器中 7.3 算術(shù)運(yùn)算符 7.3.1 減少對(duì)寄存器的需求 7.3.2 訪問(wèn)參數(shù)值 7.3.3 表達(dá)式中的函數(shù)調(diào)用 7.3.4 其他算術(shù)運(yùn)算符 7.3.5 混合類型表達(dá)式 7.3.6 作為運(yùn)算符的賦值操作 7.4 布爾運(yùn)算符和關(guān)系運(yùn)算符 7.4.1 表示 7.4.2 對(duì)關(guān)系操作的硬件支持 7.5 數(shù)組的存儲(chǔ)和訪問(wèn) 7.5.1 引用向量元素 7.5.2 數(shù)組存儲(chǔ)布局 7.5.3 引用數(shù)組元素 7.5.4 范圍檢查 7.6 字符串 7.6.1 字符串表示 7.6.2 字符串賦值 7.6.3 字符串連接 7.6.4 字符串長(zhǎng)度 7.7 結(jié)構(gòu)引用 7.7.1 理解結(jié)構(gòu)布局 7.7.2 結(jié)構(gòu)數(shù)組 7.7.3 聯(lián)合和運(yùn)行時(shí)標(biāo)記 7.7.4 指針和匿名值 7.8 控制流結(jié)構(gòu) 7.8.1 條件執(zhí)行 7.8.2 循環(huán)和迭代 7.8.3 case語(yǔ)句 7.9 過(guò)程調(diào)用 7.9.1 實(shí)參求值 7.9.2 保存和恢復(fù)寄存器 7.10 小結(jié)和展望 第8章 優(yōu)化簡(jiǎn)介 8.1 簡(jiǎn)介 8.2 背景 8.2.1 例子 8.2.2 對(duì)優(yōu)化的考慮 8.2.3 優(yōu)化的時(shí)機(jī) 8.3 優(yōu)化的范圍 8.4 局部?jī)?yōu)化 8.4.1 局部值編號(hào) 8.4.2 樹(shù)高平衡 8.5 區(qū)域優(yōu)化 8.5.1 超局部值編號(hào) 8.5.2 循環(huán)展開(kāi) 8.6 全局優(yōu)化 8.6.1 利用活動(dòng)信息查找未初始化變量 8.6.2 全局代碼置放 8.7 過(guò)程間優(yōu)化 8.7.1 內(nèi)聯(lián)替換 8.7.2 過(guò)程置放 8.7.3 針對(duì)過(guò)程間優(yōu)化的編譯器組織結(jié)構(gòu) 8.8 小結(jié)和展望 第9章 數(shù)據(jù)流分析 9.1 簡(jiǎn)介 9.2 迭代數(shù)據(jù)流分析 9.2.1 支配性 9.2.2 活動(dòng)變量分析 9.2.3 數(shù)據(jù)流分析的局限性 9.2.4 其他數(shù)據(jù)流問(wèn)題 9.3 靜態(tài)單賦值形式 9.3.1 構(gòu)造靜態(tài)單賦值形式的簡(jiǎn)單方法 9.3.2 支配邊界 9.3.3 放置 函數(shù) 9.3.4 重命名 9.3.5 從靜態(tài)單賦值形式到其他形式的轉(zhuǎn)換 9.3.6 使用靜態(tài)單賦值形式 9.4 過(guò)程間分析 9.4.1 構(gòu)建調(diào)用圖 9.4.2 過(guò)程間常量傳播 9.5 高級(jí)主題 9.5.1 結(jié)構(gòu)性數(shù)據(jù)流算法和可歸約性 9.5.2 加速計(jì)算支配性的迭代框架算法的執(zhí)行 9.6 小結(jié)和展望 第10章 標(biāo)量?jī)?yōu)化 10.1 簡(jiǎn)介 10.2 消除無(wú)用和不可達(dá)代碼 10.2.1 消除無(wú)用代碼 10.2.2 消除無(wú)用控制流 10.2.3 消除不可達(dá)代碼 10.3 代碼移動(dòng) 10.3.1 緩式代碼移動(dòng) 10.3.2 代碼提升 10.4 特化 10.4.1 尾調(diào)用優(yōu)化 10.4.2 葉調(diào)用優(yōu)化 10.4.3 參數(shù)提升 10.5 冗余消除 10.5.1 值相同與名字相同 10.5.2 基于支配者的值編號(hào)算法 10.6 為其他變換制造時(shí)機(jī) 10.6.1 超級(jí)塊復(fù)制 10.6.2 過(guò)程復(fù)制 10.6.3 循環(huán)外提 10.6.4 重命名 10.7 高級(jí)主題 10.7.1 合并優(yōu)化 10.7.2 強(qiáng)度削減 10.7.3 選擇一種優(yōu)化序列 10.8 小結(jié)和展望 第11章 指令選擇 11.1 簡(jiǎn)介 11.2 代碼生成 11.3 擴(kuò)展簡(jiǎn)單的樹(shù)遍歷方案 11.4 通過(guò)樹(shù)模式匹配進(jìn)行指令選擇 11.4.1 重寫規(guī)則 11.4.2 找到平鋪方案 11.4.3 工具 11.5 通過(guò)窺孔優(yōu)化進(jìn)行指令選擇 11.5.1 窺孔優(yōu)化 11.5.2 窺孔變換程序 11.6 高級(jí)主題 11.6.1 學(xué)習(xí)窺孔模式 11.6.2 生成指令序列 11.7 小結(jié)和展望 第12章 指令調(diào)度 12.1 簡(jiǎn)介 12.2 指令調(diào)度問(wèn)題 12.2.1 度量調(diào)度質(zhì)量的其他方式 12.2.2 是什么使調(diào)度這樣難 12.3 局部表調(diào)度 12.3.1 算法 12.3.2 調(diào)度具有可變延遲的操作 12.3.3 擴(kuò)展算法 12.3.4 在表調(diào)度算法中打破平局 12.3.5 前向表調(diào)度與后向表調(diào)度 12.3.6 提高表調(diào)度的效率 12.4 區(qū)域性調(diào)度 12.4.1 調(diào)度擴(kuò)展基本程序塊 12.4.2 跟蹤調(diào)度 12.4.3 通過(guò)復(fù)制構(gòu)建適當(dāng)?shù)纳舷挛沫h(huán)境 12.5 高級(jí)主題 12.5.1 軟件流水線的策略 12.5.2 用于實(shí)現(xiàn)軟件流水線的算法 12.6 小結(jié)和展望 第13章 寄存器分配 13.1 簡(jiǎn)介 13.2 背景問(wèn)題 13.2.1 內(nèi)存與寄存器 13.2.2 分配與指派 13.2.3 寄存器類別 13.3 局部寄存器分配和指派 13.3.1 自頂向下的局部寄存器分配 13.3.2 自底向上的局部寄存器分配 13.3.3 超越單個(gè)程序塊 13.4 全局寄存器分配和指派 13.4.1 找到全局活動(dòng)范圍 13.4.2 估算全局逐出代價(jià) 13.4.3 沖突和沖突圖 13.4.4 自頂向下著色 13.4.5 自底向上著色 13.4.6 合并副本以減小度數(shù) 13.4.7 比較自頂向下和自底向上全局分配器 13.4.8 將機(jī)器的約束條件編碼到?jīng)_突圖中 13.5 高級(jí)主題 13.5.1 圖著色寄存器分配方法的變體 13.5.2 靜態(tài)單賦值形式上的全局寄存器分配 13.6 小結(jié)和展望 附錄A ILOC 附錄B 數(shù)據(jù)結(jié)構(gòu) 參考文獻(xiàn) 索引
你還可能感興趣
我要評(píng)論
|