劉浩甜 河南大學軟件學院
計算機語言之所以能夠由單一的機器語言發展到現如今的數千種高級語言,是由于有了編譯技術。編譯技術的核心思想就是把同樣的邏輯結構和思想從一種語言表示轉化為另外一種語言表示。編譯程序就是把一種高級語言(源語言)書寫的程序轉換成與之等價的一種低級語言(目標語言)書寫的程序。

圖1 編譯程序總框
把某種高級語言書寫的源程序轉換成與之等價的機器可識別的語言,這個轉換過程叫做編譯過程。從計算機系統輸入源程序到輸出目標程序為止的整個過程大致可以劃分為五個階段:詞法分析,語法分析、語義分析與中間代碼產生、優化、目標代碼生成。除了這五個階段一個完整的編譯程序還包括表格管理和出錯處理。
詞法分析是編譯程序進行翻譯的第一個階段,詞法分析是一種線性分析。它的任務是從左至右逐個字符的對源程序進行掃描,產生一個個的單詞符號如基本字(begin,end,if,for,while等)、標識符、常量、算符和界符(標點符號、左右括號等等)。把作為字符串的源程序改造成為單詞符號串的中間程序。它以程序設計語言編制的源程序作為輸入,以單詞序列作為輸出。分詞過程可以通過編制程序自動完成,我們通常稱這個分詞程序為詞法分析器。詞法分析器分析的源程序可以是現有的各類程序設計語言源程序也可以是人為給定的模型語言的源程序。
語法分析是編譯過程的第二個階段,語法分析是一種層次結構的分析,語法分析的任務是在詞法分析的基礎上,根據語言的語法規則把單詞符號串分解成各類語法單位(語法范疇),如“短語”、“子句”、“句子” (“語句” )、“程序段”和“程序”。通過語法分解,確定整個輸入串是否構成一個語法上的正確“程序”。語法分析所依循的是語言的語法規則。語法分析通常使用上下文無關文法描述。例如,符號串X=1+2表示成如圖2所示的語法樹。

圖2 語法數
緊接在詞法分析和語法分析后編譯程序要做的就是進行語義分析,程序的語義即它的“意思”,離開語義,語言不過是一堆符號的集合,本階段的任務就是對語法分析所識別出的各類語法范疇進行分析,并進行初步翻譯(產生中間代碼)。程序的語義確定程序的運行,但是大多數的程序設計語言都具有在執行之前被確定的特征,這些特征被稱作靜態語義。首先對每種語法范疇進行靜態語義檢查,一般的程序設計語言的典型靜態語義包括聲明和類型檢查。如語義分析程序按照語言的類型檢查與每個運算符相關的運算對象,看它們的類型是否合法如果語義正確則進行中間代碼的翻譯,在不同語言中有著形式完全相同的語法單位但它們的含義卻不相同,語義分析階段所依循的是所用語言的語義規則。通常使用屬性文法描述語義規則。在進行了語法分析和語義分析階段的工作之后,有的編譯程序將源程序變成一種內部表示的形式,這種內部表示形式叫做中間語言或中間代碼,所謂“中間代碼”是一種結構簡單、含義明確的記號系統,這種記號系統可以設計為多種多樣的形式,重要的設計原則為兩點:一是容易生成;二是容易將它翻譯為目標代碼。很多編譯程序采用了一種近似“三地址指令”的四元式中間代碼,這種四元式的形式為:運算符、左操作樹、右操作樹、結果。
此階段的任務是就是對前階段產生的中間代碼進行加工變換,以期在最后階段產生出占用空間更少、運行速度更快的目標代碼,即省時間和省空間。
本階段實現了最后的翻譯,把經過優化后的中間代碼變換成可重定位的機器代碼或匯編語言代碼。這階段的工作有賴于硬件系統結構和機器指令含義。
編譯程序在工作過程中需保持一系列表格,以登記源程序的各類信息和編譯各階段的進展狀況。在所使用的表格中,最重要的是符號表,如標識符的各種屬性就是在編譯的各個階段填入符號表的。
編譯程序不僅能對書寫正確的程序進行翻譯,也應能對出現在源程序中的錯誤進行處理。即源程序中若有錯誤,編譯程序應設法發現錯誤,并把有關信息報告給用戶,這就是出錯處理程序的任務
[1]編譯技術研究與逆向工程實踐,胡燕京,李彩霞,周子琛,羅海寧 《現代電子技術》2007年第16期總第255期
[2]編譯技術的發展及應用,張亞娟,馮靈霞,王學春 軟 件 導 刊2010年9月
[3]高級語言中編譯程序編譯過程淺析,朱志平,渭南師范學院學報2001年3月
[4]淺談高級語言的執行方式——編譯過程,趙麗,齊興斌,電力學報 2008年6月
[5]陳火旺,劉春林.程序設計語言編譯原理[M].北京:國防工業出版社,2000年 2月