stringtranslate.com

Macro (informática)

Editor de macros de jEdit

En programación de computadoras , una macro (abreviatura de " instrucción macro "; del griego μακρο -  'largo, grande' [1] ) es una regla o patrón que especifica cómo se debe asignar una determinada entrada a una salida de reemplazo. Aplicar una macro a una entrada se conoce como expansión de macro . La entrada y la salida pueden ser una secuencia de tokens o caracteres léxicos , o un árbol de sintaxis . Las macros de caracteres son compatibles con las aplicaciones de software para facilitar la invocación de secuencias de comandos comunes . Las macros de token y árbol son compatibles con algunos lenguajes de programación para permitir la reutilización del código o ampliar el lenguaje, a veces para lenguajes de dominios específicos .

Las macros se utilizan para poner a disposición del programador una secuencia de instrucciones informáticas como una única declaración de programa , lo que hace que la tarea de programación sea menos tediosa y menos propensa a errores. [2] [3] (Por lo tanto, se denominan "macros" porque un bloque "grande" de código se puede expandir a partir de una secuencia "pequeña" de caracteres). Las macros a menudo permiten parámetros posicionales o de palabras clave que dictan lo que el programa ensamblador condicional genera y se ha utilizado para crear programas completos o conjuntos de programas según variables como el sistema operativo , la plataforma u otros factores. El término deriva de "instrucción macro" y dichas expansiones se utilizaron originalmente para generar código en lenguaje ensamblador .

Macros de teclado y ratón

Las macros de teclado y de mouse permiten que secuencias cortas de pulsaciones de teclas y acciones del mouse se transformen en otras secuencias de pulsaciones de teclas y acciones del mouse, que generalmente consumen más tiempo. De esta manera se pueden automatizar secuencias de pulsaciones de teclas y movimientos del ratón de uso frecuente o repetitivos . Los programas separados para crear estas macros se denominan grabadores de macros .

Durante la década de 1980, los programas de macros (originalmente SmartKey , luego SuperKey, KeyWorks, Prokey) fueron muy populares, primero como medio para formatear automáticamente guiones y luego para una variedad de tareas de entrada del usuario. Estos programas se basaban en el modo de operación de terminar y permanecer residente y se aplicaban a todas las entradas del teclado, sin importar en qué contexto ocurrieran. Hasta cierto punto, han caído en obsolescencia tras la llegada de las interfaces de usuario controladas por mouse y la disponibilidad de macros de teclado y mouse en aplicaciones, como procesadores de texto y hojas de cálculo , lo que hace posible crear macros de teclado sensibles a las aplicaciones.

Las macros de teclado se pueden utilizar en juegos de rol multijugador masivo en línea (MMORPG) para realizar tareas repetitivas pero lucrativas, acumulando así recursos. Como esto se hace sin esfuerzo humano, puede sesgar la economía del juego. Por esta razón, el uso de macros es una violación de los TOS o EULA de la mayoría de los MMORPG, y sus administradores dedican un esfuerzo considerable a suprimirlas. [4]

Macros de aplicaciones y secuencias de comandos

Las macros de teclado y mouse que se crean utilizando las funciones de macro integradas de una aplicación a veces se denominan macros de aplicación . Se crean realizando la secuencia una vez y dejando que la aplicación registre las acciones. También puede existir un lenguaje de programación de macros subyacente, más comúnmente un lenguaje de secuencias de comandos , con acceso directo a las funciones de la aplicación.

El editor de texto de los programadores, Emacs (abreviatura de "edición de macros") sigue esta idea hasta su conclusión. De hecho, la mayor parte del editor está compuesto de macros. Emacs fue ideado originalmente como un conjunto de macros en el lenguaje de edición TECO ; Posteriormente fue portado a dialectos de Lisp .

Otro editor de texto para programadores, Vim (un descendiente de vi ), también tiene una implementación de macros de teclado. Puede registrar en un registro (macro) lo que una persona escribe en el teclado y puede reproducirse o editarse como las macros VBA para Microsoft Office. Vim también tiene un lenguaje de programación llamado Vimscript [5] para crear macros.

Visual Basic para Aplicaciones (VBA) es un lenguaje de programación incluido en Microsoft Office desde Office 97 hasta Office 2019 (aunque estaba disponible en algunos componentes de Office antes de Office 97). Sin embargo, su función ha evolucionado y reemplazado a los lenguajes de macros que originalmente se incluían en algunas de estas aplicaciones.

