2.4 編譯程序
把用高級程序設計語(yǔ)言書(shū)寫(xiě)的源程序,翻譯成等價(jià)的計算機匯編語(yǔ)言或機器語(yǔ)言書(shū)寫(xiě)的目標程序的翻譯程序。編譯程序屬于采用生成性實(shí)現途徑實(shí)現的翻譯程序。它以高級程序設計語(yǔ)言書(shū)寫(xiě)的源程序作為輸入,而以匯編語(yǔ)言或機器語(yǔ)言表示的目標程序作為輸出。編譯出的目標程序通常還要經(jīng)歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。編譯程序的實(shí)現算法較為復雜。這是因為它所翻譯的語(yǔ)句與目標語(yǔ)言的指令不是一一對應關(guān)系,而是一多對應關(guān)系;同時(shí)也因為它要處理遞歸調用、動(dòng)態(tài)存儲分配、多種數據類(lèi)型,以及語(yǔ)句間的緊密依賴(lài)關(guān)系。但是,由于高級程序設計語(yǔ)言書(shū)寫(xiě)的程序具有易讀、易移植和表達能力強等特點(diǎn),編譯程序廣泛地用于翻譯規模較大、復雜性較高、且需要高效運行的高級語(yǔ)言書(shū)寫(xiě)的源程序。
功能
編譯程序的基本功能是把源程序翻譯成目標程序。但是,作為一個(gè)具有實(shí)際應用價(jià)值的編譯系統,除了基本功能之外,還應具備語(yǔ)法檢查、調試措施、修改手段、覆蓋處理、目標程序優(yōu)化、不同語(yǔ)言合用以及人-機聯(lián)系等重要功能。
、僬Z(yǔ)法檢查:檢查源程序是否合乎語(yǔ)法。如果不符合語(yǔ)法,編譯程序要指出語(yǔ)法錯誤的部位、性質(zhì)和有關(guān)信息。編譯程序應使用戶(hù)一次上機,能夠盡可能多地查出錯誤。
、谡{試措施:檢查源程序是否合乎設計者的意圖。為此,要求編譯程序在編譯出的目標程序中安置一些輸出指令編譯程序,以便在目標程序運行時(shí)能輸出程序動(dòng)態(tài)執行情況的信息,如變量值的更改、程序執行時(shí)所經(jīng)歷的線(xiàn)路等。這些信息有助于用戶(hù)核實(shí)和驗證源程序是否表達了算法要求。
、坌薷氖侄危簽橛脩(hù)提供簡(jiǎn)便的修改源程序的手段。編譯程序通常要提供批量修改手段(用于修改數量較大或臨時(shí)不易修改的錯誤)和現場(chǎng)修改手段(用于運行時(shí)修改數量較少、臨時(shí)易改的錯誤)。
、芨采w處理:主要是為處理程序長(cháng)、數據量大的大型問(wèn)題程序而設置的;舅枷胧亲屢恍┏绦蚨魏蛿祿媚承┐鎯^,其中只存放當前要用的程序或數據;其余暫時(shí)不用的程序和數據,先存放在磁盤(pán)等輔助存儲器中,待需要時(shí)動(dòng)態(tài)地調入。
、菽繕顺绦騼(yōu)化:提高目標程序的質(zhì)量,即占用的存儲空間少,程序的運行時(shí)間短。依據優(yōu)化目標的不同,編譯程序可選擇實(shí)現表達式優(yōu)化、循環(huán)優(yōu)化或程序全局優(yōu)化。目標程序優(yōu)化有的在源程序級上進(jìn)行,有的在目標程序級上進(jìn)行。
、薏煌Z(yǔ)言合用:其功能有助于用戶(hù)利用多種程序設計語(yǔ)言編寫(xiě)應用程序或套用已有的不同語(yǔ)言書(shū)寫(xiě)的程序模塊。最為常見(jiàn)的是高級語(yǔ)言和匯編語(yǔ)言的合用。這不但可以彌補高級語(yǔ)言難于表達某些非數值加工操作或直接控制、訪(fǎng)問(wèn)外圍設備和硬件寄存器之不足,而且還有利于用匯編語(yǔ)言編寫(xiě)核心部分程序,以提高運行效率。
、呷-機聯(lián)系:確定編譯程序實(shí)現方案時(shí)達到精心設計的功能。目的是便于用戶(hù)在編譯和運行階段及時(shí)了解內部工作情況,有效地監督、控制系統的運行。
早期編譯程序的實(shí)現方案,是把上述各項功能完全收納在編譯程序之中。然而,習慣做法是在操作系統的支持下,配置調試程序、編輯程序和連接裝配程序,用以協(xié)助實(shí)現程序的調試、修改、覆蓋處理,以及不同語(yǔ)言合用功能。但在設計編譯程序時(shí),仍須精心考慮如何與這些子系統銜接等問(wèn)題。
工作過(guò)程
編譯程序必須分析源程序,然后綜合成目標程序。首先,檢查源程序的正確性,并把它分解成若干基本成分;其次,再根據這些基本成分建立相應等價(jià)的目標程序部分。為了完成這些工作,編譯程序要在分析階段建立一些表格,改造源程序為中間語(yǔ)言形式,以便在分析和綜合時(shí)易于引用和加工。
數據結構 分析和綜合時(shí)所用的主要數據結構,包括符號表、常數表和中間語(yǔ)言程序。符號表由源程序中所用的標識符連同它們的屬性組成,其中屬性包括種類(lèi)(如變量、數組、結構、函數、過(guò)程等)、類(lèi)型(如整型、實(shí)型、字符串、復型、標號等),以及目標程序所需的其他信息。常數表由源程序中用的常數組成,其中包括常數的機內表示,以及分配給它們的目標程序地址。中間語(yǔ)言程序是將源程序翻譯為目標程序前引入的一種中間形式的程序,其表示形式的選擇取決于編譯程序以后如何使用和加工它。常用的中間語(yǔ)言形式有波蘭表示、三元組、四元組以及間接三元組等。
分析部分 源程序的分析是經(jīng)過(guò)詞法分析、語(yǔ)法分析和語(yǔ)義分析三個(gè)步驟實(shí)現的。詞法分析由詞法分析程序(又稱(chēng)為掃描程序)完成,其任務(wù)是識別單詞(即標識符、常數、保留字,以及各種運算符、標點(diǎn)符號等)、造符號表和常數表,以及將源程序換碼為編譯程序易于分析和加工的內部形式。語(yǔ)法分析程序是編譯程序的核心部分,其主要任務(wù)是根據語(yǔ)言的語(yǔ)法規則,檢查源程序是否合乎語(yǔ)法。如不合乎語(yǔ)法,則輸出語(yǔ)法出錯信息;如合乎語(yǔ)法,則分解源程序的語(yǔ)法結構,構造中間語(yǔ)言形式的內部程序。語(yǔ)法分析的目的是掌握單詞是怎樣組成語(yǔ)句的,以及語(yǔ)句又是如何組成程序的。語(yǔ)義分析程序是進(jìn)一步檢查合法程序結構的語(yǔ)義正確性,其目的是保證標識符和常數的正確使用,把必要的信息收集和保存到符號表或中間語(yǔ)言程序中,并進(jìn)行相應的語(yǔ)義處理。
編譯程序的功能是把某些高級語(yǔ)言書(shū)寫(xiě)的源程序翻譯成與之等價(jià)的低級語(yǔ)言(匯編語(yǔ)言或者機器語(yǔ)言)的目標程序。其過(guò)程可以分成6個(gè)階段。
過(guò)程階段 |
任務(wù)及其特點(diǎn) |
詞法分析階段 |
該階段的任務(wù)是從左到右逐個(gè)字符的讀入源程序,識別出一個(gè)個(gè)的單詞符號。 |
語(yǔ)法分析階段 |
該階段任務(wù)是在詞法分析的基礎上將單詞符號序列分解成各類(lèi)語(yǔ)法單元。 |
語(yǔ)義分析階段 |
審查源程序有無(wú)語(yǔ)義錯誤,為代碼生成階段收集類(lèi)型信息。 |
中間代碼生成階段 |
在進(jìn)行了上述的語(yǔ)法分析和語(yǔ)義分析階段的工作之后,有的編譯程序將源程序變成一種內部表示形式,這種內部表示形式叫做中間語(yǔ)言或中間代碼。所謂“中間代碼”是一種簡(jiǎn)單、含義明確的記號系統。 |
代碼優(yōu)化階段 |
該階段是對前階段產(chǎn)生的中間代碼進(jìn)行變換改造,目的是使生成的目標代碼更為高級,即省時(shí)間和省空間。優(yōu)化所依據的原則是程序的等價(jià)變換規則。 |
目標代碼生成階段 |
此階段使把中間代碼變換成特定機器上的絕對指令代碼或可重定位的指令代碼或匯編指令代碼。 |
其中,詞法分析和語(yǔ)法分析本質(zhì)上都是對源程序的結構進(jìn)行分析。而語(yǔ)義分析和中間代碼生成所依據的是語(yǔ)言的語(yǔ)義規則,一般采用語(yǔ)法指導翻譯和中間代碼生成。
自底向上分析法采用一個(gè)后進(jìn)先出棧的數據結構,是移進(jìn)-規約過(guò)程(找出句柄)。
自頂向下分析法必須改寫(xiě)文法,采用預測分析法,要消除左遞歸和提取公共左因子。
編譯過(guò)程6個(gè)階段的任務(wù)以及表格管理和出錯處理工作可分別由幾個(gè)模塊或程序完成,他們分別稱(chēng)作詞法分析程序、語(yǔ)法分析程序、語(yǔ)義分析程序,中間代碼生成程序、代碼優(yōu)化程序、目標代碼生成程序、表格管理程序和出錯處理程序。
相關(guān)推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |