m4 (lenguaje de programación)


m4 es un procesador de macros de propósito general incorporado en sistemas operativos de 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 llamado m3, escrito por Ritchie para una minicomputadora AP-3 desconocida.[1]

El pre-procesador de macros actúa como una herramienta de sustitución de texto y se utiliza para reutilizar plantillas de texto tanto en lenguajes de programación como en aplicaciones de edición y procesamiento de texto. La mayoría de los usuarios requieren m4 como dependencia de GNU autoconf.

Historia

[editar]

Los procesadores de macros se hicieron populares cuando los programadores usaban lenguaje ensamblador con frecuencia. En esos primeros días de la programación, los programadores notaron que mucho de sus programas consistían en texto repetido y tomaron medidas simples para la reutilización del texto. Pronto descubrieron las ventajas de no solo reutilizar bloques enteros de textos sino también la de sustituir diferentes valores por parámetros similares. Esto definió el amplio rango de uso de los procesadores de macro.

En 1960, uno de los primeros procesadores de macros de propósito general era M6 usado en Bell Labs y desarrollado por Douglas McIlroy, Robert Morris y Andrew Hall.[2]

Kernighan y Ritchie desarrollaron m4 en 1977, basados en las ideas de Christopher Strachey. Las características distinguidas de este estilo de preprocesamiento de macros incluye:

  • Sintaxis libre de formas (no basados en líneas como los típicos procesadores de macros diseñados para procesamiento de lenguaje ensamblador)
  • Alto grado de re-expansión (los argumentos de una macro se expanden dos veces: una vez durante el escaneado y otra vez en tiempo de interpretación).

La implementación de Ratfor usó m4 como motor de macros desde el principio.

Ya en el 2020, muchas aplicaciones continúan usando m4 como parte del proyecto GNU autoconf. También aparece en el proceso de configuración de sendmail (un servidor de correo ampliamente usado) y para generar planos con la suite de herramientas gEDA. La Política de Referencias de SELinux depende en gran medida de m4.

m4 tiene muchos usos en la generación de código pero (como pasa con cualquier procesador de macros) los problemas pueden ser difíciles de debuggear.[3]

Características

[editar]
  • m4 ofrece:
  • Sintaxis libre de formas, más que sintaxis basada en líneas.
  • Alto nivel de expansión de macros (los argumentos se expanden durante el escaneo y durante la interpretación).
  • Reemplazo de texto
  • Sustitución de parámetros
  • Inclusión de archivos
  • Manipulación de strings
  • Evaluación de condiciones
  • Expresiones aritméticas
  • Interfaz con el sistema
  • Diagnósticos para el programador
  • Programación independiente del lenguaje

A diferencia de los primeros procesadores de macros, m4 no apunta a ningún lenguaje humano o computadora en particular. A diferencia de algunos otros procesadores de macros, m4 es Turing completo y un lenguaje de progamación práctico.

Los identificadores sin comillas que coinciden con macros definidas son reemplazados por sus definiciones. Colocar identificadores en comillas posterga la expansión hasta, posiblemente, más tarde. Como cuando un string entre comillas se expanda como parte del reemplazo de macros.

A diferencia de la mayoría de los lenguajes, los strings en m4 son "citados" usando acentos graves (`) como delimitador de inicio y apóstrofres (') como delimitador de fin. Los delimitadores de inicio y fin distintos permiten el anidamiento arbitrario de comillas en los strings a ser usados, permitiendo un control más fino sobre como y cuándo tendrá lugar la expansión de macros en las diferentes partes del string.

Ejemplo

[editar]

El siguiente fragmento da un ejemplo simple que podría formar parte de una librería para generar código HTML. Define una macro comentada para numerar secciones automáticamente:

divert(-1)  m4 tiene múltiples colas de salida que pueden ser manipuladas con la macro `divert'. El rango de colas válidas va de 0 a 10, inclusive. Siendo la cola 0 la predeterminada. Como extensión, GNU m4 soporta más desviaciones, limitado solo por el tamaño del tipo entero.  Llamar a la macro `divert' con una cola inválida causa que el texto se descarte hasta la próxima llamada. Note que aún cuando la salida se descarta, son necesarias las comillas alrededor de `divert' y otras macros para prevenir la expansion  # Las macros no son expandidas junto a los comentarios, lo que significa que  # palabras clave como divert y otros built-ins pueden ser usados 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>')  divert(1)dnl dnl dnl La macro dnl causa que m4 descarte el resto de la linea dnl impidiendo que aparezcan lineas en blanco no queridas en la salida dnl H2(Primera Sección) H2(Segunda Sección) H2(Conclusión) dnl divert(0)dnl dnl <HTML> undivert(1)dnl Una de las colas se pone en la salida </HTML> 

El procesamiento de ese código genera el sgte. texto:

<HTML> <h2>1. Primera Sección</h2> <h2>2. Segunda Sección/h2> <h2>3. Conclusión</h2> </HTML> 

Implementaciones

[editar]

FreeBSD, NetBSD y OpenBSD proveen implementaciones independientes del lenguaje m4. El proyecto Heirloom Development Tools incluye una versión libre del lenguaje m4, derivada de OpenSolaris.

GNU m4 es una implementación de m4 del proyecto GNU.[4][5]​ Está diseñada para evitar muchos tipos de límites arbitrarios encontrados en implementaciones tradicionales de m4, tales como longitud máxima de una lína, tamaño máximo de una macro o de número de macros. La eliminación de estos límites arbitrarios es uno de los objetivos declarados del proyecto GNU.[6]

Referencias

[editar]
  1. Brian W. Kernighan and Dennis M. Ritchie. The m4 macro processor. Technical report, Bell Laboratories, Murray Hill, New Jersey, USA, 1977. PDF: https://wolfram.schneider.org/bsd/7thEdManVol2/m4/m4.pdf
  2. Cole, A. J. (1981) Macro Processors (2nd, revised ed.). CUP Archive. p. 254
  3. Kenneth J. Turner. Exploiting the m4 macro language. Technical Report CSM-126, Department of Computing Science and Mathematics, University of Stirling, Scotland, September 1994. PDF: http://www.cs.stir.ac.uk/~kjt/research/pdf/expl-m4.pdf
  4. «gnu.org». www.gnu.org (en inglés). Consultado el 23 de junio de 2020. 
  5. «gnu.org». www.gnu.org (en inglés). Archivado desde el original el 25 de octubre de 2020. Consultado el 23 de junio de 2020. 
  6. «Semantics (GNU Coding Standards)». www.gnu.org. Consultado el 23 de junio de 2020.