複製鏈接
請複製以下鏈接發送給好友

預處理器

鎖定
預處理器是在真正的編譯開始之前由編譯器調用的獨立程序。預處理器可以刪除註釋、包含其他文件以及執行(宏macro是一段重複文字的簡短描寫)替代。
中文名
預處理器
外文名
preprocessor
性    質
由編譯器調用的獨立程序
領    域
計算機

預處理器簡介

預處理器可由語言(如CPHP)要求或以後作為提供額外功能(諸如為FORTRAN提供Ratfor預處理器)的附加軟件。
計算機科學中,預處理器程序中處理輸入數據,產生能用來輸入到其他程序的數據的程序。輸出被稱為輸入數據預處理過的形式,常用在之後的程序比如編譯器中。所作處理的數量和種類依賴於預處理器的類型,一些預處理器只能夠執行相對簡單的文本替換和展開,而另一些則有着完全成熟的編程語言的能力。
一個來自計算機編程的常見的例子是在進行下一步編譯之前,對源代碼執行處理。在一些計算機語言(例如:C語言)中有一個叫做預處理翻譯階段。 [1] 

預處理器詞法預處理器

詞法預處理器是最低級的預處理器,因為它們只需要詞法分析,也就是説,它們在語法分析處理之前,根據用户定義的規則,進行簡單的詞法單元替換。典型的詞法預處理器產生宏替換,包含其他文件的文本,並且條件性地編譯或者包含文件。 [1] 

預處理器C預處理器

最常見的例子是C預處理器,採用以'#'為行首的指示。因為它不知道底層語言,它的使用被批評並且它的許多功能被其它語言直接內建。例如,宏替換被顯示內聯和模板替代,包含變為編譯期導入(compile-time import,這需要在目標代碼中預先保存類型信息,使這個功能無法改進一個語言);條件編譯被if-then-else和死代碼消除替代。 [1] 

預處理器其他預處理器

其他詞法預處理器包括一般用途的m4,最常用的跨平台構建系統,比如autoconf,和開源的宏處理器GEMA,操作上下文模式。 [1] 

預處理器句法預處理器

句法預處理器是由Lisp家族語言引進的。它們的作用是根據若干用户定義的規則轉換語法樹。對於某些程序語言,這些規則是使用同一種語言來寫的(compile-time reflection)。這就是LispOCaml的情況。某些編程語言依靠一個完全的外部語言來定義轉換,例如XSLT處理器處理XML的方式,或與靜態類型的對應語言CDuse。
靜態處理器常被用來自定編程語言的語法,並透過增加新的primitives或嵌入特定領域語言(Domain-Specific Programming Language)到一般用途的語言裏來擴充。 [2] 

預處理器自定義語法

關於自定義語法的一個好例子是在OCaml編程語言裏兩個不同語法的存在。程式可能平常地由“正常語法”或“校正過的語法”寫成,並且按需求由兩者之一進行程式優化
類似地,一些OCaml語言寫成的程式藉由新運算符的增加來自定化語言的語法。 [2] 

預處理器擴充語言

對於從宏擴充語言最好的範例可在LISP語言家族裏找到。這種語言本身就是簡單的動態類型核心模塊,SchemeCommon Lisp的標準分配允許了命令或面向對象的程式編輯,靜態類型亦如此。幾乎所有這些特性都由語法預處理執行,雖然它的“宏擴充”編譯階段由LISP的編譯器處理這點很值得一提就是。這仍然可以視為預處理的一種形式,因為它在編譯階段前就進行了。
類似地,靜態檢查、類型安全正規表式或代碼生成可能透過宏被加入到OCaml的語法和語義裏,如同微線程(亦稱為協程或fibers)、單子或透明的XML操作。 [2] 

預處理器作為模板引擎的預處理器

任何“一般目的預處理器”,例如M4,都可以當成模版引擎(template engine)使用。 [2] 
參考資料
  • 1.    Show how to use C-preprocessor on JavaScript files. "JavaScript is Not Industrial Strength" by T. Snyder.
  • 2.    Show how to use C-preprocessor as template engine. "Using a C preprocessor as an HTML authoring tool" by J. Korpela, 2000.