preprocesador


En informática , un preprocesador (o precompilador ) [1] es un programa que procesa sus datos de entrada para producir una salida que se utiliza como entrada para otro programa. Se dice que la salida es una forma preprocesada de los datos de entrada, que a menudo es utilizada por algunos programas posteriores como compiladores . La cantidad y el tipo de procesamiento realizado depende de la naturaleza del preprocesador; algunos preprocesadores solo son capaces de realizar sustituciones textuales relativamente simples y expansiones de macros , mientras que otros tienen el poder de los lenguajes de programación completos .

Un ejemplo común de la programación de computadoras es el procesamiento realizado en el código fuente antes del siguiente paso de compilación. En algunos lenguajes de programación (p. ej., C y PL/I ) existe una fase de traducción conocida como preprocesamiento . También puede incluir procesamiento de macros, inclusión de archivos y extensiones de idioma.

Los preprocesadores léxicos son el nivel más bajo de los preprocesadores, ya que solo requieren análisis léxico , es decir, operan en el texto fuente, antes de cualquier análisis , mediante la sustitución simple de secuencias de caracteres tokenizados por otras secuencias de caracteres tokenizados, según lo definido por el usuario. reglas. Por lo general, realizan la sustitución de macros , la inclusión textual de otros archivos y la compilación o inclusión condicional.

El ejemplo más común de esto es el preprocesador C , que toma líneas que comienzan con '#' como directivas . Debido a que no sabe nada sobre el lenguaje subyacente, su uso ha sido criticado y muchas de sus funciones se integraron directamente en otros lenguajes. Por ejemplo, las macros reemplazadas con insertos y plantillas agresivos, incluyen importaciones en tiempo de compilación (esto requiere la preservación de la información de tipo en el código objeto, lo que hace que esta función sea imposible de adaptar a un lenguaje); la compilación condicional se logra de manera efectiva con la eliminación de código inactivoif-then-else en algunos lenguajes. Sin embargo, un punto clave a recordar es que todas las directivas del preprocesador deben comenzar en una nueva línea.

Otros preprocesadores léxicos incluyen el m4 de uso general , más comúnmente utilizado en sistemas de compilación multiplataforma como autoconf , y GEMA , un macroprocesador de código abierto que opera en patrones de contexto.

Los preprocesadores sintácticos se introdujeron con la familia de lenguajes Lisp . Su función es transformar los árboles de sintaxis de acuerdo con una serie de reglas definidas por el usuario. Para algunos lenguajes de programación, las reglas están escritas en el mismo lenguaje que el programa (reflexión en tiempo de compilación). Este es el caso de Lisp y OCaml . Algunos otros lenguajes se basan en un lenguaje completamente externo para definir las transformaciones, como el preprocesador XSLT para XML , o su contraparte de tipo estático CDuce .