Preprocesador

Un preprocesador  es un programa de computadora que toma datos de entrada y salida destinados a la entrada de otro programa (como un compilador ). Se dice que la salida del preprocesador está en una forma preprocesada adecuada para ser procesada por programas posteriores (compilador). El resultado y el tipo de procesamiento dependen del tipo de preprocesador; por ejemplo, algunos preprocesadores solo pueden realizar una sustitución de texto simple, otros tienen capacidades comparables a los lenguajes de programación. El uso más común de un preprocesador es procesar el código fuente antes de pasarlo al siguiente paso de compilación. Lenguajes de programación C / C++y el sistema de diseño de computadora TeX utilizan preprocesadores que amplían enormemente sus capacidades.

En algunos lenguajes de programación, los pasos de compilación y traducción se denominan "preprocesamiento".

Preprocesadores léxicos

Los preprocesadores léxicos se denominan preprocesadores de bajo nivel porque solo requieren análisis léxico , es decir, solo procesan el texto fuente antes del análisis , simplemente reemplazando lexemas y caracteres especiales con secuencias de caracteres dadas, de acuerdo con las reglas establecidas por los usuarios. Por lo general, realizan sustitución de macros , inserciones de texto de otros archivos y compilación condicional o vinculación de archivos.

Preprocesamiento en C/C++