XEDIT , que se ejecuta en el componente Conversational Monitor System (CMS) de VM , admite macros escritas en EXEC , EXEC2 y REXX , y algunos comandos CMS eran en realidad envoltorios de macros XEDIT. El Hessling Editor (THE), un clon parcial de XEDIT, admite macros Rexx usando Regina y Open Object REXX (oorexx). Muchas aplicaciones comunes, y algunas en PC, utilizan Rexx como lenguaje de programación.

macrovirus

VBA tiene acceso a la mayoría de las llamadas al sistema de Microsoft Windows y se ejecuta cuando se abren documentos. Esto hace que sea relativamente fácil escribir virus informáticos en VBA, comúnmente conocidos como virus de macro . A mediados y finales de la década de 1990, se convirtió en uno de los tipos más comunes de virus informático. Sin embargo, desde finales de la década de 1990 y hasta la fecha, Microsoft ha estado parcheando y actualizando sus programas. [ cita necesaria ] Además, los programas antivirus actuales contrarrestan inmediatamente tales ataques.

Macro parametrizada y sin parámetros

Una macro parametrizada es una macro que puede insertar objetos determinados en su expansión. Esto le da a la macro algo del poder de una función .

Como ejemplo sencillo, en el lenguaje de programación C , esta es una macro típica que no es una macro parametrizada, es decir, una macro sin parámetros :

 #definir PI 3.14159

Esto hace PIque siempre sea reemplazado por 3.14159dondequiera que ocurra. Por otro lado, un ejemplo de macro parametrizada es este:

 #definir pred(x) ((x)-1)

A qué se expande esta macro depende del argumento x que se le pasa. A continuación se muestran algunas posibles ampliaciones:

pred(2) → ((2) -1) pred(y+2) → ((y+2) -1) pred(f(5)) → ((f(5))-1)

Las macros parametrizadas son un mecanismo útil a nivel de fuente para realizar expansión en línea , pero en lenguajes como C , donde usan sustitución textual simple, tienen una serie de desventajas graves sobre otros mecanismos para realizar expansión en línea, como las funciones en línea. .

Las macros parametrizadas utilizadas en lenguajes como Lisp , PL/I y Scheme , por otro lado, son mucho más potentes y pueden tomar decisiones sobre qué código producir en función de sus argumentos; por lo tanto, se pueden utilizar de manera efectiva para realizar la generación de código en tiempo de ejecución .

Macros de sustitución de texto

Los lenguajes como C y algunos lenguajes ensambladores tienen sistemas de macros rudimentarios, implementados como preprocesadores del compilador o ensamblador. Las macros del preprocesador C funcionan mediante una simple sustitución textual a nivel de token , en lugar de a nivel de carácter. Sin embargo, las funciones macro de ensambladores más sofisticados, por ejemplo, IBM High Level Assembler (HLASM), no se pueden implementar con un preprocesador; el código para ensamblar instrucciones y datos se intercala con el código para ensamblar invocaciones de macros.

Un uso clásico de las macros es en el sistema de composición tipográfica TeX y sus derivados, donde la mayor parte de la funcionalidad se basa en macros.

MacroML es un sistema experimental que busca conciliar tipificación estática y sistemas macro. Nemerle ha escrito macros de sintaxis y una forma productiva de pensar en estas macros de sintaxis es como un cálculo de varias etapas .

Otros ejemplos:

Algunas aplicaciones importantes se han escrito como macros de texto invocadas por otras aplicaciones, por ejemplo, XEDIT en CMS.

Idiomas integrables

Algunos lenguajes, como PHP , se pueden incrustar en texto de formato libre o en el código fuente de otros lenguajes. El mecanismo por el cual se reconocen los fragmentos de código (por ejemplo, estar entre corchetes <?phpy ?>) es similar a un lenguaje de macros textual, pero son lenguajes mucho más potentes y con todas las funciones.

Macros procesales

Las macros en el lenguaje PL/I están escritas en un subconjunto del propio PL/I: el compilador ejecuta " declaraciones de preprocesador " en el momento de la compilación, y el resultado de esta ejecución forma parte del código que se compila. La capacidad de utilizar un lenguaje de procedimiento familiar como lenguaje de macros proporciona un poder mucho mayor que el de las macros de sustitución de texto, a expensas de un compilador más grande y más lento. Las macros en PL/I, así como en muchos ensambladores, pueden tener efectos secundarios , por ejemplo, establecer variables a las que otras macros pueden acceder.

