編譯程式

編譯程式(Compiler,compiling program)也稱為編譯器,是指把用高級程式設計語言書寫的源程式,翻譯成等價的機器語言格式目標程式翻譯程式。編譯程式屬於採用生成性實現途徑實現的翻譯程式。它以高級程式設計語言書寫的源程式作為輸入,而以彙編語言或機器語言表示的目標程式作為輸出。編譯出的目標程式通常還要經歷運行階段,以便在運行程式的支持下運行,加工初始數據,算出所需的計算結果。

  • 中文名稱
    編譯程式
  • 外文名稱
    Compiler,compiling program

定義

編譯程式片語可以有兩種認識。

一、編譯程式是一種動作,是根據編譯原理技術,由高級程式語言編譯器翻譯成機器語言二進位代碼行為。

二、編譯程式是動名詞,特指生成編譯器的軟體程式。

簡介

編譯程式compiler

編譯程式的實現演算法較為復雜。這是因為它所翻譯的語句與目標語言的指令不是一一對應關系,而是一多對應關系;同時也因為它要處理遞歸調用動態存儲分配、多種資料類型,以及語句間的緊密依賴關系。但是,由于高級程式語言書寫的程式具有易讀、易移植和表達能力強等特點,編譯程式廣泛地用于翻譯規模較大、復雜性較高、且需要高效運行的高級語言書寫的源程式。

功能

編譯程式的基本功能是把源程式(高級語言)翻譯成目標程式。但是,作為一個具有實際套用價值的編譯系統,除了基本功能之外,還應具備文法檢查、調試措施、修改手段、覆蓋處理、目標程式最佳化、不同語言合用以及人-機聯系等重要功能。①文法檢查:檢查源程式是否合乎文法。如果不符合文法,編譯程式要指出文法錯誤的部位、性質和有關信息。編譯程式應使使用者一次上機,能夠盡可能多地查出錯誤。②調試措施:檢查源程式是否合乎設計者的意圖。為此,要求編譯程式在編譯出的目標程式中安置一些輸出指令,以便在目標程式運行時能輸出程式動態執行情況的信息,如變數值的變更、程式執行時所經歷的線路等。這些信息有助于使用者核實和驗證源程式是否表達了演算法要求。③修改手段:為使用者提供簡便的修改源程式的手段。編譯程式通常要提供批量修改手段(用于修改數量較大或臨時不易修改的錯誤)和現場修改手段(用于運行時修改數量較少、臨時易改的錯誤)。④覆蓋處理:主要是為處理程式長、資料量大的大型問題程式而設定的。基本思想是讓一些程式段和資料公用某些存儲區,其中隻存放當前要用的程式或資料;其餘暫時不用的程式和資料,先存放在磁碟等輔助存儲器中,待需要時動態地調入。⑤目標程式最佳化:提高目標程式的質量,即佔用的存儲空間少,程式的運行時間短。依據最佳化目標的不同,編譯程式可選擇實現表達式最佳化、迴圈最佳化或程式全局最佳化。目標程式最佳化有的在源程式級上進行,有的在目標程式級上進行。⑥不同語言合用:其功能有助于使用者利用多種程式語言編寫應用程式或套用已有的不同語言書寫的程式模組。最為常見的是高級語言和匯編語言的合用。這不但可以彌補高級語言難于表達某些非數值加工操作或直接控製、訪問外圍設備和硬體暫存器之不足,而且還有利于用匯編語言編寫核心部分程式,以提高運行效率。⑦人-機聯系:確定編譯程式實現方案時達到精心設計的功能。目的是便于使用者在編譯和運行階段及時了解內部工作情況,有效地監督、控製系統的運行。早期編譯程式的實現方案,是把上述各項功能完全收納在編譯程式之中。然而,習慣做法是在作業系統的支持下,配置調試程式編輯程式和連線裝配程式,用以協助實現程式的調試、修改、覆蓋處理,以及不同語言合用功能。但在設計編譯程式時,仍須精心考慮如何與這些子系統銜接等問題。

編譯程式編譯程式 編譯程式書籍編譯程式書籍

工作過程

編譯程式必須分析源程式,然後綜合成目標程式。首先,檢查源程式的正確性,並把它分解成若幹基本成分;其次,再根據這些基本成分建立相應等價的目標程式部分。為了完成這些工作,編譯程式要在分析階段建立一些表格,改造源程式為中間語言形式,以便在分析和綜合時易于引用和加工(圖1)。

