宏處理器和預處理器有什麼區別?
宏處理器
許多組合語言都支援“宏”功能,其中宏語句將在轉換為機器程式之前轉換為一系列組合語言語句,並可能包含其他宏語句。因此,宏功能是一種文字替換功能。
為了說明宏的實用性,可以考慮一種情況,即機器沒有單個機器或組合語言語句可以將一個記憶體地址的內容加到另一個記憶體地址上,例如假設的彙編指令 ADD X, Y。相反,假設機器有 LOAD 指令,它將資料從記憶體移動到暫存器,ADD 指令,它將記憶體地址的內容加到暫存器的內容上,以及 STORE 指令,它將資料從暫存器移動到記憶體。
透過使用這些指令,可以使用宏定義建立一個“雙地址加法”指令,如下所示:
MACRO ADD2 X, Y LOAD Y ADD X STORE Y ENDMACRO
第一條語句將名稱 ADD2 賦予宏並定義其虛擬引數(稱為形式引數)X 和 Y。
接下來的三條語句定義了宏,即它們給出了宏的翻譯。可以假設機器只有一個暫存器,因此無需考慮 LOAD 和 STORE 指令引用的暫存器是什麼。可以使用 ADD2 作為普通的組合語言操作碼。
預處理器
預處理器是一個在源程式傳遞給編譯器之前處理源程式的程式。它在稱為預處理器命令列或指令的控制下執行。預處理器指令位於主線之前的原始碼中。預處理器為編譯器提供輸入。它可以執行以下功能:
**宏處理** - 預處理器可以允許使用者定義宏,這些宏是更高階結構的簡寫。
**檔案包含** - 預處理器可以將標頭檔案包含到程式 LEX 中。例如,C 預處理器在處理包含此語句的檔案時,會生成檔案 <global.h> 的內容以恢復語句 #include<global.h>。
**合理預處理器** - 這些處理器透過額外的當前控制流和資料結構設施來增強早期語言。例如,這樣的預處理器可以為使用者提供內建宏,用於構造 while 語句或 if 語句,而程式語言本身並不存在這些語句。
**語言擴充套件** - 這些處理器試圖向語言中插入功能。例如,語言 SQL 是一個安裝在 C 中的資料庫查詢語言。以 # 開頭的語句被預處理器視為獨立於 C 的資料庫訪問語句,並被轉換為實現資料庫訪問的例程中的過程呼叫。