Las macros de marco de la tecnología Frame tienen su propia sintaxis de comando pero también pueden contener texto en cualquier idioma. Cada marco es a la vez un componente genérico en una jerarquía de subconjuntos anidados y un procedimiento para integrarse con sus marcos de subconjunto (un proceso recursivo que resuelve conflictos de integración a favor de subconjuntos de nivel superior). Los resultados son documentos personalizados, normalmente módulos fuente compilables. La tecnología Frame puede evitar la proliferación de componentes similares pero sutilmente diferentes, un problema que ha afectado al desarrollo de software desde la invención de las macros y las subrutinas .

La mayoría de los lenguajes ensambladores tienen funciones de macros procesales menos potentes, por ejemplo, permitiendo que un bloque de código se repita N veces para desenrollar el bucle ; pero estos tienen una sintaxis completamente diferente a la del lenguaje ensamblador real.

Macros sintácticas

Los sistemas macro (como el preprocesador de C descrito anteriormente) que funcionan a nivel de tokens léxicos no pueden preservar la estructura léxica de manera confiable. Los macrosistemas sintácticos funcionan en cambio a nivel de árboles de sintaxis abstracta y preservan la estructura léxica del programa original. Las implementaciones más utilizadas de sistemas de macros sintácticos se encuentran en lenguajes similares a Lisp . Estos lenguajes son especialmente adecuados para este estilo de macro debido a su sintaxis uniforme y entre paréntesis (conocida como expresiones S ). En particular, la sintaxis uniforme facilita la determinación de las invocaciones de macros. Las macros Lisp transforman la estructura del programa en sí, con el lenguaje completo disponible para expresar dichas transformaciones. Si bien las macros sintácticas se encuentran a menudo en lenguajes similares a Lisp, también están disponibles en otros lenguajes como Prolog , [6] Erlang , [7] Dylan , [8] Scala , [9] Nemerle , [10] Rust , [11 ] Elixir , [12] Nim , [13] Haxe , [14] y Julia . [15] También están disponibles como extensiones de terceros para JavaScript [16] y C# . [17]

Macros tempranas de Lisp

Antes de que Lisp tuviera macros, tenía los llamados FEXPR , operadores similares a funciones cuyas entradas no eran los valores calculados por los argumentos sino las formas sintácticas de los argumentos, y cuya salida eran valores que se utilizarían en el cálculo. En otras palabras, los FEXPR se implementaron al mismo nivel que EVAL y proporcionaron una ventana a la capa de metaevaluación. En general, se encontró que este era un modelo difícil de razonar de manera efectiva. [18]

En 1963, Timothy Hart propuso agregar macros a Lisp 1.5 en AI Memo 57: Definiciones de MACRO para LISP. [19]

Macros anafóricas

Una macro anafórica es un tipo de macro de programación que captura deliberadamente alguna forma proporcionada a la macro a la que se puede hacer referencia mediante una anáfora (una expresión que se refiere a otra). Las macros anafóricas aparecieron por primera vez en On Lisp de Paul Graham y su nombre es una referencia a la anáfora lingüística: el uso de palabras como sustituto de las palabras anteriores.

Macros higiénicas

A mediados de los años ochenta, varios artículos [20] [21] introdujeron la noción de macro expansión higiénicasyntax-rules ( ), un sistema basado en patrones donde los entornos sintácticos de la definición macro y el uso macro son distintos, permitiendo a los definidores macro y los usuarios no deben preocuparse por la captura de variables involuntaria (cf. transparencia referencial ). Las macros higiénicas se han estandarizado para Scheme en los estándares R5RS , R6RS y R7RS . Existen varias implementaciones competitivas de macros higiénicas, como syntax-rules, syntax-case, cambio de nombre explícito y cierres sintácticos. Ambos syntax-rulesy syntax-casehan sido estandarizados en los estándares del Esquema.

Recientemente, Racket ha combinado las nociones de macros higiénicas con una "torre de evaluadores", de modo que el tiempo de expansión sintáctica de un sistema macro es el tiempo de ejecución ordinario de otro bloque de código, [22] y mostró cómo aplicar expansión y análisis intercalados. en un idioma sin paréntesis. [23]

