預處理器
![本頁使用了標題或全文手工轉換](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
在電腦科學中,預處理器(英語:Preprocessor)是程式中處理輸入資料,產生能用來輸入到其他程式的資料的程式。輸出被稱為輸入資料預處理過的形式,常用在之後的程式比如編譯器中。所作處理的數量和種類依賴於預處理器的類型,一些預處理器只能夠執行相對簡單的文字替換和巨集展開,而另一些則有著完全成熟的程式語言的能力。
一個來自電腦編程的常見的例子是在進行下一步編譯之前,對原始碼執行處理。在一些電腦語言(例如:C語言)中有一個叫做預處理的翻譯階段。
詞法預處理器
詞法預處理器是最低階的預處理器,因為它們只需要詞法分析,也就是說,它們在語法分析處理之前,根據使用者定義的規則,進行簡單的詞法單元替換。典型的詞法預處理器產生宏替換,包含其他檔案的文字,並且條件性地編譯或者包含檔案。
C預處理器
最常見的例子是C預處理器,採用以'#'為行首的指示。因為它不知道底層語言,它的使用被批評並且它的許多功能被其它語言直接內建。例如,巨集替換被顯式行內和模板替代,包含變為編譯期匯入(compile-time import,這需要在目的碼中預先儲存類型資訊,使這個功能無法改進一個語言);條件編譯被if-then-else
和死代碼消除替代。
其他預處理器
其他詞法預處理器包括一般用途的m4,最常用的跨平台構建系統,比如autoconf,和開源的巨集處理器GEMA,操作上下文模式。
句法預處理器
句法預處理器是由Lisp家族語言引進的。它們的作用是根據若干使用者定義的規則轉換語法樹。對於某些程式語言,這些規則是使用同一種語言來寫的(compile-time reflection)。這就是Lisp和OCaml的情況。某些程式語言依靠一個完全的外部語言來定義轉換,例如XSLT處理器處理XML的方式,或與靜態類型的對應語言CDuse。
靜態處理器常被用來自訂程式語言的語法,並透過增加新的primitives或嵌入特定領域語言到一般用途的語言裡來擴充。
自訂語法
關於自訂語法的一個好例子是在OCaml程式語言裡兩個不同語法的存在。[1]程式可能平常地由「正常語法」或「校正過的語法」寫成,並且按需求由兩者之一進行程式優化
類似地,一些OCaml語言寫成的程式藉由新運算子的增加來自訂化語言的語法。
擴充語言
對於從巨集擴充語言最好的範例可在LISP語言家族裡找到。這種語言本身就是簡單的動態類型核心模組,Scheme或Common Lisp的標準分配允許了命令或物件導向的程式編輯,靜態類型亦如此。幾乎所有這些特性都由語法預處理執行,雖然它的「巨集擴充」編譯階段由LISP的編譯器處理這點很值得一提就是。這仍然可以視為預處理的一種形式,因為它在編譯階段前就進行了。
類似地,靜態檢查、類型安全正規表式或代碼生成可能透過巨集被加入到OCaml的語法和語義裡,如同微執行緒(亦稱為協程或纖程)、單子或透明的XML操作。
語言專門化
作為模板引擎的預處理器
任何「一般目的預處理器」,例如M4,都可以當成模版引擎(template engine)使用。
參考文獻
- ^ The Revised syntax Archive-It的存檔,存檔日期2015-09-24 from The Caml language website
外部連結
- DSL Design in Lisp
- Programming from the bottom up (頁面存檔備份,存於網際網路檔案館)
- The Generic PreProcessor (頁面存檔備份,存於網際網路檔案館)
- Gema, the General Purpose Macro Processor (頁面存檔備份,存於網際網路檔案館)
- The PIKT piktc (頁面存檔備份,存於網際網路檔案館) text, script, and configuration file preprocessor (頁面存檔備份,存於網際網路檔案館)
- minimac, a minimalist macro processor (頁面存檔備份,存於網際網路檔案館)
- Java Comment Preprocessor (頁面存檔備份,存於網際網路檔案館)