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 relativamente simples y expansiones de macros , mientras que otros tienen el poder de los lenguajes de programación completos .

Un ejemplo común en la programación informática es el procesamiento que se realiza sobre el código fuente antes del siguiente paso de compilación. En algunos lenguajes informáticos (por ejemplo, C y PL/I ) hay una fase de traducción conocida como preprocesamiento . También puede incluir el procesamiento de macros, la inclusión de archivos y las extensiones del lenguaje.

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 sobre 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 reglas definidas por el usuario. 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 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 funciones integradas del lenguaje 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 usado en sistemas de compilación multiplataforma como autoconf , y GEMA , un procesador de macros de código abierto que opera sobre 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 homólogo de tipado estático CDuce.

Los preprocesadores sintácticos se utilizan normalmente para personalizar la sintaxis de un lenguaje, ampliar un lenguaje añadiendo nuevos primitivos 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 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 sintaxis a pedido.

De manera similar, varios programas escritos en OCaml personalizan la sintaxis del lenguaje mediante la adición de nuevos operadores.

Extender un lenguaje

Los mejores ejemplos de extensión de lenguajes mediante macros se encuentran en la familia de lenguajes Lisp . Si bien los lenguajes, por 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 señalar que la fase de "expansión de macros" de la compilación la gestiona el compilador en Lisp. Esto todavía puede considerarse una forma de preprocesamiento, ya que tiene lugar antes de 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 gran proyecto basado en Lisp , un módulo puede estar escrito en una variedad de estos minilenguajes , uno quizás 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 Common Lisp contiene un ejemplo de este nivel de abstracción sintáctica en la forma de la macro LOOP, que implementa un minilenguaje similar a Algol para describir iteraciones complejas, al mismo tiempo que permite el uso de operadores estándar de Lisp.

El preprocesador/lenguaje MetaOCaml ofrece funciones 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, en código de bytes o en código nativo.

Preprocesador de propósito general

La mayoría de los preprocesadores son específicos para una tarea de procesamiento de datos en particular (por ejemplo, compilar el lenguaje C). Un preprocesador puede promocionarse como de propósito general , lo que significa que no está destinado a un uso o lenguaje de programación específico, y 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 C a veces se utiliza en una función no específica de C. Ejemplos:

Véase también

Referencias

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

Enlaces externos