m4 es un macroprocesador de propósito general incluido en la mayoría de los sistemas operativos similares a Unix y es un componente del estándar POSIX .
Paradigma | macro |
---|---|
Diseñada por | Brian Kernighan y Dennis Ritchie |
Apareció por primera vez | 1977 |
Implementaciones importantes | |
GNU m4 |
El lenguaje fue diseñado por Brian Kernighan y Dennis Ritchie para las versiones originales de UNIX . Es una extensión de un macroprocesador anterior, m3 , escrito por Ritchie para una minicomputadora AP-3 desconocida. [1]
El preprocesador de macros funciona como una herramienta de sustitución de texto. Se emplea para reutilizar plantillas de texto, generalmente en aplicaciones de programación de computadoras , pero también en aplicaciones de edición y procesamiento de texto. La mayoría de los usuarios requieren m4 como una dependencia de GNU autoconf .
Historia
Los procesadores de macros se hicieron populares cuando los programadores usaban comúnmente el lenguaje ensamblador . En aquellos primeros días de la programación, los programadores notaron que muchos de sus programas consistían en texto repetido e inventaron medios simples para reutilizar este texto. Los programadores pronto descubrieron las ventajas no solo de reutilizar bloques completos de texto, sino también de sustituir diferentes valores por parámetros similares. Esto definió el rango de uso de los macroprocesadores.
En la década de 1960, uno de los primeros macroprocesadores de uso general, M 6 , estaba en uso en AT&T Bell Laboratories , que fue desarrollado por Douglas McIlroy , Robert Morris y Andrew Hall. [2]
Kernighan y Ritchie desarrollaron m4 en 1977, basándose en las ideas de Christopher Strachey . Las características distintivas de este estilo de preprocesamiento de macros incluyen:
- sintaxis de forma libre (no basada en líneas como un preprocesador de macro típico diseñado para el procesamiento de lenguaje ensamblador)
- el alto grado de re-expansión (los argumentos de una macro se expanden dos veces: una durante el escaneo y una vez en el momento de la interpretación)
La implementación de Rational Fortran utilizó m4 como su motor macro desde el principio; y la mayoría de las variantes de Unix lo incluyen.
A partir de 2021[actualizar]muchas aplicaciones continúan usando m4 como parte de la configuración automática del Proyecto GNU . También aparece en el proceso de configuración de sendmail (un agente de transferencia de correo muy extendido ) y para generar huellas en el conjunto de herramientas de gEDA. La Política de referencia de SELinux se basa en gran medida en el macroprocesador m4.
m4 tiene muchos usos en la generación de código , pero (como con cualquier procesador de macros) los problemas pueden ser difíciles de depurar. [3]
Características
m4 ofrece estas facilidades:
- una sintaxis de forma libre , en lugar de una sintaxis basada en líneas
- un alto grado de expansión macro (los argumentos se expanden durante el escaneo y nuevamente durante la interpretación)
- reemplazo de texto
- sustitución de parámetros
- inclusión de archivos
- manipulación de cuerdas
- evaluación condicional
- expresiones aritméticas
- interfaz del sistema
- diagnóstico del programador
- independiente del lenguaje de programación
- independiente del lenguaje humano
- proporciona capacidades de lenguaje de programación
A diferencia de la mayoría de los procesadores de macros anteriores, m4 no se dirige a ningún ordenador o lenguaje humano en particular; históricamente, sin embargo, su desarrollo se originó por apoyar el dialecto Ratfor de Fortran . A diferencia de otros procesadores de macros, m4 es Turing completo y también es un lenguaje de programación práctico.
Los identificadores sin comillas que coinciden con macros definidas se reemplazan con sus definiciones. Colocar identificadores entre comillas suprime la expansión hasta posiblemente más tarde, como cuando una cadena entre comillas se expande como parte del reemplazo de macros. A diferencia de la mayoría de los lenguajes, las cadenas en m4 se citan utilizando la comilla invertida (`) como delimitador inicial y el apóstrofo (') como delimitador final. Los delimitadores de inicio y finalización separados permiten el uso del anidamiento arbitrario de comillas en cadenas, lo que permite un grado preciso de control de cómo y cuándo tiene lugar la expansión macro en diferentes partes de una cadena.
Ejemplo
El siguiente fragmento da un ejemplo simple que podría formar parte de una biblioteca para generar código HTML . Define una macro comentada para numerar secciones automáticamente:
desviar (-1)m4 tiene varias colas de salida que se pueden manipular con elmacro de "desvío". Las colas válidas van de 0 a 10, inclusive, conla cola predeterminada es 0. Como extensión, GNU m4 admite másdesvíos, limitados solo por el tamaño del tipo de número entero.Llamar a la macro 'desviar' con una cola no válida hace que el texto seadescartado hasta otra llamada. Tenga en cuenta que incluso mientras sedescartados, las comillas alrededor de `desviar 'y otras macros son necesarias paraprevenir la expansión.# Las macros no se expanden dentro de los comentarios, lo que significa que las palabras clave como# ya que el desvío y otros elementos integrados pueden utilizarse sin consecuencias.# Macro de utilidad HTML:define ('H2_COUNT', 0)# La macro H2_COUNT se redefine cada vez que se usa la macro H2:definir ('H2',`define (` H2_COUNT ', incr (H2_COUNT)) < h2 > H2_COUNT. $ 1 h2 > ')desviar (1) dnldnldnl La macro dnl hace que m4 descarte el resto de la línea, por lo tantodnl para evitar que aparezcan líneas en blanco no deseadas en la salida.dnlH2 (primera sección)H2 (segunda sección)H2 (Conclusión)dnldesviar (0) dnldnl< HTML >undivert (1) dnl Se está enviando una de las colas a la salida.HTML >
Procesar este código con m4 genera el siguiente texto:
< HTML > < h2 > 1. Primera sección h2 > < h2 > 2. Segunda sección h2 > < h2 > 3. Conclusión h2 > HTML >
Implementaciones
FreeBSD , NetBSD y OpenBSD proporcionan implementaciones independientes del lenguaje m4. Además, las herramientas de desarrollo de proyectos Heirloom incluyen una versión gratuita del lenguaje m4, derivado de OpenSolaris .
M4 se ha incluido en el sistema operativo Inferno . Esta implementación está más estrechamente relacionada con el m4 original desarrollado por Kernighan y Ritchie en la Versión 7 Unix que sus parientes más sofisticados en UNIX System V y POSIX . [4]
GNU m4 es una implementación de m4 para el proyecto GNU . [5] [6] Está diseñado para evitar muchos tipos de límites arbitrarios que se encuentran en las implementaciones tradicionales de m4, como longitudes máximas de línea, tamaño máximo de una macro y número de macros. Eliminar esos límites arbitrarios es uno de los objetivos declarados del Proyecto GNU. [7]
El paquete GNU Autoconf hace un uso extensivo de las características de GNU m4.
GNU m4 es actualmente mantenido por Gary V. Vaughan y Eric Blake. [5] Publicado bajo los términos de la Licencia Pública General GNU, GNU m4 es software libre .
Ver también
- Preprocesador C
- Macro (informática)
- Fabricar
- Procesador de plantillas
- Sistema de plantillas web
Referencias
- ^ Brian W. Kernighan y Dennis M. Ritchie. El macroprocesador m4. Informe técnico, Bell Laboratories, Murray Hill, Nueva Jersey, EE. UU., 1977. pdf
- ^ Cole, AJ (1981). Procesadores de macros (segunda edición revisada). Archivo CUP. pag. 254.
- ^ Kenneth J. Turner. Explotación del lenguaje de macros m4. Informe técnico CSM-126, Departamento de Ciencias de la Computación y Matemáticas, Universidad de Stirling, Escocia, septiembre de 1994. pdf
- ^ - Manual de comandos generales de Inferno
- ^ a b Sitio web de GNU m4 "GNU M4" , consultado el 25 de enero de 2020.
- ^ Manual de GNU m4, en línea y para descargar en HTML, PDF y otros formatos. "GNU M4 - GNU macro processor" , consultado el 25 de enero de 2020.
- ^ "Estándares de codificación GNU: escribir programas robustos" . cita: "Evite límites arbitrarios en la longitud o el número de cualquier estructura de datos".
enlaces externos
- Sitio web de GNU m4
- Manual de GNU m4
- tutorial m4
- Magia macro: m4, parte uno y parte dos