資料結構分析和綜合時所用的主要資料結構,包括符號表、常數表和中間語言程式。符號表源程式中所用的標識符連同它們的屬性組成,其中屬性包括種類(如變數、數組、結構、函式、過程等)、類型(如整型、實型、字元串、復型、標號等),以及目標程式所需的其他信息。常數表由源程式中用的常數組成,其中包括常數的機內表示,以及分配給它們的目標程式地址。中間語言程式是將源程式翻譯為目標程式前引入的一種中間形式的程式,其表示形式的選擇取決于編譯程式以後如何使用和加工它。常用的中間語言形式有波蘭表示、三元組、四元組以及間接三元組等。

分析部分源程式的分析是經過詞法分析文法分析和語義分析三個步驟實現的。詞法分析由詞法分析程式(又稱為掃描程式)完成,其任務是識別單詞(即標識符、常數、保留字,以及各種運算符、標點符號等)、造符號表和常數表,以及將源程式換碼為編譯程式易于分析和加工的內部形式。文法分析程式是編譯程式的核心部分,其主要任務是根據語言的文法規則,檢查源程式是否合乎文法。如不合乎文法,則輸出文法出錯信息;如合乎文法,則分解源程式的文法結構,構造中間語言形式的內部程式。文法分析的目的是掌握單詞是怎樣組成語句的,以及語句又是如何組成程式的。語義分析程式是進一步檢查合法程式結構的語義正確性,其目的是保證標識符和常數的正確使用,把必要的信息收集和儲存到符號表或中間語言程式中,並進行相應的語義處理。

綜合部分

綜合階段必須根據符號表和中間語言程式產生出目標程式,其主要工作包括代碼最佳化、存儲分配和代碼生成代碼最佳化是通過重排和改變程式中的某些操作,以產生更加有效的目標程式。存儲分配的任務是為程式和資料分配運行時的存儲單元代碼生成的主要任務是產生與中間語言程式符等價的目標程式,順序加工中間語言程式,並利用符號表和常數表中的信息生成一系列的匯編語言或機器語言指令。

結構

編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析文法分析、語義分析、代碼最佳化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟隻表示編譯程式各部分之間的邏輯聯系,而不是時間關系。編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程式的具體結構時,常常分若幹遍實現。對于源程式或中間語言程式,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。例如,可以把詞法分析作為第一遍;文法分析和語義分析作為第二遍;代碼最佳化和存儲分配作為第三遍;代碼生成作為第四遍。反之,為了適應較小的存儲空間或提高目標程式質量,也可以把一個邏輯步驟的工作分為幾遍去執行。例如,代碼最佳化可劃分為代碼最佳化準備工作和實際代碼最佳化兩遍進行。

一個編譯程式是否分遍,以及如何分遍,根據具體情況而定。其判別標準可以是存儲容量的大小、源語言的繁簡、解題範圍的寬窄,以及設計、編製人員的多少等。分遍的好處是各遍功能獨立單純、相互聯系簡單、邏輯結構清晰、最佳化準備工作充分。缺點是各遍之中不可避免地要有些重復的部分,而且遍和遍之間要有交接工作,因之增加了編譯程式的長度和編譯時間

一遍編譯程式是一種極端情況,整個編譯程式同時駐留在記憶體,彼此之間採用調用轉接方式連線在一起(圖2)。當文法分析程式需要新符號時,它就調用詞法分析程式;當它識別出某一文法結構時,它就調用語義分析程式。語義分析程式對識別出的結構進行語義檢查,並調用"存儲分配"和"代碼生成"程式生成相應的目標語言指令。

隨著程式語言在形式化、結構化、直觀化和智慧型化等方面的發展,作為實現相應語言功能的編譯程式,也正向自動程式設計的目標發展,以便提供理想的程式設計工具。

參考書目

陳火旺、錢家驊、孫永強編:《編譯原理》,國防工業出版社,北京,1980。

A.V.Aho, Principles of Compiler Design,Addison Wes-ley, Reading, Massachusetts, 1977.

動態

20世紀80年代以後,程式語言在形式化、結構化、直觀化和智慧型化等方面有了長足的進步和發展,主要表現在兩個方面:①隨著程式設計理論和方法的發展,相繼推出了一系列新型程式語言,如結構化程式設計語言、並發程式設計語言、分散式程式語言、函式式程式設計語言、智慧型化程式語言、面向對象程式語言等;②基于文法、語義和語用方面的研究成果,從不同的角度和層次上深刻地揭示了程式語言的內在規律和外在表現形式。與此相應地,作為實現程式語言重要手段之一的編譯程式,在體系結構、設計思想、實現技術和處理內容等方面均有不同程度的發展、變化和擴充。另外,編譯程式已作為實現編程的重要軟體工具,被納入到軟體支援環境的基本層軟體工具之中。因此,規劃編譯程式實現方案時,應從所處的具體軟體支援環境出發,既要遵循整個環境的全局性要求和規定,又要精心考慮與其他諸層軟體 工具之間的相互支援、配合和銜接關系。

相關詞條

其它詞條