El preprocesador léxico más utilizado es el preprocesador del lenguaje C utilizado en los lenguajes de programación C y su descendiente, C++ . El preprocesador elimina los comentarios del código , transforma el código de acuerdo con las macros y ejecuta otras directivas que comienzan con el carácter "#" (como #include, #define, varias directivas como #pragma).

Lenguaje de programación PHP

PHP se usa más comúnmente en el procesamiento de páginas web . El texto de la página se lee y se muestra sin cambios. La única excepción es la presencia de instrucciones PHP en el cuerpo de la página, delimitadas <?phpal principio y ?>al final.

Un ejemplo del texto de una página que contiene la hora actual:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> < html > < encabezado > < título > Actual hora </ título > </ cabeza > < cuerpo > < h1 > Hora actual </ h1 > <?php print strftime('La hora actual es %H horas, %M minutos %S segundos');  ?> </ cuerpo > </ html >

El preprocesador de PHP reemplazará la línea resaltada con:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> < html > < encabezado > < título > Actual hora </ título > </ cabeza > < cuerpo > < h1 > Hora actual </ h1 > ahora son 10 horas 15 minutos 20 segundos </ cuerpo > </ html >

Otros preprocesadores léxicos

Otros preprocesadores léxicos admiten el lenguaje universal m4 , comúnmente utilizado en sistemas de compilación multiplataforma como autoconf , y GEMA  , un motor de macros de código abierto basado en plantillas de contexto .

Preprocesadores de sintaxis

Los preprocesadores de sintaxis se introdujeron por primera vez en la familia de lenguajes Lisp . Su función era procesar árboles de sintaxis de acuerdo con un conjunto de reglas definidas por el usuario. Para algunos lenguajes de programación, las reglas se escribieron en el mismo lenguaje que el propio programa (simetría de compilación). Lisp y OCaml son ejemplos . Algunos lenguajes utilizan un lenguaje completamente independiente para describir las transformaciones, como el preprocesador XSLT para XML o su equivalente con tipos estáticos CDuce .

Los preprocesadores de sintaxis se usan comúnmente para refinar la sintaxis de un lenguaje, ampliar un lenguaje agregando nuevas primitivas o incorporar un lenguaje de programación específico de dominio en un lenguaje anfitrión.

Modificaciones de sintaxis

Un buen ejemplo de modificación de sintaxis es la existencia de dos sintaxis diferentes [1] en el lenguaje de programación Objective Caml . Los programas se pueden escribir usando sintaxis regular o sintaxis fija , la elección depende de la preferencia del programador.

De manera similar, un conjunto de programas escritos en OCaml tiene la capacidad de personalizar la sintaxis del lenguaje agregando nuevos operadores.

Extensión de idioma

Un excelente ejemplo de la extensión de un lenguaje con macros es su uso en la familia de lenguajes de programación Lisp . Si bien estos lenguajes en sí mismos tienen núcleos simples enfocados en tipos dinámicos, el esquema de suministros estándar, los imperativos de Common Lisp , la programación orientada a objetos se enfocan en tipos estáticos. Casi todas estas características están implementadas por preprocesadores sintácticos, aunque esto lleva la impronta del paso de compilación de "macroexpansión" controlado por el compilador Lisp. Esto aún puede considerarse una forma de preprocesamiento, ya que sucede antes del resto de los pasos de compilación.

Del mismo modo, se pueden agregar expresiones regulares con seguridad de tipos o generación de código a la sintaxis y la semántica de OCaml mediante macros, como microprocesos (también conocidos como corrutinas o fibras ), mónadas o procesamiento XML transparente.

Lenguaje especializado

Una de las características inusuales de la familia de lenguajes Lisp es la capacidad de usar macros para crear un lenguaje de programación específico de dominio incrustado . Por lo general, en una gran cantidad de proyectos escritos en Lisp, un módulo puede estar escrito en muchos de estos minilenguajes, es decir, uno puede usar el dialecto SQL de Lisp, y otro puede estar escrito en un GUI o en un dialecto orientado a la impresora, y así sucesivamente. La biblioteca estándar de Common Lisp contiene un ejemplo de tal nivel de abstracción sintáctica en la forma de la macro LOOP, que implementa minilenguajes como Algol para describir iteraciones complejas mientras conserva la capacidad de usar operadores Lisp estándar.

El preprocesador/lenguaje MetaOCaml proporciona capacidades similares a un lenguaje de programación específico de dominio externo . Este preprocesador, al recibir una descripción de la semántica del lenguaje (la llamada "interpretación") y combinar la interpretación durante la compilación y la generación de código, pasa esta definición al compilador del lenguaje OCaml , que, en base a este lenguaje, crea bytecode o código natural.

Macroprocesador de propósito general

Los preprocesadores, que realizan solo una de las etapas de traducción, se enfocan en la tarea de procesamiento de datos fragmentarios (por ejemplo, compilar el lenguaje C ). Programas similares, entonces llamados macroprocesadores , también pueden estar destinados a propósitos generales, es decir, no están destinados a implementar un uso o lenguaje de programación específico, sino que están diseñados para utilizar una amplia gama de tareas de procesamiento de datos.

El macroprocesador m4 es probablemente el ejemplo más conocido de un macroprocesador de propósito general.

Ejemplos

  • Uso del preprocesador C para preprocesar código JavaScript [2] .
  • Usando M4 (ver ejemplo en el artículo) o el preprocesador C como motor de plantillas para la generación de HTML . [3]
  • imake (de la interfaz make ) usa el preprocesador C. Usado en el proyecto X Window System antes de cambiar a automake .
  • grompp es un procesador de macros para archivos modelo del proyecto GROMACS (Software libre de código abierto para química computacional ). De forma predeterminada, utiliza el preprocesador C, pero se puede especificar cualquier otro preprocesador en el archivo del modelo. Se utiliza para validar el marcado. Utiliza directivas #definey #include.

Datos interesantes

  • El nombre del preprocesador PHP ampliamente utilizado es un acrónimo recursivo : PHP es " p hp: preprocesador de hipertexto " .

Véase también

Notas

  1. La sintaxis revisada . Consultado el 13 de julio de 2008. Archivado desde el original el 24 de septiembre de 2015.
  2. T.Snyder. JavaScript no tiene fuerza industrial . Archivado el 16 de enero de 2008 en Wayback Machine . Cómo usar el preprocesador C para código JavaScript.
  3. J. Korpela. Uso de un preprocesador C como herramienta de creación de HTML Archivado el 8 de diciembre de 2015 en Wayback Machine 2000.

Enlaces