stringtranslate.com

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 en otro programa. Se dice que la salida es una forma preprocesada de los datos de entrada, que a menudo utilizan algunos 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 textuales y expansiones de macros relativamente simples, mientras que otros tienen el poder de lenguajes de programación completos .

Un ejemplo común de programación informática es el procesamiento realizado en el código fuente antes del siguiente paso de compilación. En algunos lenguajes informáticos (por ejemplo, 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.

Preprocesadores léxicos

Los preprocesadores léxicos son el nivel más bajo de preprocesadores, ya que solo requieren análisis léxico , es decir, operan en el texto fuente, antes de cualquier análisis , realizando una simple sustitución de secuencias de caracteres tokenizados por otras secuencias de caracteres tokenizados, de acuerdo con las definiciones definidas por el usuario. normas. Por lo general, realizan sustitución de macros , inclusión textual de otros archivos y compilación o inclusión condicional.

preprocesador C

El ejemplo más común de esto es el preprocesador de C , que toma 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 funciones de lenguaje integradas para lograr cosas similares. Por ejemplo:

Otros preprocesadores léxicos

Otros preprocesadores léxicos incluyen el m4 de propósito 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.

Preprocesadores sintácticos

Los preprocesadores sintácticos se introdujeron con la familia de lenguajes Lisp . Su función es transformar árboles de sintaxis según 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 dependen de un lenguaje completamente externo para definir las transformaciones, como el preprocesador XSLT para XML o su contraparte de tipo estático CDuce .

Los preprocesadores sintácticos se utilizan normalmente para personalizar la sintaxis de un lenguaje, ampliar un lenguaje agregando nuevas primitivas o incorporar un lenguaje de programación de dominio específico (DSL) dentro de un lenguaje de propósito general.

Personalización de la sintaxis

Un buen ejemplo de personalización de 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 imprimirse con cualquiera de las dos sintaxis a pedido.

De manera similar, varios programas escritos en OCaml personalizan la sintaxis del lenguaje agregando nuevos operadores.

Extendiendo un idioma

Los mejores ejemplos de extensión de lenguaje a través de macros se encuentran en la familia de lenguajes Lisp . Si bien los lenguajes, por sí mismos, son núcleos funcionales simples escritos dinámicamente, las distribuciones estándar de Scheme o Common Lisp permiten programación imperativa u orientada a objetos, así como escritura estática. Casi todas estas características se implementan mediante preprocesamiento sintáctico, aunque cabe señalar que la fase de "expansión macro" de la compilación la maneja el compilador en Lisp. Esto todavía puede considerarse una forma de preprocesamiento, ya que tiene lugar antes de otras fases de compilación.

Especializar un idioma

Una de las características inusuales de la familia de lenguajes Lisp es la posibilidad de utilizar macros para crear un DSL interno. Normalmente, en un gran proyecto basado en Lisp , un módulo puede escribirse en una variedad de minilenguajes , uno tal vez usando un dialecto de Lisp basado en SQL , otro escrito en un dialecto especializado para GUI o impresión bonita, etc. La biblioteca estándar de contiene un ejemplo de este nivel de abstracción sintáctica en forma de macro LOOP, que implementa un minilenguaje similar a Algol para describir iteraciones complejas, al tiempo que permite el uso de operadores Lisp estándar.

El preprocesador/lenguaje MetaOCaml proporciona 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, al combinar 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 desde ese lenguaje, ya sea a código de bytes o a código nativo.

Preprocesador de propósito general

La mayoría de los preprocesadores son específicos para una tarea de procesamiento de datos particular (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á destinado a usarse 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 una función no específica de C. Ejemplos:

Ver también

Referencias

  1. ^ "¿Qué es un precompilador?".
  2. ^ La sintaxis revisada del sitio web del lenguaje Caml.
  3. ^ Muestre cómo utilizar el preprocesador C en archivos JavaScript. "JavaScript no es potencia industrial" por T. Snyder .
  4. ^ "¿El preprocesador C en Javascript?". modo espresso .
  5. ^ "Kernel/Git/Stable/Linux.git: árbol estable del kernel de Linux".
  6. ^ Muestre cómo utilizar el preprocesador C como motor de plantillas . "Uso de un preprocesador C como herramienta de creación de HTML" por J. Korpela , 2000.

enlaces externos