m4 es un procesador de macros de propósito general incluido en la mayoría de los sistemas operativos tipo Unix , y es un componente del estándar POSIX .
El lenguaje fue diseñado por Brian Kernighan y Dennis Ritchie para las versiones originales de UNIX . Es una extensión de un procesador de macros anterior, m3, escrito por Ritchie para una minicomputadora AP-3 desconocida. [ 1 ]
El preprocesador de macros funciona como una herramienta de reemplazo de texto. Se utiliza para reutilizar plantillas de texto, generalmente en aplicaciones de programación , pero también en aplicaciones de edición y procesamiento de texto. La mayoría de los usuarios requieren m4 como dependencia de GNU autoconf y GNU Bison .
Historia
Los macroprocesadores se popularizaron cuando los programadores utilizaban habitualmente el lenguaje ensamblador . En aquellos primeros tiempos de la programación, los programadores observaron que gran parte de sus programas consistían en texto repetido e inventaron métodos sencillos para reutilizarlo. Pronto descubrieron las ventajas no solo de reutilizar bloques completos de texto, sino también de sustituir valores diferentes por parámetros similares. Esto definió el ámbito de uso de los macroprocesadores en aquel entonces. [ 2 ]
En la década de 1960, un procesador macro de propósito general temprano, el M6, se utilizaba en los Laboratorios Bell de AT&T , que fue desarrollado por Douglas McIlroy , Robert Morris y Andrew Hall. [ 3 ]
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 incluían:
- Sintaxis de formato libre (no basada en líneas como un preprocesador de macros típico diseñado para el procesamiento de lenguaje ensamblador).
- el alto grado de reexpansión (los argumentos de una macro se expanden dos veces: una vez durante el escaneo y otra en el momento de la interpretación)
La implementación de Rational Fortran utilizó m4 como su motor de macros desde el principio, y la mayoría de las variantes de Unix lo incluyen.
A partir de 2024Muchas aplicaciones siguen utilizando m4 como parte del sistema de 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 digitales en el conjunto de herramientas gEDA . La política de referencia de SELinux depende en gran medida del procesador de macros 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. [ 4 ]
Características
m4 ofrece las siguientes instalaciones:
- una sintaxis de formato 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 cadenas
- evaluación condicional
- expresiones aritméticas
- interfaz del sistema
- diagnóstico del programador
- independiente del lenguaje de programación
- lenguaje humano independiente
- proporciona capacidades de lenguaje de programación
A diferencia de la mayoría de los procesadores de macros anteriores, m4 no está dirigido a ningún lenguaje informático o humano en particular; históricamente, sin embargo, su desarrollo se originó para dar soporte al dialecto Ratfor de Fortran . A diferencia de otros procesadores de macros, m4 es Turing-completo y, además, un lenguaje de programación práctico.
Los identificadores sin comillas que coinciden con las macros definidas se reemplazan con sus definiciones. Colocar los 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 una macro. A diferencia de la mayoría de los lenguajes, las cadenas en m4 se entrecomillan usando la comilla invertida (`) como delimitador inicial y el apóstrofo (') como delimitador final. Los delimitadores inicial y final separados permiten el anidamiento arbitrario de comillas en las cadenas, lo que permite un control preciso de cómo y cuándo se produce la expansión de macros en diferentes partes de una cadena.
Ejemplo
El siguiente fragmento ofrece un ejemplo sencillo 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 múltiples colas de salida que se pueden manipular con el macro `divert`. Las colas válidas van de 0 a 10, ambos inclusive, con la cola predeterminada es 0. Como extensión, GNU m4 admite más desvíos, limitados únicamente por el tamaño del tipo entero. Llamar a la macro `divert` con una cola no válida provoca que el texto sea descartado hasta otra llamada. Tenga en cuenta que incluso mientras se está produciendo la salida descartadas, se necesitan comillas alrededor de `divert` y otras macros para prevenir la expansión. # Las macros no se expanden dentro de los comentarios, lo que significa que las palabras clave como # Como divert y otras funciones integradas, se pueden usar sin consecuencias. # Macro de utilidad HTML: define(`H2_COUNT', 0) # La macro H2_COUNT se redefine cada vez que se utiliza la macro H2: define(`H2', `define(`H2_COUNT', incr(H2_COUNT)) < h2 > H2_COUNT. $1 </ h2 > ') desviar(1)dnl dnl La macro dnl hace que m4 descarte el resto de la línea, por lo tanto dnl evita que aparezcan líneas en blanco no deseadas en la salida. dnl H2 (Primera Sección) H2 (Segunda Sección) H2(Conclusión) dnl desviar(0)dnl dnl < HTML > undivert(1)dnl Una de las colas se está enviando a la salida. </ HTML >Al procesar este código con m4 se 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 ofrecen implementaciones independientes del lenguaje m4. Además, las herramientas de desarrollo del proyecto Heirloom incluyen una versión gratuita del lenguaje m4, derivada de OpenSolaris .
M4 se ha incluido en el sistema operativo Inferno . Esta implementación está más relacionada con el m4 original desarrollado por Kernighan y Ritchie en la versión 7 de Unix que con sus parientes más sofisticados en UNIX System V y POSIX . [ 5 ]
GNU m4 es una implementación de m4 para el Proyecto GNU . [ 6 ] [ 7 ] Está diseñada para evitar muchos tipos de limitaciones arbitrarias 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 dichas limitaciones arbitrarias es uno de los objetivos declarados del Proyecto GNU. [ 8 ]
El paquete GNU Autoconf hace un uso extensivo de las características de GNU m4.
GNU m4 es mantenido actualmente por Gary V. Vaughan y Eric Blake. [ 6 ] GNU m4 es software libre , publicado bajo los términos de la Licencia Pública General de GNU .
Véase también
- AWK – lenguaje de programación para el procesamiento de texto
- Preprocesador de C
- Macro (informática)
- Hacer
- 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 Archivado el 5 de agosto de 2004 en Wayback Machine .
- ↑ Historia de GNU m4
- ↑ Hall, Andrew D. (1972). El procesador macro M6. Informe técnico de ciencias de la computación n.° 2 (PDF) (Informe). Bell Labs.
- ↑ Kenneth J. Turner. Aprovechamiento del lenguaje de macros m4. Informe técnico CSM-126, Departamento de Informática y Matemáticas, Universidad de Stirling, Escocia, septiembre de 1994. pdf
- ↑ – Manual de comandos generales de Inferno
- 1 2 Sitio web de GNU m4 "GNU M4" Archivado el 25 de julio de 2016 en Wayback Machine , consultado el 25 de enero de 2020.
- ↑ Manual de GNU m4, disponible en línea y para descargar en HTML, PDF y otros formatos. "GNU M4 — Procesador de macros GNU". Archivado el 17 de agosto de 2023 en Wayback Machine , consultado el 25 de enero de 2020.
- ↑ "Estándares de codificación GNU: Escritura de programas robustos" Archivado el 16 de abril de 2016 en Wayback Machine . 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 de m4
- Magia macro: m4, primera y segunda parte
- Lenguajes de programación de macros
- Herramientas de programación Unix
- Utilidades Unix SUS2008
- Comandos de Inferno (sistema operativo)