Varios lenguajes distintos de Scheme implementan macros higiénicas o implementan sistemas parcialmente higiénicos. Los ejemplos incluyen Scala , Rust , Elixir , Julia , Dylan , Nim y Nemerle .

Aplicaciones

Orden de evaluación
Los sistemas macro tienen una variedad de usos. Ser capaz de elegir el orden de evaluación (ver evaluación diferida y funciones no estrictas ) permite la creación de nuevas construcciones sintácticas (por ejemplo, estructuras de control ) indistinguibles de las integradas en el lenguaje. Por ejemplo, en un dialecto Lisp que tiene condpero carece de if, es posible definir este último en términos del primero usando macros. Por ejemplo, Scheme tiene continuaciones y macros higiénicas, lo que permite a un programador diseñar sus propias abstracciones de control, como bucles y construcciones de salida temprana, sin la necesidad de incorporarlas al lenguaje.
Sublenguajes de datos y lenguajes específicos de dominio
A continuación, las macros permiten definir lenguajes de datos que se compilan inmediatamente en código, lo que significa que construcciones como las máquinas de estados se pueden implementar de una manera natural y eficiente. [24]
Construcciones vinculantes
También se pueden utilizar macros para introducir nuevas construcciones vinculantes. El ejemplo más conocido es la transformación de leten la aplicación de una función a un conjunto de argumentos.

Felleisen conjetura [25] que estas tres categorías constituyen los principales usos legítimos de las macros en dicho sistema. Otros han propuesto usos alternativos de macros, como macros anafóricas en macrosistemas que son antihigiénicos o permiten una transformación antihigiénica selectiva.

La interacción de macros y otras características del lenguaje ha sido un área de investigación productiva. Por ejemplo, los componentes y módulos son útiles para la programación a gran escala, pero la interacción de las macros y estas otras construcciones debe definirse para su uso conjunto. Se han propuesto sistemas de módulos y componentes que pueden interactuar con macros para Scheme y otros lenguajes con macros. Por ejemplo, el lenguaje Racket extiende la noción de un sistema macro a una torre sintáctica, donde las macros se pueden escribir en lenguajes que incluyen macros, utilizando la higiene para garantizar que las capas sintácticas sean distintas y permitiendo que los módulos exporten macros a otros módulos.

Macros para software independiente de la máquina

Las macros se utilizan normalmente para asignar una cadena corta (invocación de macro) a una secuencia más larga de instrucciones. Otro uso menos común de las macros es hacer lo contrario: asignar una secuencia de instrucciones a una cadena de macro. Este fue el enfoque adoptado por el sistema de programación móvil STAGE2 , que utilizó un compilador de macros rudimentario (llamado SIMCMP) para mapear el conjunto de instrucciones específico de una computadora determinada en macros independientes de la máquina . Las aplicaciones (especialmente los compiladores) escritas en estas macros independientes de la máquina se pueden ejecutar sin cambios en cualquier computadora equipada con el rudimentario compilador de macros. La primera aplicación que se ejecuta en tal contexto es un compilador de macros más sofisticado y potente, escrito en un lenguaje de macros independiente de la máquina. Este compilador de macros se aplica a sí mismo, mediante arranque , para producir una versión compilada y mucho más eficiente de sí mismo. La ventaja de este enfoque es que se pueden transferir aplicaciones complejas de una computadora a otra muy diferente con muy poco esfuerzo (para cada arquitectura de máquina de destino, solo la escritura del rudimentario macro compilador). [26] [27] La ​​llegada de los lenguajes de programación modernos, en particular C , para los cuales hay compiladores disponibles en prácticamente todas las computadoras, ha hecho que este enfoque sea superfluo. Este fue, sin embargo, uno de los primeros casos (si no el primero) de arranque del compilador .

lenguaje ensamblador

Si bien un programador puede definir instrucciones de macro para cualquier conjunto de instrucciones de programa ensamblador nativo, normalmente las macros están asociadas con bibliotecas de macros entregadas con el sistema operativo que permiten el acceso a funciones del sistema operativo, como

En sistemas operativos más antiguos, como los utilizados en los mainframes de IBM, la funcionalidad completa del sistema operativo sólo estaba disponible para programas en lenguaje ensamblador, no para programas en lenguaje de alto nivel (a menos que se usaran subrutinas en lenguaje ensamblador, por supuesto), ya que las instrucciones macro estándar no siempre lo hacían. Tener contrapartes en rutinas disponibles para lenguajes de alto nivel.

