预处理器可由语言(如
C,
PHP)要求或以后作为提供额外功能(诸如为FORTRAN提供Ratfor预处理器)的附加软件。
在
计算机科学中,预处理器是
程序中处理输入数据,产生能用来输入到其他程序的数据的程序。输出被称为输入数据预处理过的形式,常用在之后的程序比如
编译器中。所作处理的数量和种类依赖于预处理器的类型,一些预处理器只能够执行相对简单的文本替换和
宏展开,而另一些则有着完全成熟的
编程语言的能力。
一个来自计算机编程的常见的例子是在进行下一步编译之前,对
源代码执行处理。在一些
计算机语言(例如:
C语言)中有一个叫做预处理的
翻译阶段。
词法预处理器是最低级的预处理器,因为它们只需要
词法分析,也就是说,它们在
语法分析处理之前,根据用户定义的规则,进行简单的词法单元替换。典型的词法预处理器产生宏替换,
包含其他文件的文本,并且条件性地
编译或者包含文件。
最常见的例子是C预处理器,采用以'#'为行首的指示。因为它不知道底层语言,它的使用被批评并且它的许多功能被其它语言直接内建。例如,宏替换被显示内联和模板替代,包含变为编译期导入(compile-time import,这需要在目标代码中预先保存类型信息,使这个功能无法改进一个语言);条件编译被if-then-else和死代码消除替代。
句法预处理器是由
Lisp家族语言引进的。它们的作用是根据若干用户定义的规则转换语法树。对于某些程序语言,这些规则是使用同一种语言来写的(compile-time reflection)。这就是
Lisp和
OCaml的情况。某些编程语言依靠一个完全的外部语言来定义转换,例如
XSLT处理器处理
XML的方式,或与静态类型的对应语言CDuse。
静态处理器常被用来自定编程语言的语法,并透过增加新的primitives或嵌入特定领域语言(Domain-Specific Programming Language)到一般用途的语言里来扩充。
关于自定义语法的一个好例子是在
OCaml编程语言里两个不同语法的存在。程式可能平常地由“正常语法”或“校正过的语法”写成,并且按需求由两者之一进行程式优化
类似地,一些
OCaml语言写成的程式借由新运算符的增加来自定化语言的语法。
对于从宏扩充语言最好的范例可在
LISP语言家族里找到。这种语言本身就是简单的动态类型核心模块,
Scheme或
Common Lisp的标准分配允许了命令或面向对象的程式编辑,静态类型亦如此。几乎所有这些特性都由语法预处理执行,虽然它的“宏扩充”编译阶段由LISP的编译器处理这点很值得一提就是。这仍然可以视为预处理的一种形式,因为它在编译阶段前就进行了。
任何“一般目的预处理器”,例如
M4,都可以当成模版引擎(template engine)使用。