# 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.
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

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 M$^6$ usado en Bell Labs y desarrollado por Douglas McIlroy, Robert Morris y Andrew Hall.
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.

## Características

* 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

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:
El procesamiento de ese código genera el sgte. texto:

## Implementaciones

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. 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.