Historia

A mediados de la década de 1950, cuando la programación en lenguaje ensamblador se usaba comúnmente para escribir programas para computadoras digitales , se inició el uso de macroinstrucciones con dos propósitos principales: reducir la cantidad de codificación de programas que debía escribirse generando varias declaraciones en lenguaje ensamblador. a partir de una macro instrucción y para hacer cumplir los estándares de escritura de programas, por ejemplo, especificando comandos de entrada/salida de manera estándar. [30] Las instrucciones macro fueron efectivamente un paso intermedio entre la programación en lenguaje ensamblador y los lenguajes de programación de alto nivel que siguieron, como FORTRAN y COBOL . Dos de las primeras instalaciones de programación para desarrollar "lenguajes macro" para la computadora IBM 705 fueron en Dow Chemical Corp. en Delaware y Air Material Command, Ballistics Missile Logistics Office en California. Una macro instrucción escrita en el formato del lenguaje ensamblador de destino sería procesada por un compilador de macros, que era un preprocesador del ensamblador, para generar una o más instrucciones en lenguaje ensamblador que luego serían procesadas por el programa ensamblador que traduciría el instrucciones en lenguaje ensamblador en instrucciones en lenguaje máquina . [31]

A finales de la década de 1950, el lenguaje macro fue seguido por los Macro Ensambladores . Esta era una combinación de ambos donde un programa cumplía ambas funciones, la de un preprocesador macro y un ensamblador en el mismo paquete. [31] [ verificación fallida ]

En 1959, Douglas E. Eastwood y Douglas McIlroy de Bell Labs introdujeron macros condicionales y recursivas en el popular ensamblador SAP , [32] creando lo que se conoce como Macro SAP. [33] El artículo de McIlroy de 1960 fue fundamental en el área de la extensión de cualquier lenguaje de programación (incluido el de alto nivel ) a través de macroprocesadores . [34] [32]

Los macroensambladores permitieron a los programadores en lenguaje ensamblador implementar su propio macrolenguaje y permitieron una portabilidad limitada de código entre dos máquinas que ejecutaban la misma CPU pero diferentes sistemas operativos, por ejemplo, las primeras versiones de MS-DOS y CP/M-86 . La biblioteca de macros debería escribirse para cada máquina de destino, pero no para el programa en lenguaje ensamblador general. Tenga en cuenta que los macroensambladores más potentes permitían el uso de construcciones de ensamblaje condicional en instrucciones de macro que podían generar código diferente en diferentes máquinas o diferentes sistemas operativos, lo que reducía la necesidad de múltiples bibliotecas. [ cita necesaria ]

En la década de 1980 y principios de la de 1990, las PC de escritorio solo funcionaban a unos pocos MHz y las rutinas en lenguaje ensamblador se usaban comúnmente para acelerar los programas escritos en C, Fortran, Pascal y otros. Estos idiomas, en ese momento, usaban diferentes convenciones de llamada. Las macros podrían usarse para interconectar rutinas escritas en lenguaje ensamblador con el front-end de aplicaciones escritas en casi cualquier idioma. Nuevamente, el código básico del lenguaje ensamblador siguió siendo el mismo, solo era necesario escribir las bibliotecas de macros para cada idioma de destino. [ cita necesaria ]

En los sistemas operativos modernos como Unix y sus derivados, el acceso al sistema operativo se proporciona a través de subrutinas, generalmente proporcionadas por bibliotecas dinámicas. Los lenguajes de alto nivel como C ofrecen acceso completo a las funciones del sistema operativo, obviando la necesidad de programas en lenguaje ensamblador para dicha funcionalidad. [ cita necesaria ]

Ver también

