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