预处理器

维基百科,自由的百科全书
跳转至: 导航搜索

计算机科学中,预处理器程序中处理输入数据,产生能用来输入到其他程序的数据的程序。输出被称为输入数据预处理过的形式,常用在之后的程序比如编译器中。所作处理的数量和种类依赖于预处理器的类型,一些预处理器只能够执行相对简单的文本替换和巨集展开,而另一些则有着完全成熟的编程语言的能力。

一个来自计算机编程的常见的例子是在进行下一步编译之前,对源代码执行处理。在一些计算机语言(例如:C语言)中有一个叫做预处理翻译阶段。

词法预处理器[编辑]

词法预处理器是最低级的预处理器,因为它们只需要词法分析,也就是说,它们在语法分析处理之前,根据用户定义的规则,进行简单的词法单元替换。典型的词法预处理器产生宏替换包含其他文件的文本,并且条件性地编译或者包含文件。

C 预处理器[编辑]

最常见的例子是 C 预处理器,采用以'#'为行首的指示。因为它不知道底层语言,它的使用被批评并且它的许多功能被其它语言直接内建。例如,巨集替换被显示内联和模板替代,包含变为编译期导入(compile-time import)(这需要在目标代码中预先保存类型信息,使这个功能无法改进一个语言); 条件编译被if-then-else和死代码消除替代。

其他预处理器[编辑]

其他词法预处理器包括一般用途的m4,最常用的跨平台构建系统,比如autoconf,和开源的巨集处理器GEMA,操作上下文模式。

句法预处理器[编辑]

句法预处理器是由Lisp家族语言引进的。它们的作用是根据若干用户定义的规则转换语法树。对于某些程序语言,这些规则是使用同一种语言来写的(compile-time reflection)。这就是LispOCaml的情况。 某些程式語言依靠一個完全的外部語言來定義轉換,例如XSLT處理器處理XML的方式,或與靜態類型的對應語言 CDuse

靜態處理器常被用來自定程式語言的語法,並透過增加新的 primitives 或嵌入特定領域語言Domain-Specific Programming Language)到一般用途的語言裡來擴充。

自定義語法[编辑]

關於自定義語法的一個好例子是在OCaml程式語言裡兩個不同語法的存在。[1]程式可能平常地由「正常語法」或「校正過的語法」寫成,並且按需求由兩者之一進行程式優化

類似地,一些OCaml語言寫成的程式藉由新運算符的增加來自定化語言的語法。

擴充語言[编辑]

對於從巨集擴充語言最好的範例可在LISP語言家族裡找到。這種語言本身就是簡單的動態類型核心模塊,SchemeCommon Lisp的標準分配允許了命令或物件導向的程式編輯,靜態類型亦如此。 幾乎所有這些特性都由語法預處理執行,雖然它的「巨集擴充」編譯階段由LISP的編譯器處理這點很值得一提就是。這仍然可以視為預處理的一種形式,因為它在編譯階段前就進行了。

類似地,靜態檢查、類型安全正規表式代碼生成可能透過巨集被加入到OCaml的語法和語義裡,如同微線程(亦稱為協程fibers)、單子或透明的XML操作。

語言專門化[编辑]

作為模板引擎的預處理器[编辑]

任何「一般目的預處理器」,例如 M4,都可以當成模版引擎(template engine)使用。

参考文献[编辑]

  1. ^ The Revised syntax from The Caml language website

外部链接[编辑]