APL (nombrado así por el libro A Programming Language ) [3] es un lenguaje de programación desarrollado en la década de 1960 por Kenneth E. Iverson . Su tipo de datos central es la matriz multidimensional . Utiliza una amplia gama de símbolos gráficos especiales [4] para representar la mayoría de las funciones y operadores, lo que da lugar a un código muy conciso. Ha sido una influencia importante en el desarrollo de modelos de conceptos, hojas de cálculo , programación funcional [5] y paquetes de matemáticas informáticas. [6] También ha inspirado a varios otros lenguajes de programación. [7] [8]
Kenneth E. Iverson desarrolló una notación matemática para manipular matrices en la Universidad de Harvard en 1957. En 1960, comenzó a trabajar para IBM , donde desarrolló esta notación con Adin Falkoff y la publicó en su libro A Programming Language en 1962. [3] El prefacio establece su premisa:
Las matemáticas aplicadas se ocupan en gran medida del diseño y análisis de procedimientos explícitos para calcular los valores exactos o aproximados de diversas funciones. Dichos procedimientos explícitos se denominan algoritmos o programas . Dado que una notación eficaz para la descripción de programas presenta una estructura sintáctica considerable, se denomina lenguaje de programación .
Esta notación se utilizó dentro de IBM para informes de investigación breves sobre sistemas informáticos, como el Burroughs B5000 y su mecanismo de pila, cuando IBM estaba evaluando máquinas de pila versus máquinas de registro para las próximas computadoras.
Iverson también utilizó su notación en un borrador del capítulo Un lenguaje de programación , escrito para un libro que estaba escribiendo con Fred Brooks , Automatic Data Processing , que se publicaría en 1963. [9] [10]
En 1979, Iverson recibió el Premio Turing por su trabajo en APL. [11]
Ya en 1962 se produjo el primer intento de utilizar la notación para describir un sistema informático completo, después de que Falkoff discutiera con William C. Carter su trabajo para estandarizar el conjunto de instrucciones de las máquinas que posteriormente se convertirían en la familia IBM System/360 .
En 1963, Herbert Hellerman, que trabajaba en el IBM Systems Research Institute, implementó una parte de la notación en una computadora IBM 1620 , y los estudiantes la usaron en un curso especial de secundaria sobre el cálculo de funciones trascendentales mediante la suma de series. Los estudiantes probaron su código en el laboratorio de Hellerman. Esta implementación de una parte de la notación se denominó Personalized Array Translator (PAT). [12]
En 1963, Falkoff, Iverson y Edward H. Sussenguth Jr. , todos ellos trabajando en IBM, utilizaron la notación para una descripción formal de la arquitectura y funcionalidad de la máquina de la serie IBM System/360 , lo que dio lugar a un artículo publicado en IBM Systems Journal en 1964. Después de su publicación, el equipo centró su atención en una implementación de la notación en un sistema informático. Una de las motivaciones para este enfoque de implementación fue el interés de John L. Lawrence, que tenía nuevas funciones en Science Research Associates , una empresa educativa comprada por IBM en 1964. Lawrence pidió a Iverson y a su grupo que ayudaran a utilizar el lenguaje como herramienta para desarrollar y utilizar ordenadores en la educación. [13]
Después de que Lawrence M. Breed y Philip S. Abrams de la Universidad de Stanford se unieran al equipo de IBM Research, continuaron su trabajo previo en una implementación programada en FORTRAN IV para una parte de la notación que se había realizado para la computadora IBM 7090 que se ejecutaba en el sistema operativo IBSYS . Este trabajo se terminó a fines de 1965 y más tarde se denominó IVSYS (por sistema Iverson). La base de esta implementación fue descrita en detalle por Abrams en un Informe Técnico de la Universidad de Stanford, "Un intérprete para la notación Iverson" en 1966. El aspecto académico de esto fue supervisado formalmente por Niklaus Wirth . [14] Al igual que el sistema PAT de Hellerman anterior, esta implementación omitió el conjunto de caracteres APL, pero utilizó palabras especiales reservadas en inglés para funciones y operadores. El sistema se adaptó más tarde para un sistema de tiempo compartido y, en noviembre de 1966, se había reprogramado para la computadora IBM System/360 Modelo 50 que se ejecutaba en un modo de tiempo compartido y se usaba internamente en IBM. [15]
Un avance clave en la capacidad de utilizar APL de manera efectiva, antes del uso generalizado de terminales de tubo de rayos catódicos (CRT), fue el desarrollo de un elemento de mecanografía intercambiable especial para máquina de escribir IBM Selectric con todos los caracteres especiales de APL en él. Este se utilizó en estaciones de trabajo con terminales de impresión de papel que utilizaban el mecanismo de elemento de mecanografía y máquina de escribir Selectric, como los terminales IBM 1050 e IBM 2741. Se podían colocar teclas sobre las teclas normales para mostrar qué caracteres APL se introducirían y escribirían al pulsar esa tecla. Por primera vez, un programador podía escribir y ver los caracteres APL adecuados tal como se utilizan en la notación de Iverson y no verse obligado a utilizar representaciones extrañas de palabras clave en inglés. Falkoff e Iverson diseñaron los elementos de mecanografía especiales APL Selectric, 987 y 988, a finales de 1964, aunque no había ningún sistema informático APL disponible para utilizarlos. [16] Iverson citó a Falkoff como la inspiración para la idea de utilizar un elemento de tipado IBM Selectric para el conjunto de caracteres APL. [17]
Muchos símbolos APL, incluso con los caracteres APL en el elemento de mecanografía Selectric, todavía tenían que escribirse sobreponiendo dos caracteres de elementos existentes. Un ejemplo es el carácter de subida de nivel , que tenía que estar formado por un delta (mayúscula-H) y un trazo Sheffer (mayúscula-M). Esto era necesario porque el conjunto de caracteres APL era mucho más grande que los 88 caracteres permitidos en el elemento de mecanografía, incluso cuando las letras estaban restringidas a mayúsculas.
El primer inicio de sesión interactivo de APL y la creación de un espacio de trabajo de APL fueron realizados en 1966 por Larry Breed utilizando una terminal IBM 1050 en IBM Mohansic Labs cerca del Centro de Investigación Thomas J. Watson , la sede de APL, en Yorktown Heights , Nueva York. [16]
IBM fue el principal responsable de introducir APL en el mercado. La primera versión de APL disponible públicamente se lanzó en 1968 para el IBM 1130. IBM proporcionó APL\1130 de forma gratuita, pero sin responsabilidad ni soporte. [18] [19] Podía ejecutarse en tan solo 8k palabras de 16 bits de memoria y utilizaba un disco duro dedicado de 1 megabyte.
APL se afianzó en los sistemas de tiempo compartido de mainframe desde finales de los años 1960 hasta principios de los años 1980, en parte porque soportaría múltiples usuarios en sistemas de especificaciones más bajas que no tenían hardware de traducción dinámica de direcciones . [20] Las mejoras adicionales en el rendimiento para sistemas mainframe IBM System/370 seleccionados incluyeron el APL Assist Microcode en el que se incluyó cierto soporte para la ejecución de APL en el firmware del procesador , a diferencia de ser implementado completamente por software de nivel superior. Un poco más tarde, cuando el hardware de rendimiento adecuado finalmente comenzó a estar disponible a mediados y fines de los años 1980, muchos usuarios migraron sus aplicaciones al entorno de la computadora personal.
Los primeros intérpretes IBM APL para hardware IBM 360 e IBM 370 implementaron su propia gestión multiusuario en lugar de depender de los servicios del host, por lo que eran sus propios sistemas de tiempo compartido. El sistema APL\360 [21] [22] [23] , introducido por primera vez para su uso en IBM en 1966, era un intérprete multiusuario. La capacidad de comunicarse programáticamente con el sistema operativo para obtener información y configurar las variables del sistema del intérprete se realizaba a través de funciones especiales privilegiadas "I-beam", utilizando operaciones tanto monádicas como diádicas . [24]
En 1973, IBM lanzó APL.SV , que era una continuación del mismo producto, pero que ofrecía variables compartidas como un medio para acceder a funciones fuera del sistema APL, como archivos del sistema operativo. A mediados de la década de 1970, el intérprete de mainframe de IBM incluso se adaptó para su uso en la computadora de escritorio IBM 5100 , que tenía un pequeño CRT y un teclado APL, cuando la mayoría de las otras computadoras pequeñas de la época solo ofrecían BASIC . En la década de 1980, el producto de programa VSAPL disfrutó de un amplio uso entre los usuarios de Conversational Monitor System (CMS), Time Sharing Option (TSO), VSPC , MUSIC/SP y CICS .
Entre 1973 y 1974, Patrick E. Hagerty dirigió la implementación del intérprete APL de la Universidad de Maryland para la línea 1100 de computadoras mainframe Sperry UNIVAC 1100/2200 . [25] En 1974, se le asignó al estudiante Alan Stebbens la tarea de implementar una función interna. [26] Xerox APL estuvo disponible desde junio de 1975 para las mainframes Xerox 560 y Sigma 6, 7 y 9 que ejecutaban CP-V y para Honeywell CP-6 . [27]
En los años 1960 y 1970, surgieron varias empresas de tiempo compartido que vendían servicios APL utilizando versiones modificadas del intérprete IBM APL\360 [23] . En América del Norte, las más conocidas fueron IP Sharp Associates , Scientific Time Sharing Corporation (STSC), Time Sharing Resources (TSR) y The Computer Company (TCC). CompuServe también entró en el mercado en 1978 con un intérprete APL basado en una versión modificada de Digital Equipment Corp y Carnegie Mellon, que funcionaba en las máquinas KI y KL de 36 bits de DEC. El APL de CompuServe estaba disponible tanto para su mercado comercial como para el servicio de información al consumidor. Con la llegada primero de mainframes menos costosos como el IBM 4300 , y más tarde de la computadora personal, a mediados de los años 1980, la industria del tiempo compartido prácticamente había desaparecido.
Sharp APL estuvo disponible a través de IP Sharp Associates, primero como un servicio de tiempo compartido en la década de 1960 y luego como un producto de programa a partir de 1979. Sharp APL era una implementación avanzada de APL con muchas extensiones de lenguaje, como paquetes (la capacidad de colocar uno o más objetos en una sola variable), un sistema de archivos, matrices anidadas y variables compartidas .
Los intérpretes APL también estaban disponibles en otros fabricantes de mainframes y minicomputadoras, en particular Burroughs , Control Data Corporation (CDC), Data General , Digital Equipment Corporation (DEC), Harris , Hewlett-Packard (HP), Siemens , Xerox y otros.
Garth Foster, de la Universidad de Syracuse, patrocinó reuniones periódicas de la comunidad de implementadores de APL en el Centro de Conferencias Minnowbrook de Syracuse en Blue Mountain Lake, Nueva York . En años posteriores, Eugene McDonnell organizó reuniones similares en el Asilomar Conference Grounds cerca de Monterey , California , y en Pajaro Dunes cerca de Watsonville , California. El grupo de interés especial SIGAPL de la Association for Computing Machinery continúa apoyando a la comunidad de APL. [28]
En los microordenadores, que se empezaron a comercializar a partir de mediados de los años 1970, BASIC se convirtió en el lenguaje de programación dominante. [29] Sin embargo, algunos microordenadores proporcionaban APL en su lugar: el primero fue el MCM/70 basado en Intel 8008 que se lanzó en 1974 [30] [31] y que se utilizó principalmente en educación. [32] Otra máquina de esta época fue el VideoBrain Family Computer , lanzado en 1977, que se suministraba con su dialecto de APL llamado APL/S. [33]
El Commodore SuperPET , introducido en 1981, incluía un intérprete APL desarrollado por la Universidad de Waterloo . [34]
En 1976, Bill Gates afirmó en su Carta abierta a los aficionados que Microsoft Corporation estaba implementando APL para Intel 8080 y Motorola 6800, pero que tenía "muy pocos incentivos para ponerlo a disposición de los aficionados" debido a la piratería de software . [35] Nunca fue lanzado.
A principios de los años 1980, el desarrollo de IBM APL, bajo el liderazgo de Jim Brown , implementó una nueva versión del lenguaje APL que contenía como mejora principal el concepto de matrices anidadas , donde una matriz puede contener otras matrices, y nuevas características del lenguaje que facilitaban la integración de matrices anidadas en el flujo de trabajo del programa. Ken Iverson, que ya no controlaba el desarrollo del lenguaje APL, dejó IBM y se unió a IP Sharp Associates , donde una de sus principales contribuciones fue dirigir la evolución de Sharp APL para que estuviera más de acuerdo con su visión. [36] [37] [38] APL2 se lanzó por primera vez para CMS y TSO en 1984. [39] La edición APL2 Workstation (Windows, OS/2 , AIX , Linux y Solaris ) siguió más tarde. [40] [41]
Mientras otros proveedores estaban ocupados desarrollando intérpretes APL para nuevo hardware, en particular microcomputadoras basadas en Unix , APL2 fue casi siempre el estándar elegido para los nuevos desarrollos de intérpretes APL. Incluso hoy, la mayoría de los proveedores de APL o sus usuarios citan la compatibilidad con APL2 como un argumento de venta para esos productos. [42] [43] IBM cita su uso para la resolución de problemas, diseño de sistemas, creación de prototipos, ingeniería y cálculos científicos, sistemas expertos, [44] para la enseñanza de matemáticas y otras materias, visualización y acceso a bases de datos. [45]
Varias implementaciones de APL por parte de APLX, Dyalog, etc., incluyen extensiones para programación orientada a objetos , soporte para .NET , primitivas de conversión de matrices XML, gráficos, interfaces de sistemas operativos y expresiones de cálculo lambda . Las versiones gratuitas incluyen GNU APL para Linux y NARS2000 para Windows (que también se ejecuta en Linux bajo Wine). Ambas son versiones bastante completas de APL2 con varias extensiones de lenguaje.
El APL ha formado la base o ha influido en los siguientes idiomas: [ cita requerida ]
APL ha sido criticado y elogiado por su elección de un conjunto de caracteres único y no estándar. En los años 1960 y 1970, pocos dispositivos terminales o incluso pantallas podían reproducir el conjunto de caracteres APL. Los más populares empleaban el mecanismo de impresión IBM Selectric utilizado con un elemento de tipo APL especial. Uno de los primeros terminales de línea APL (operación solo en modo de línea, no en pantalla completa) fue el Texas Instruments TI Modelo 745 ( c. 1977 ) con el conjunto de caracteres APL completo [48] que presentaba modos de telecomunicaciones half y full duplex , para interactuar con un servicio de tiempo compartido APL o mainframe remoto para ejecutar un trabajo de computadora remota, entrada de trabajo remota (RJE).
Con el tiempo, con el uso universal de pantallas gráficas de alta calidad, dispositivos de impresión y soporte Unicode , el problema de las fuentes de caracteres APL se ha eliminado en gran medida. Sin embargo, la introducción de caracteres APL requiere el uso de editores de métodos de entrada , asignaciones de teclado, conjuntos de símbolos APL virtuales/en pantalla, [49] [50] o tarjetas de teclado impresas de fácil referencia que pueden frustrar a los principiantes acostumbrados a otros lenguajes de programación. [51] [52] [53] Con principiantes que no tienen experiencia previa con otros lenguajes de programación, un estudio que involucró a estudiantes de secundaria descubrió que escribir y usar caracteres APL no obstaculizaba a los estudiantes de ninguna manera mensurable. [54]
En defensa de APL, se requiere menos caracteres para escribir y las asignaciones de teclado se memorizan con el tiempo. También se fabrican y utilizan teclados APL especiales, al igual que fuentes descargables de forma gratuita para sistemas operativos como Microsoft Windows. [49] Las ganancias de productividad reportadas suponen que uno pasa suficiente tiempo trabajando en el lenguaje para que valga la pena memorizar los símbolos, su semántica, asignaciones de teclado y muchos modismos para tareas comunes. [ cita requerida ]
A diferencia de los lenguajes de programación estructurados tradicionalmente, el código APL se estructura típicamente como cadenas de funciones monádicas o diádicas y operadores [55] que actúan sobre matrices . [56] APL tiene muchas primitivas no estándar (funciones y operadores) que se indican mediante un solo símbolo o una combinación de unos pocos símbolos. Todas las primitivas están definidas para tener la misma precedencia y siempre asociarse a la derecha. Por lo tanto, APL se lee o se entiende mejor de derecha a izquierda .
Las primeras implementaciones de APL ( alrededor de 1970 ) no tenían estructuras de flujo de control de bucles de programación , como bucles do
o y construcciones. En su lugar, utilizaban operaciones con matrices, y el uso de construcciones de programación estructurada a menudo era innecesario, ya que una operación se podía realizar en una matriz completa en una sola instrucción. Por ejemplo, la función ( ) puede reemplazar la iteración del bucle for : ιN cuando se aplica a un entero positivo escalar produce una matriz unidimensional (vector), 1 2 3 ... N. Las implementaciones de APL posteriores generalmente incluyen estructuras de control integrales, de modo que la estructura de datos y el flujo de control del programa se pueden separar de manera clara y nítida.while
if-then-else
iota
ι
El entorno APL se denomina espacio de trabajo . En un espacio de trabajo, el usuario puede definir programas y datos, es decir, los valores de los datos también existen fuera de los programas y el usuario también puede manipular los datos sin tener que definir un programa. [57] En los ejemplos siguientes, el intérprete APL primero escribe seis espacios antes de esperar la entrada del usuario. Su propia salida comienza en la columna uno.
El usuario puede guardar el espacio de trabajo con todos los valores, programas y estados de ejecución.
APL utiliza un conjunto de símbolos no ASCII , que son una extensión de la notación aritmética y algebraica tradicional. Tener nombres de un solo carácter para funciones vectoriales de una sola instrucción y múltiples datos ( SIMD ) es una forma en que APL permite la formulación compacta de algoritmos para la transformación de datos, como calcular el Juego de la vida de Conway en una línea de código. [58] En casi todas las versiones de APL, es teóricamente posible expresar cualquier función computable en una expresión, es decir, en una línea de código. [ cita requerida ]
Debido al inusual conjunto de caracteres , muchos programadores usan teclados especiales con teclas APL para escribir código APL. [59] Aunque hay varias formas de escribir código APL usando solo caracteres ASCII, [60] en la práctica casi nunca se hace. (Se puede pensar que esto apoya la tesis de Iverson sobre la notación como herramienta de pensamiento . [61] ) La mayoría, si no todas, las implementaciones modernas usan diseños de teclado estándar, con asignaciones especiales o editores de métodos de entrada para acceder a caracteres que no son ASCII. Históricamente, la fuente APL ha sido distintiva, con caracteres alfabéticos en cursiva mayúscula y números y símbolos verticales. La mayoría de los proveedores continúan mostrando el conjunto de caracteres APL en una fuente personalizada.
Los defensores de APL [¿ quiénes? ] afirman que los ejemplos de código llamado de solo escritura (código mal escrito y casi incomprensible) son casi invariablemente ejemplos de malas prácticas de programación o errores de principiantes, que pueden ocurrir en cualquier lenguaje. Los defensores también afirman que son mucho más productivos con APL que con lenguajes informáticos más convencionales, y que se puede implementar software funcional en mucho menos tiempo y con muchos menos programadores que utilizando otras tecnologías. [ cita requerida ]
También pueden afirmar que, debido a que es compacto y conciso, el APL se presta bien al desarrollo de software a gran escala y a la complejidad, porque se puede reducir en gran medida la cantidad de líneas de código. Muchos defensores y profesionales del APL también consideran que los lenguajes de programación estándar, como COBOL y Java, son comparativamente tediosos. El APL se encuentra a menudo donde el tiempo de comercialización es importante, como en los sistemas comerciales. [62] [63] [64] [65]
APL hace una clara distinción entre funciones y operadores . [55] [66] Las funciones toman matrices (variables o constantes o expresiones) como argumentos y devuelven matrices como resultados. Los operadores (similares a las funciones de orden superior ) toman funciones o matrices como argumentos y derivan funciones relacionadas. Por ejemplo, la función suma se deriva aplicando el operador de reducción a la función suma . Aplicando el mismo operador de reducción a la función máxima (que devuelve el mayor de dos números) se deriva una función que devuelve el mayor de un grupo (vector) de números. En el lenguaje J, Iverson sustituyó los términos verbo por función y adverbio o conjunción por operador .
APL también identifica aquellas características incorporadas al lenguaje y representadas por un símbolo o una combinación fija de símbolos como primitivas . La mayoría de las primitivas son funciones u operadores. La codificación de APL es en gran medida un proceso de escritura de funciones no primitivas y (en algunas versiones de APL) operadores. Sin embargo, algunas primitivas no se consideran ni funciones ni operadores, sobre todo las de asignación.
Algunas palabras utilizadas en la literatura APL tienen significados diferentes a los de las matemáticas y la informática en general.
APL tiene representaciones explícitas de funciones, operadores y sintaxis, proporcionando así una base para la declaración clara y explícita de las funciones extendidas en el lenguaje y herramientas para experimentar con ellas. [70]
Esto muestra " Hola, mundo ":
'Hola Mundo'
Un tema de diseño en APL es definir acciones predeterminadas en algunos casos que producirían errores de sintaxis en la mayoría de los otros lenguajes de programación.
La constante de cadena 'Hola, mundo' anterior se muestra porque la visualización es la acción predeterminada en cualquier expresión para la que no se especifica ninguna acción explícitamente (por ejemplo, asignación, parámetro de función).
Otro ejemplo de este tema es que la exponenciación en APL se escribe como 2*3
, que indica elevar 2 a la potencia 3 (esto se escribiría como 2^3
o 2**3
en algunos lenguajes, o se relegaría a una llamada de función como pow(2, 3);
en otros). Muchos lenguajes usan *
para significar multiplicación, como en 2*3
, pero APL elige usar 2×3
. Sin embargo, si no se especifica ninguna base (como con la declaración *3
en APL, o ^3
en otros lenguajes), la mayoría de los lenguajes de programación verían esto como un error de sintaxis. APL, sin embargo, supone que la base faltante es la constante del logaritmo natural e , y la interpreta *3
como 2.71828*3
.
Supongamos que X
es una matriz de números. Entonces (+/X)÷⍴X
da su promedio. Leyendo de derecha a izquierda , ⍴X
da el número de elementos en X, y como ÷
es un operador diádico, también se requiere el término a su izquierda. Está rodeado por paréntesis ya que de lo contrario se tomaría X (de modo que la suma sería de X÷⍴X
—cada elemento de X dividido por el número de elementos en X), y +/X
da la suma de los elementos de X. Sobre la base de esto, la siguiente expresión calcula la desviación estándar :
(( + / (( X - ( + / X ) ÷⍴ X ) * 2 )) ÷⍴ X ) * 0,5
Naturalmente, se definiría esta expresión como una función para uso repetido en lugar de reescribirla cada vez. Además, dado que la asignación es un operador, puede aparecer dentro de una expresión, por lo que lo siguiente colocaría valores adecuados en T, AV y SD:
SD ← (( + / (( X - AV ← ( T ← + / X ) ÷⍴ X ) * 2 )) ÷⍴ X ) * 0,5
La siguiente expresión de modo inmediato genera un conjunto típico de números de lotería Pick 6 : seis números enteros pseudoaleatorios que van del 1 al 40, con garantía de no repetición , y los muestra ordenados en orden ascendente:
x [ ⍋ x ← 6 ? 40 ]
Lo anterior hace mucho, de forma concisa, aunque puede parecer complejo para un principiante en APL. Combina las siguientes funciones APL (también llamadas primitivas [71] y glifos [72] ):
?
(nombrada deal
cuando es diádica) que devuelve un vector que consiste en un número seleccionado (argumento izquierdo: 6 en este caso) de números enteros aleatorios que van desde 1 hasta un máximo especificado (argumento derecho: 40 en este caso), que, si dicho máximo ≥ longitud del vector, se garantiza que no se repetirá; por lo tanto, genera/crea 6 números enteros aleatorios que van desde 1 a 40. [73]←
) a la variable x
, porque se necesitará más adelante.⍋
función monádica, que tiene como argumento derecho todo lo que se encuentra a su derecha hasta el siguiente corchete o paréntesis de cierre no balanceado. El resultado de ⍋
son los índices que pondrán su argumento en orden ascendente.⍋
se utiliza para indexar la variable x
que guardamos anteriormente para este propósito, seleccionando así sus elementos en secuencia ascendente .Dado que no hay ninguna función a la izquierda de la x más a la izquierda para indicarle a APL qué hacer con el resultado, simplemente lo muestra en la pantalla (en una sola línea, separada por espacios) sin necesidad de ninguna instrucción explícita para hacerlo.
?
También tiene un equivalente monádico llamado roll
, que simplemente devuelve un entero aleatorio entre 1 y su único operando [a la derecha de este], ambos inclusive. Por lo tanto, un programa de juego de rol podría usar la expresión ?20
para lanzar un dado de veinte caras.
La siguiente expresión encuentra todos los números primos del 1 al R. Tanto en el tiempo como en el espacio, la complejidad del cálculo es (en notación Big O ).
( ~ R ∊ R ∘. × R ) / R ← 1 ↓⍳ R
Ejecutado de derecha a izquierda, esto significa:
⍳
crea un vector que contiene números enteros de1
aR
(siR= 6
al inicio del programa,⍳R
es1 2 3 4 5 6
)↓
función), es decir, 1
. Entonces 1↓⍳R
es2 3 4 5 6
R
el nuevo vector ( ←
, primitivo de asignación ), es decir,2 3 4 5 6
/
de réplica es diádico (binario) y el intérprete primero evalúa su argumento izquierdo (completamente entre paréntesis):R
multiplicado por R
, es decir, una matriz que es la tabla de multiplicación de R por R ( °.×
operador), es decir,R
con 1
en cada lugar donde el número correspondiente en R
esté en la matriz del producto externo ( ∈
, inclusión de conjunto o elemento de u operador Epsilon ), es decir,0 0 1 0 1
∼
lógico no u tilde ), es decir,1 1 0 1 0
R
los que el elemento correspondiente es 1
( operador /
de replicación ), es decir,2 3 5
(Esto supone que el origen de APL es 1, es decir, los índices comienzan con 1. APL se puede configurar para utilizar 0 como origen, de modo que ι6
sea 0 1 2 3 4 5
, lo cual es conveniente para algunos cálculos).
La siguiente expresión ordena una lista de palabras almacenada en la matriz X según la longitud de la palabra:
X [ ⍋ X + . ≠ ' ' ;]
La siguiente función "life", escrita en Dyalog APL, [74] [75] toma una matriz booleana y calcula la nueva generación según el Juego de la Vida de Conway . Demuestra el poder de APL para implementar un algoritmo complejo en muy poco código, pero para entenderlo se requieren algunos conocimientos avanzados de APL (como lo haría el mismo programa en muchos lenguajes).
vida ← { ⊃ 1 ⍵ ∨ . ∧ 3 4 = + / + ⌿ ¯1 0 1 ∘. ⊖ ¯1 0 1 ⌽ ¨ ⊂ ⍵ }
En el siguiente ejemplo, también Dyalog, la primera línea asigna un código HTML a una variable txt
y luego utiliza una expresión APL para eliminar todas las etiquetas HTML:
txt ← '<html><body><p>Este es texto <em>enfatizado</em>.</p></body></html>' { ⍵ /⍨ ~ { ⍵ ∨≠ \ ⍵ } ⍵ ∊ '<>' } txt Este es texto enfatizado .
APL deriva su nombre de las iniciales del libro de Iverson A Programming Language [3] , aunque el libro describe la notación matemática de Iverson, en lugar del lenguaje de programación implementado que se describe en este artículo. El nombre se utiliza solo para implementaciones reales, comenzando con APL\360.
Adin Falkoff acuñó el nombre en 1966 durante la implementación de APL\360 en IBM :
Mientras caminaba por la oficina que compartían los tres estudiantes, pude oír sonidos de una discusión. Asomé la cabeza por la puerta y Eric me preguntó: "¿No es cierto que todo el mundo sabe que la notación que estamos usando se llama APL?". Lamenté tener que decepcionarlo al confesarle que nunca había oído que se llamara así. ¿De dónde había sacado la idea de que era tan conocido? ¿Y quién había decidido llamarlo así? De hecho, ¿por qué tenía que llamarse de alguna manera? Mucho tiempo después escuché cómo se llamaba. Cuando comenzó el esfuerzo de implementación en junio de 1966, también comenzó el esfuerzo de documentación. Supongo que cuando tuvieron que escribir sobre "eso", Falkoff e Iverson se dieron cuenta de que tendrían que darle un nombre a "eso". Probablemente hubo muchas sugerencias en ese momento, pero solo he oído hablar de dos. Un grupo de SRA en Chicago que estaba desarrollando materiales didácticos utilizando la notación estaba a favor del nombre "Mathlab". Esto no tuvo éxito. Otra sugerencia fue llamarlo "La mejor matemática de Iverson" y dejar que la gente inventara el acrónimo apropiado, lo que se consideró una broma.
Un día, Adin Falkoff entró en la oficina de Ken y escribió en la pizarra "Un lenguaje de programación" y debajo el acrónimo "APL". Así nació. Fue sólo una semana después de esto cuando Eric Iverson me hizo su pregunta, en un momento en que el nombre aún no había encontrado su camino a lo largo de las trece millas de Taconic Parkway desde IBM Research hasta IBM Mohansic.
—Eugene McDonnell , [76]
APL se reinterpreta ocasionalmente como lenguaje de programación de matrices o lenguaje de procesamiento de matrices , [77] lo que convierte a APL en un acrónimo inverso .
Siempre ha habido cooperación entre los proveedores de APL, y se celebraron conferencias conjuntas de forma regular desde 1969 hasta 2010. [78] En dichas conferencias, a menudo se repartían productos de APL, con motivos de APL o una colección de logotipos de proveedores. Los más comunes eran las manzanas (como un juego de palabras sobre la similitud en la pronunciación de apple y APL ) y el fragmento de código que son los símbolos producidos por la distribución clásica del teclado APL al mantener presionada la tecla modificadora APL y escribir "APL".⍺*⎕
A pesar de todos estos esfuerzos de la comunidad, no surgió un logotipo universal independiente del proveedor para el lenguaje de programación. A medida que los lenguajes de programación populares han establecido cada vez más logotipos reconocibles, Fortran obtuvo uno en 2020, [79] la Asociación Británica de APL lanzó una campaña en la segunda mitad de 2021 para establecer un logotipo de este tipo para APL y, después de una elección de la comunidad y múltiples rondas de comentarios, se eligió un logotipo en mayo de 2022. [80]
APL se utiliza para muchos propósitos, incluidas aplicaciones financieras y de seguros , [81] inteligencia artificial , [82] [83] redes neuronales [84] y robótica . [85] Se ha argumentado que APL es una herramienta de cálculo y no un lenguaje de programación; [86] su naturaleza simbólica y sus capacidades de matriz lo han hecho popular entre los expertos en el dominio y los científicos de datos [87] que no tienen o no requieren las habilidades de un programador de computadoras . [ cita requerida ]
APL es muy adecuado para la manipulación de imágenes y la animación por ordenador , donde las transformaciones gráficas se pueden codificar como multiplicaciones de matrices. Una de las primeras empresas de gráficos por ordenador comerciales, Digital Effects , produjo un producto gráfico APL llamado Visions , que se utilizó para crear anuncios de televisión y animación para la película Tron de 1982. [88] Más tarde, el simulador de navegación Stormwind utiliza APL para implementar su lógica central, su interfaz con el middleware de la canalización de renderizado y una parte importante de su motor de física . [89]
En la actualidad, APL sigue utilizándose en una amplia gama de aplicaciones comerciales y científicas, por ejemplo, gestión de inversiones , [81] gestión de activos , [90] [ cita requerida ] atención sanitaria , [91] y elaboración de perfiles de ADN . [92] [93]
La primera implementación de APL que utilizó símbolos APL reconocibles fue APL\360, que se ejecutó en IBM System/360 y se completó en noviembre de 1966 [1], aunque en ese momento solo se usaba en IBM. [39] En 1973, sus implementadores, Larry Breed , Dick Lathwell y Roger Moore , recibieron el premio Grace Murray Hopper de la Association for Computing Machinery (ACM). Se les otorgó "por su trabajo en el diseño e implementación de APL\360, estableciendo nuevos estándares en simplicidad, eficiencia, confiabilidad y tiempo de respuesta para sistemas interactivos". [94] [95] [96]
En 1975, la microcomputadora IBM 5100 ofreció APL\360 [97] como uno de los dos lenguajes interpretados basados en ROM integrados para la computadora, completo con un teclado y una pantalla que admitían todos los símbolos especiales utilizados en el lenguaje. [98]
Entre los desarrollos más importantes de APL\360 se encuentran CMS/APL, que hizo uso de las capacidades de almacenamiento virtual de CMS y APLSV, que introdujo variables compartidas , variables del sistema y funciones del sistema. Posteriormente se trasladó a las plataformas IBM System/370 y VSPC hasta su lanzamiento final en 1983, después de lo cual fue reemplazado por APL2. [39]
En 1968, APL\1130 se convirtió en el primer sistema APL disponible públicamente, creado por IBM para el IBM 1130. [ 99] Se convirtió en el software de biblioteca IBM Tipo III más popular que lanzó IBM. [100]
APL*Plus y Sharp APL son versiones de APL\360 con extensiones orientadas a empresas, como formato de datos y funciones para almacenar matrices APL en archivos externos. Fueron desarrolladas en conjunto por dos empresas, que emplearon a varios miembros del equipo de desarrollo original de IBM APL\360. [101]
Las dos empresas eran IP Sharp Associates (IPSA), una empresa de servicios APL\360 formada en 1964 por Ian Sharp, Roger Moore y otros, y STSC , una empresa de servicios de consultoría y tiempo compartido formada en 1969 por Lawrence Breed y otros. Juntos, los dos desarrollaron APL*Plus y luego continuaron trabajando juntos, pero desarrollaron APL por separado como APL*Plus y Sharp APL. STSC portó APL*Plus a muchas plataformas con versiones realizadas para VAX 11, [102] PC y UNIX, mientras que IPSA adoptó un enfoque diferente ante la llegada de la computadora personal e hizo que Sharp APL estuviera disponible en esta plataforma utilizando hardware PC-XT/360 adicional. En 1993, se formó Soliton Incorporated para respaldar Sharp APL y desarrolló Sharp APL en SAX (Sharp APL para Unix). A partir de 2018 [actualizar], APL*Plus continúa como APL2000 APL+Win.
En 1985, Ian Sharp y Dan Dyer de STSC recibieron conjuntamente el premio Kenneth E. Iverson por su destacada contribución a APL . [103]
APL2 fue una reimplementación importante de APL por parte de IBM, que se desarrolló a partir de 1971 y se lanzó por primera vez en 1984. Proporciona muchas adiciones al lenguaje, de las cuales la más notable es el soporte de matrices anidadas (no rectangulares). [39] Todo el equipo de productos y servicios de APL2 recibió el premio Iverson en 2007. [103]
En 2021, IBM vendió APL2 a Log-On Software, que desarrolla y vende el producto como Log-On APL2 . [104]
En 1972, se lanzó APLGOL como una versión experimental de APL que agregó construcciones de lenguaje de programación estructurada al marco del lenguaje. Se agregaron nuevas declaraciones para el control entre declaraciones, la ejecución de declaraciones condicionales y la estructuración de declaraciones, así como declaraciones para aclarar la intención del algoritmo. [105] Se implementó para Hewlett-Packard en 1977. [106]
Dyalog APL fue lanzado por primera vez por la empresa británica Dyalog Ltd. [107] en 1983 [108] y, a partir de 2018 [actualizar], está disponible para plataformas AIX , Linux (incluido Raspberry Pi ), macOS y Microsoft Windows . Se basa en APL2, con extensiones para admitir programación orientada a objetos , [109] programación funcional , [110] y programación tácita . [111] Las licencias son gratuitas para uso personal/no comercial. [112]
En 1995, dos miembros del equipo de desarrollo, John Scholes y Peter Donnelly, recibieron el premio Iverson por su trabajo en el intérprete. [103] Gitte Christensen y Morten Kromberg fueron ganadores conjuntos del premio Iverson en 2016. [113]
NARS2000 es un intérprete APL de código abierto escrito por Bob Smith, un destacado desarrollador e implementador de APL de STSC en los años 1970 y 1980. NARS2000 contiene características avanzadas y nuevos tipos de datos y se ejecuta de forma nativa en Microsoft Windows y otras plataformas bajo Wine . Recibe su nombre de una herramienta de desarrollo de la década de 1980, NARS (Nested Arrays Research System). [114]
APLX es un dialecto multiplataforma de APL, basado en APL2 y con varias extensiones, que fue lanzado por primera vez por la compañía británica MicroAPL en 2002. Aunque ya no está en desarrollo ni a la venta comercial, ahora está disponible de forma gratuita en Dyalog. [115]
York APL [116] se desarrolló en la Universidad de York , Ontario, alrededor de 1968, y se ejecutaba en mainframes IBM 360. Una diferencia notable entre este y APL\360 era que definía la "forma" (ρ) de un escalar como 1, mientras que APL\360 la definía como el 0, matemáticamente más correcto; esto hizo que fuera más fácil escribir funciones que actuaran de la misma manera con escalares y vectores.
GNU APL es una implementación libre de Extended APL como se especifica en ISO/IEC 13751:2001 y, por lo tanto, es una implementación de APL2. Se ejecuta en Linux , macOS, varios dialectos BSD y en Windows (ya sea utilizando Cygwin para brindar soporte completo a todas sus funciones de sistema o como un binario nativo de Windows de 64 bits con algunas de sus funciones de sistema faltantes). GNU APL utiliza Unicode internamente y se puede escribir en scripts. Fue escrito por Jürgen Sauermann. [117]
Richard Stallman , fundador del Proyecto GNU , fue uno de los primeros en adoptar APL, utilizándolo para escribir un editor de texto cuando era estudiante de secundaria en el verano de 1969. [118]
APL es tradicionalmente un lenguaje interpretado , con características de lenguaje tales como tipado de variables débil no muy adecuado para la compilación . [119] Sin embargo, con matrices como su estructura de datos central [120] proporciona oportunidades para ganancias de rendimiento a través del paralelismo , [121] computación paralela , [122] [123] aplicaciones masivamente paralelas , [124] [125] e integración a muy gran escala (VLSI), [126] [127] y desde el principio APL ha sido considerado como un lenguaje de alto rendimiento [128] – por ejemplo, se destacó por la velocidad con la que podía realizar operaciones matriciales complicadas "porque opera en matrices y realiza operaciones como inversión de matrices internamente". [129]
Sin embargo, rara vez se interpreta de forma pura el APL y las técnicas de compilación o compilación parcial que se utilizan o se han utilizado incluyen las siguientes:
La mayoría de los intérpretes APL admiten el reconocimiento de modismos [130] y evalúan modismos comunes como operaciones únicas. [131] [132] Por ejemplo, al evaluar el modismo BV/⍳⍴A
como una operación única (donde BV
es un vector booleano y A
es una matriz), se evita la creación de dos matrices intermedias. [133]
El tipado débil en APL significa que un nombre puede hacer referencia a una matriz (de cualquier tipo de datos), una función o un operador. En general, el intérprete no puede saber de antemano qué forma tendrá y, por lo tanto, debe realizar análisis, comprobación de sintaxis, etc. en tiempo de ejecución. [134] Sin embargo, en determinadas circunstancias, es posible deducir de antemano a qué tipo se espera que haga referencia un nombre y luego generar un código de bytes que se puede ejecutar con una sobrecarga de tiempo de ejecución reducida. Este código de bytes también se puede optimizar utilizando técnicas de compilación como el plegado constante o la eliminación de subexpresiones comunes . [135] El intérprete ejecutará el código de bytes cuando esté presente y cuando se cumplan las suposiciones que se hayan realizado. Dyalog APL incluye soporte para código de bytes optimizado. [135]
La compilación de APL ha sido objeto de investigación y experimentación desde que el lenguaje estuvo disponible por primera vez; se considera que el primer compilador fue el Burroughs APL-700 [136] que se lanzó alrededor de 1971. [137] Para poder compilar APL, se deben imponer limitaciones de lenguaje. [136] [138] APEX es un compilador de APL de investigación que fue escrito por Robert Bernecky y está disponible bajo la Licencia Pública General de GNU . [139]
El compilador STSC APL es un híbrido entre un optimizador de código de bytes y un compilador: permite la compilación de funciones a código de máquina siempre que se declaren sus subfunciones y variables globales , pero el intérprete todavía se utiliza como una biblioteca de tiempo de ejecución y para ejecutar funciones que no cumplen con los requisitos de compilación. [140]
APL ha sido estandarizado por el grupo de trabajo X3J10 del Instituto Nacional Estadounidense de Estándares (ANSI) y la Organización Internacional de Normalización (ISO) y la Comisión Electrotécnica Internacional (IEC), Comité Técnico Conjunto ISO/IEC 1 Subcomité 22 Grupo de Trabajo 3. El lenguaje APL principal está especificado en ISO 8485:1989, y el lenguaje APL extendido está especificado en ISO/IEC 13751:2001.
LISP y APL fueron dos influencias tempranas
Sofia es una plataforma de gestión de inversiones de principio a fin como SimCorp Dimension. ... Sofia se basa en el lenguaje de codificación APL al igual que algunas partes de SimCorp Dimension.
Digital Effects es otra productora que trabajó en Tron. Utilizaron un sistema de escaneo láser para digitalizar, almacenar y reproducir imágenes. Judson Rosebush, presidente de Digital Effects, es el diseñador principal de APL VISION y FORTRAN VISION, dos paquetes de animación por computadora que se utilizan actualmente.
Stormwind es un [simulador de navegación en 3D] que ha despertado un gran interés en la comunidad APL.
Gracias a la elección de APL como plataforma técnica, es relativamente fácil construir rápidamente una solución que se puede llamar prototipo ejecutable (traducido del original)
Los lenguajes orientados a colecciones incluyen APL, APL2.
GCA – Automatización celular global. Inherentemente masivamente paralela. 'Se ha elegido APL debido a la capacidad de expresar estructuras matriciales y vectoriales'.
APL para interactividad y facilidad de codificación.
Se describen los generadores de módulos VLSI. APL y C, como ejemplos de lenguajes interpretados y compilados, se pueden interconectar con una pantalla gráfica avanzada.