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 en otro programa. Se dice que la salida es una forma preprocesada de los datos de entrada, que a menudo utilizan programas posteriores como los compiladores . La cantidad y el tipo de procesamiento realizado dependen de la naturaleza del preprocesador; algunos preprocesadores solo son capaces de realizar sustituciones de texto y expansiones de macros relativamente simples, mientras que otros tienen la potencia de lenguajes de programación completos .
Un ejemplo común en programación informática es el procesamiento del código fuente antes de la compilación. En algunos lenguajes de programación (como C y PL/I ) existe una fase de traducción denominada preprocesamiento , que puede incluir el procesamiento de macros, la inclusión de archivos y las extensiones de lenguaje.
preprocesadores léxicos
Los preprocesadores léxicos son los preprocesadores de nivel más bajo, ya que solo requieren análisis léxico ; es decir, operan sobre el texto fuente, antes de cualquier análisis sintáctico , mediante la simple sustitución de secuencias de caracteres tokenizadas por otras secuencias de caracteres tokenizadas, según reglas definidas por el usuario. Normalmente realizan sustitución de macros , inclusión textual de otros archivos y compilación o inclusión condicional.
Preprocesador de C
El ejemplo más común de esto es el preprocesador de C , que toma las líneas que comienzan con '#' como directivas . El preprocesador de C no espera que su entrada utilice la sintaxis del lenguaje C. Algunos lenguajes adoptan un enfoque diferente y utilizan características integradas del lenguaje para lograr cosas similares. Por ejemplo:
- En lugar de macros, algunos lenguajes utilizan la inserción agresiva de código en línea y plantillas.
- En lugar de usar inclusiones, algunos lenguajes utilizan importaciones en tiempo de compilación que dependen de la información de tipo presente en el código objeto.
- Algunos lenguajes utilizan
if-then-elsela eliminación de código muerto para lograr la compilación condicional .
Otros preprocesadores léxicos
Otros preprocesadores léxicos incluyen el de propósito general m4 , que se usa con mayor frecuencia en sistemas de compilación multiplataforma como autoconf , y GEMA , un procesador de macros de código abierto que opera con patrones de contexto.
preprocesadores sintácticos
Los preprocesadores sintácticos se introdujeron con la familia de lenguajes Lisp . Su función es transformar árboles sintácticos según una serie de reglas definidas por el usuario. En algunos lenguajes de programación, las reglas se escriben en el mismo lenguaje que el programa (reflexión en tiempo de compilación). Este es el caso de Lisp y OCaml . Otros lenguajes dependen de un lenguaje completamente externo para definir las transformaciones, como el preprocesador XSLT para XML o su equivalente de tipado estático, CDuce.
Los preprocesadores sintácticos se utilizan normalmente para personalizar la sintaxis de un lenguaje, extenderlo añadiendo nuevas primitivas o integrar un lenguaje de programación específico de dominio (DSL) dentro de un lenguaje de propósito general.
Personalización de la sintaxis
Un buen ejemplo de personalización de la sintaxis es la existencia de dos sintaxis diferentes en el lenguaje de programación Objective Caml . [ 2 ] Los programas pueden escribirse indistintamente utilizando la "sintaxis normal" o la "sintaxis revisada", y pueden formatearse con cualquiera de las dos sintaxis según se requiera.
Del mismo modo, varios programas escritos en OCaml personalizan la sintaxis del lenguaje mediante la adición de nuevos operadores.
Ampliar un idioma
Los mejores ejemplos de extensión de lenguaje mediante macros se encuentran en la familia de lenguajes Lisp . Si bien estos lenguajes, en sí mismos, son núcleos funcionales simples con tipado dinámico, las distribuciones estándar de Scheme o Common Lisp permiten la programación imperativa u orientada a objetos, así como el tipado estático. Casi todas estas características se implementan mediante preprocesamiento sintáctico, aunque cabe destacar que la fase de "expansión de macros" de la compilación la gestiona el compilador en Lisp. Esto puede considerarse una forma de preprocesamiento, ya que tiene lugar antes que otras fases de la compilación.
Especializar un idioma
Una de las características inusuales de la familia de lenguajes Lisp es la posibilidad de usar macros para crear un DSL interno. Normalmente, en un proyecto grande basado en Lisp , un módulo puede estar escrito en varios de estos minilenguajes , uno de ellos utilizando un dialecto de Lisp basado en SQL , otro escrito en un dialecto especializado para interfaces gráficas de usuario o formato legible, etc. La biblioteca estándar de Common Lisp contiene un ejemplo de este nivel de abstracción sintáctica en forma de la macro LOOP, que implementa un minilenguaje similar a Algol para describir iteraciones complejas, al tiempo que permite el uso de operadores estándar de Lisp.
El preprocesador/lenguaje MetaOCaml ofrece características similares para DSL externos. Este preprocesador toma la descripción de la semántica de un lenguaje (es decir, un intérprete) y, mediante la combinación de la interpretación en tiempo de compilación y la generación de código, convierte esa definición en un compilador para el lenguaje de programación OCaml , y a partir de ese lenguaje, en código de bytes o en código nativo.
Preprocesador de propósito general
La mayoría de los preprocesadores están diseñados para una tarea específica de procesamiento de datos (por ejemplo, compilar el lenguaje C). Un preprocesador puede promocionarse como de propósito general , lo que significa que no está dirigido a un uso o lenguaje de programación específico, sino que está pensado para una amplia variedad de tareas de procesamiento de texto.
M4 es probablemente el ejemplo más conocido de un preprocesador de propósito general, aunque el preprocesador de C a veces se utiliza en funciones no específicas de C. Ejemplos:
- utilizando el preprocesador C para el preprocesamiento de JavaScript . [ 3 ] [ 4 ]
- utilizando el preprocesador C para el procesamiento del árbol de dispositivos dentro del kernel de Linux . [ 5 ]
- utilizando M4 (ver ejemplo en el artículo) o el preprocesador C [ 6 ] como motor de plantillas , para la generación de HTML .
- imake , una interfaz make que utiliza el preprocesador C, escrita para el sistema X Window pero ahora obsoleta en favor de automake .
- grompp , un preprocesador para archivos de entrada de simulación para GROMACS (un código rápido, gratuito y de código abierto para algunos problemas de química computacional ) que llama al preprocesador C del sistema (u otro preprocesador según lo determine el archivo de entrada de simulación) para analizar la topología, utilizando principalmente los mecanismos #define y #include para determinar la topología efectiva en tiempo de ejecución de grompp.
Véase también
- Directiva (programación) : construcción del lenguaje que especifica cómo un compilador debe procesar su entrada.
- Metaprogramación : paradigma de programación
- Macros : regla para sustituir una entrada determinada por una salida determinada.
- Compilador de código fuente , también conocido como transpilador : traductor de código fuente informático.
- Sass (lenguaje de hojas de estilo) – Lenguaje de hojas de estilo Páginas que muestran descripciones breves de destinos de redirección
- Stylus (lenguaje de hojas de estilo) – Lenguaje de preprocesamiento de hojas de estilo Páginas que muestran descripciones breves de destinos de redirección
- Less (lenguaje de hojas de estilo) – Lenguaje de hojas de estilo dinámico Páginas que muestran descripciones breves de destinos de redirección
- Fragmento (programación) : pequeña cantidad de código fuente utilizada para la productividad.
- Motor de plantillas : software que utiliza plantillas para producir documentos.
- El preprocesador de C : procesador de texto utilizado con C, C++ y otras herramientas de programación.
- El preprocesador-formatty-printer de OCaml : sistema de software de programación
- El preprocesador PL/I
- El preprocesador de rastreo de software de Windows
- Procesador de macros de propósito general : procesador de macros que no está vinculado a un lenguaje o programa informático en particular.
Referencias
- ↑ "¿Qué es un precompilador?" . IBM .
- ↑ La sintaxis revisada del sitio web del lenguaje Caml
- ↑ Muestra cómo usar el preprocesador C en archivos JavaScript. "JavaScript no es de nivel industrial" por T. Snyder .
- ↑ "¿El preprocesador de C en Javascript?" . espresso-mode .
- ↑ "Kernel/Git/Stable/Linux.git - Árbol estable del kernel de Linux" .
- ↑ Muestra cómo usar un preprocesador de C como motor de plantillas . "Uso de un preprocesador de C como herramienta de creación de HTML" por J. Korpela , 2000.
Enlaces externos
- Diseño de DSL en Lisp
- Programación desde cero
- El preprocesador genérico
- Gema, el procesador de macros de propósito general
- El preprocesador de archivos de texto, script y configuración PIKT piktc
- pyexpander, un procesador de macros de propósito general basado en Python.
- minimac, un procesador de macros minimalista
- Preprocesador de comentarios de Java
- Implementación del lenguaje de programación