Homoiconicidad

Summary

En programación informática, la homoiconicidad es una propiedad de algunos lenguajes de programación, en los cuales la representación primaria de estos es también una estructura de datos en un tipo primitivo del lenguaje.

Orígenes

editar

La fuente original es la publicación Macro Instruction Extensions of Compiler Languages,[1]​ según la temprana y muy influyente publicación TRAC, A Text-Handling Language:[2]

Uno de los objetivos principales de diseño era que el código de entrada TRAC (lo que es introducido por el usuario) debería ser idéntico al texto que guía la acción interna del procesador TRAC. En otras palabras, los programas TRAC deberían ser almacenados en memoria como una cadena de caracteres exactamente del mismo modo que el usuario los introduce en el teclado. Si los programas TRAC evolucionan en nuevos programas, éstos deben ser también establecidos en el mismo código. El procesador TRAC interpreta este código como su programa. En otras palabras, el programa traductor TRAC (el procesador) convierte el ordenador en otro ordenador con un nuevo lenguaje de programación -- el lenguaje TRAC. En cualquier momento, debería ser posible mostrar información procedural o del programa del mismo modo que el procesador TRAC actuará sobre él durante su ejecución. Es deseable que el código interno de representación sea idéntico, o muy similar, a la representación externa. En la actual implementación TRAC, la representación de caracteres interna está basada en ASCII. Ya que los programas TRAC y su código tienen la misma representación interna y externamente, el término homoicónico es aplicable, del homo significando igual, y de icono significando representación.

[...]

Siguiente sugerencia de McCullough, W. S., basada en terminología debida a Peirce, C. S. s McIlroy. M. D., "Macro Instruction Extensions of Compiler Languages," Comm. ACM, p. 214-220; April, 1960.

Alan Kay usó y posiblemente popularizó el término "homoicónico" a través de su tesis doctoral de 1969:[3]

Un grupo notable a todos los sistemas previos son Interactive LISP [...] y TRAC. Ambos son lenguajes funcionales (uno de listas, otro de cadenas), ambos se comunican con el usuario con un lenguaje, y ambos son homoicónicos en cuanto que su representación interna y externa son esencialmente las mismas. Ambos tienen la habilidad de crear dinámicamente nuevas funciones que pueden ser entonces elaboradas a medida del usuario. ¡Su única contraprestación es que los programas escritos con ellos parecen la carta del rey Burna Buriash a los sumerios escrita en cuneiforme babilónico! [...]

Uso y ventajas

editar

Una ventaja de la homoiconicidad es que extender el lenguaje con nuevos conceptos habitualmente se hace más sencillo. Ya que los datos representando el código puede ser pasado entre las capas base y meta del programa. El árbol de sintaxis abstracta de una función puede ser compuesta y manipulada como una estructura de datos en la capa meta, y entonces, evaluada

Una demostración típica de la homoiconicidad es el evaluador metacircular.

Lenguajes homoicónicos

editar

Los lenguajes considerados homoicónicos son:

En los sistemas con arquitectura Von Neumann (incluyendo la vasta mayoría de los sistemas actuales), el código máquina también tiene esta propiedad, siendo el tipo de datos bytes en memoria.

Enlaces externos

editar
  • Definición de homoiconicidad en C2 Wiki.

Referencias

editar
  1. Douglas McIlroy (1960) Macro Instruction Extensions of Compiler Languages
  2. Calvin Mooers and L. Peter Deutsch (1965) TRAC, A Text-Handling Language
  3. Alan Kay (1969) The Reactive Engine, PhD thesis (Accessed 20061229)
  •   Datos: Q925488