宏處理程序是指把源程序中的宏指令或宏語句擴(kuò)展成等價的、預(yù)先定義的指令序列或語句序列的處理系統(tǒng)。1
簡述宏處理程序考慮源文件與匯編程序考慮源文件是大不相同的。對于匯編程序來說。源文件是一系列控制行、指令行和命令行;對于宏處理程序而言,源文件則是一長串字符。
在匯編代碼之前必須先完成源文件的全部宏處理。由于宏處理與代碼匯編無關(guān),因此必須把宏處理時間和匯編時間區(qū)分開,在宏處理時間,匯編語言的符號、標(biāo)號、事先定義的匯編程序符號和EQU符號以及定位計數(shù)器都是未知的。宏處理程序、識別不出匯編語言的格式。同樣,在匯編時也不知道宏程序的任何信息。
宏處理程序掃描源文件,尋找宏調(diào)用。宏調(diào)用實際上是請求宏處理程序來再定義一個用戶定義宏或者用宏處理所定義的值來替換一個內(nèi)部宏或用戶定義宏。
宏的定義值或回送值就是替換宏調(diào)用的文本。有些宏的回送值是零串(即不含字符的字符串),換言之,當(dāng)調(diào)用這些宏時,會把調(diào)用從輸入文件中移開,匯編程序根本不會感覺到它的存在,這對于條件匯編是非常有用的。
因此,在遇到宏調(diào)用時,宏處理程序把該宏調(diào)用展開成它的回送值。然后把宏的回送值送給匯編程序并繼續(xù)執(zhí)行宏處理程序,把不屬于宏調(diào)用部分的全部字符都送到匯編程序中去。2
基本概念宏指令或宏語句實際上是按規(guī)定格式書寫的某一源程序段的縮寫。它們通常是用戶根據(jù)自己的特定需要,采用程序設(shè)計語言所提供的指令或語句來定義,稱之為宏定義,其中應(yīng)給出宏的名字、格式、參數(shù)和等價的指令序列或語句序列。
對于常用的宏指令或宏語句亦可由系統(tǒng)預(yù)先定義,供用戶直接引用。當(dāng)用戶在程序中要使用宏指令或宏語句功能時,只要按宏定義的格式,給出宏的名字及其相應(yīng)的參數(shù)即可,這稱之為宏調(diào)用。
當(dāng)宏處理程序?qū)⒃闯绦蛑谐霈F(xiàn)的宏調(diào)用擴(kuò)展成等價的宏指令序列或宏語句序列時,稱之為宏擴(kuò)展。
建立宏處理程序后,用戶可以方便地定義和使用自己所需的宏指令或宏語句。這不僅能簡化應(yīng)用程序的編寫,而且有助于軟件人員研究和移植有關(guān)的軟件。例如,利用宏指令或宏語句設(shè)計虛擬機(jī),研究新的語言,以及生成帶有變化成分的軟件等。1
實現(xiàn)方法宏處理程序通常采用兩遍算法實現(xiàn):第一遍收集宏定義的信息;第二遍對源程序中的宏調(diào)用實施宏擴(kuò)展。在第一遍掃描中,遇到宏定義時,應(yīng)把名字、格式、參數(shù)等信息以及隨后的等價的指令序列或語句序列記錄到宏定義表中。對于源程序中宏定義以外的部分,將不加改變地復(fù)寫到目標(biāo)程序區(qū)中。第二遍掃描第一遍所產(chǎn)生的中問結(jié)果程序。遇到宏調(diào)用時,則將宏定義表中相應(yīng)的等價指令序列或語句序列復(fù)寫到目標(biāo)程序區(qū)中。復(fù)寫過程中,要用宏調(diào)用中的實在參數(shù)替換宏定義中的形式參數(shù)。如果限制每個宏調(diào)用只能調(diào)用前面已定義的宏指令或宏語句,那么這種宏處理程序的實現(xiàn)算法可合并成一遍算法來完成。
功能較強(qiáng)的宏處理程序還可增加嵌套宏定義、嵌套宏調(diào)用或條件宏處理等功能。如果宏定義中含有另外的宏定義,則稱為嵌套宏定義。如果宏定義A中出現(xiàn)宏調(diào)用,那么在擴(kuò)展A的宏調(diào)用過程中,又要進(jìn)一步轉(zhuǎn)去擴(kuò)展其他的宏調(diào)用,這種情況稱為嵌套宏調(diào)用。如果宏處理程序能根據(jù)宏調(diào)用中的特殊參數(shù),有選擇地把宏調(diào)用擴(kuò)展成不同的指令序列或語句序列,則稱為條件宏處理。1
本詞條內(nèi)容貢獻(xiàn)者為:
王沛 - 副教授、副研究員 - 中國科學(xué)院工程熱物理研究所