Referencias

  1. ^ Diccionario de ingles Oxford , sv macro, macroinstrucción y macro-
  2. ^ Greenwald, Irwin D.; Maureen Kane (abril de 1959). "El sistema Share 709: programación y modificación". Revista de la ACM . Nueva York, NY, Estados Unidos: ACM. 6 (2): 128-133. doi : 10.1145/320964.320967 . S2CID  27424222. Uno de los usos importantes de las macros de programador es ahorrar tiempo y errores de tipo administrativo al escribir secuencias de instrucciones que a menudo se repiten en el curso de un programa.
  3. ^ Strachey, Christopher (octubre de 1965). "Un macrogenerador de uso general". Diario de informática . 8 (3): 225–241. doi : 10.1093/comjnl/8.3.225 .
  4. ^ "Runescape: el enorme juego de aventuras en línea de Jagex Ltd" . Consultado el 3 de abril de 2008 .
  5. ^ "guiones: vim en línea". www.vim.org .
  6. ^ "Macros de prólogo". www.metalevel.at . Consultado el 5 de abril de 2021 .
  7. ^ "Erlang - Preprocesador". erlang.org . Consultado el 24 de mayo de 2021 .
  8. ^ "El sistema macro Dylan: abre Dylan". opendylan.org . Consultado el 5 de abril de 2021 .
  9. ^ "Macros de definición". Documentación de Scala . Consultado el 5 de abril de 2021 .
  10. ^ "Acerca de: sitio oficial del lenguaje de programación Nemerle". nemerle.org . Consultado el 5 de abril de 2021 .
  11. ^ "Macros: el lenguaje de programación Rust". doc.rust-lang.org . Consultado el 5 de abril de 2021 .
  12. ^ "Macros". elixir-lang.github.com . Consultado el 5 de abril de 2021 .
  13. ^ "macros". nim-lang.org . Consultado el 5 de abril de 2021 .
  14. ^ "Macros". Haxe: el kit de herramientas multiplataforma .
  15. ^ "Metaprogramación · El lenguaje Julia". docs.julialang.org . Consultado el 5 de abril de 2021 .
  16. ^ "Sweet.js: macros higiénicas para JavaScript". www.sweetjs.org .
  17. ^ "Página de inicio de LeMP · C# mejorado". ecsharp.net .
  18. ^ Marshall, Joe. "correo electrónico sin título" . Consultado el 3 de mayo de 2012 .
  19. ^ Hart, Timothy P. (octubre de 1963). "Definiciones MACRO para LISP". Memos de IA . hdl : 1721.1/6111 . AIM-057.
  20. ^ Kohlbecker, Eugenio; Friedman, Daniel; Felleisen, Matías; Duba, Bruce (1986). "Macroexpansión higiénica". LFP '86: Actas de la conferencia ACM de 1986 sobre LISP y programación funcional . págs. 151-161. doi :10.1145/319838.319859. ISBN 0897912004.
  21. ^ [1] Clinger, Rees. "Macros que funcionan"
  22. ^ Flatt, Mateo. "Macros componibles y compilables: ¿las quieres para cuándo?" (PDF) .
  23. ^ Rafkind, Jon; Flatt, Mateo. "Honu: extensión sintáctica para notación algebraica mediante la enforestación" (PDF) .
  24. ^ "Autómatas mediante macros". cs.brown.edu .
  25. ^ [2], Matthias Felleisen, publicación en la lista de correo de LL1
  26. ^ Orgaso, Richard J.; William M. Waite (septiembre de 1969). "Una base para un sistema de programación móvil". Comunicaciones de la ACM . Nueva York, NY, Estados Unidos: ACM. 12 (9): 507–510. doi : 10.1145/363219.363226 . S2CID  8164996.
  27. ^ Waite, William M. (julio de 1970). "El sistema de programación móvil: STAGE2". Comunicaciones de la ACM . Nueva York, NY, Estados Unidos: ACM. 13 (7): 415–421. doi :10.1145/362686.362691. S2CID  11733598.
  28. ^ "Universidad del Norte de Florida" (PDF) .
  29. ^ "DTF (DOS/VSE)". IBM .
  30. ^ "Centro de conocimiento de IBM". Centro de conocimiento de IBM . 16 de agosto de 2013.
  31. ^ ab "Instrucciones de macros en lenguaje ensamblador". Cisco .
  32. ^ ab Holbrook, Bernard D.; Marrón, W. Stanley. "Informe técnico n.º 99 de ciencias de la computación: una historia de la investigación en computación en los laboratorios Bell (1937-1975)". Laboratorios Bell . Archivado desde el original el 2 de septiembre de 2014 . Consultado el 2 de febrero de 2020 .
  33. ^ "Macro SAP: modificación del macrocompilador de SAP". HOPL: Enciclopedia histórica en línea de lenguajes de programación . Archivado desde el original el 13 de agosto de 2008.
  34. ^ Layzell, P. (1985). "La historia de los macroprocesadores en la extensibilidad del lenguaje de programación". La revista informática . 28 (1): 29–33. doi : 10.1093/comjnl/28.1.29 .

enlaces externos