APL (llamado 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 funciones y operadores, lo que genera un código muy conciso. Ha tenido una influencia importante en el desarrollo de modelos conceptuales, hojas de cálculo , programación funcional , [5] y paquetes matemáticos informáticos. [6] También ha inspirado varios otros lenguajes de programación. [7] [8]
Kenneth E. Iverson desarrolló una notación matemática para manipular matrices a partir de 1957 en la Universidad de Harvard . 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 varias funciones. Estos procedimientos explícitos se denominan algoritmos o programas . Debido a que una notación eficaz para la descripción de programas exhibe una estructura sintáctica considerable, se le llama lenguaje de programación .
Esta notación se utilizó dentro de IBM para informes breves de investigación sobre sistemas informáticos, como el Burroughs B5000 y su mecanismo de pila, cuando IBM evaluaba 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 , Procesamiento automático de datos , que se publicaría en 1963. [9] [10]
En 1979, Iverson recibió el Premio Turing por su trabajo en APL. [11]
Ya en 1962, el primer intento de utilizar la notación para describir un sistema informático completo se produjo después de que Falkoff discutiera con William C. Carter su trabajo para estandarizar el conjunto de instrucciones para las máquinas que más tarde se convertirían en la familia IBM System/360 .
En 1963, Herbert Hellerman, trabajando en el IBM Systems Research Institute, implementó una parte de la notación en una computadora IBM 1620 , y fue utilizada por estudiantes en un curso especial de secundaria sobre cálculo de funciones trascendentales mediante 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ó Traductor de matrices personalizado (PAT). [12]
En 1963, Falkoff, Iverson y Edward H. Sussenguth Jr. , todos trabajando en IBM, utilizaron la notación para una descripción formal de la arquitectura y funcionalidad de las máquinas de la serie IBM System/360 , lo que dio lugar a un artículo publicado en IBM Systems Journal en 1964. Después de la publicación de esto, 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, quien tenía nuevas funciones en Science Research Associates , una empresa educativa comprada por IBM en 1964. Lawrence pidió a Iverson y su grupo que le ayudaran a utilizar el lenguaje como herramienta para Desarrollar y utilizar computadoras 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 hecho para la computadora IBM 7090 que se ejecutaba en el Sistema operativo IBSYS . Este trabajo se terminó a finales de 1965 y posteriormente se denominó IVSYS (por sistema Iverson). Abrams describió en detalle la base de esta implementación en un informe técnico de la Universidad de Stanford, "An Interpreter for Iverson Notation" en 1966. El aspecto académico de esto fue supervisado formalmente por Niklaus Wirth . [14] Al igual que el sistema PAT de Hellerman anteriormente, esta implementación no incluía el juego de caracteres APL, pero usaba palabras especiales reservadas en inglés para funciones y operadores. Posteriormente, el sistema se adaptó para un sistema de tiempo compartido y, en noviembre de 1966, había sido reprogramado para la computadora IBM System/360 Modelo 50 que se ejecutaba en modo de tiempo compartido y se usaba internamente en IBM. [15]
Un avance clave en la capacidad de utilizar APL de manera eficaz, antes del uso generalizado de terminales de tubo de rayos catódicos ( CRT ), fue el desarrollo de un elemento de escritura especial intercambiable para la máquina de escribir IBM Selectric con todos los caracteres especiales de APL. Esto se utilizó en estaciones de trabajo con terminales de impresión en papel que utilizaban la máquina de escribir Selectric y el mecanismo de elementos de mecanografía, como los terminales IBM 1050 e IBM 2741 . Se podrían colocar teclas sobre las teclas normales para mostrar qué caracteres APL se ingresarían y escribirían cuando se presionara esa tecla. Por primera vez, un programador podría escribir y ver los caracteres APL adecuados tal como se usan en la notación de Iverson y no verse obligado a utilizar incómodas representaciones de palabras clave en inglés. Falkoff e Iverson hicieron diseñar los elementos de escritura 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 inspiración para la idea de utilizar un elemento de escritura IBM Selectric para el juego de caracteres APL. [17]
Muchos símbolos APL, incluso con los caracteres APL en el elemento de escritura Selectric, aún tenían que escribirse tachando dos caracteres de elementos existentes. Un ejemplo es el carácter de subida de grado , que tuvo que crearse a partir de un delta (shift-H) y un trazo de Sheffer (shift-M). Esto era necesario porque el conjunto de caracteres APL era mucho mayor que los 88 caracteres permitidos en el elemento de escritura, incluso cuando las letras estaban restringidas a mayúsculas (mayúsculas).
El primer inicio de sesión interactivo de APL y la creación de un espacio de trabajo de APL fue en 1966 por Larry Breed utilizando una terminal IBM 1050 en los laboratorios IBM Mohansic cerca del Centro de Investigación Thomas J. Watson , el hogar de APL, en Yorktown Heights , Nueva York. [dieciséis]
IBM fue el principal responsable de introducir APL en el mercado. La primera versión disponible públicamente de APL se lanzó en 1968 para el IBM 1130 . IBM proporcionó APL\1130 de forma gratuita pero sin responsabilidad ni soporte. [18] [19] Se ejecutaría con tan solo 8k palabras de memoria de 16 bits y utilizaría un disco duro dedicado de 1 megabyte.
APL se afianzó en los sistemas mainframe de tiempo compartido desde finales de los años 1960 hasta principios de los 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 microcódigo de asistencia APL 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, a medida que finalmente se disponía de hardware con un rendimiento adecuado, a mediados y finales de la década de 1980, muchos usuarios migraron sus aplicaciones al entorno de la computadora personal.
Los primeros intérpretes de IBM APL para hardware IBM 360 e IBM 370 implementaron su propia administración multiusuario en lugar de depender de los servicios de host, por lo que eran sus propios sistemas de tiempo compartido. Introducido por primera vez para su uso en IBM en 1966, el sistema APL\360 [21] [22] [23] era un intérprete multiusuario. La capacidad de comunicarse mediante programación con el sistema operativo para obtener información y configurar variables del sistema intérprete se realizó a través de funciones especiales privilegiadas "I-beam", utilizando operaciones monádicas y diádicas . [24]
En 1973, IBM lanzó APL.SV , que era una continuación del mismo producto, pero que ofrecía variables compartidas como medio para acceder a instalaciones 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 CRT pequeño 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 del programa VSAPL disfrutó de un amplio uso entre los usuarios de Conversational Monitor System (CMS), Time Sharing Option (TSO), VSPC , MUSIC/SP y CICS .
En 1973-1974, Patrick E. Hagerty dirigió la implementación del intérprete APL de la Universidad de Maryland para la línea 1100 de las computadoras centrales Sperry UNIVAC serie 1100/2200 . [25] En 1974, al estudiante Alan Stebbens se le asignó la tarea de implementar una función interna. [26] Xerox APL estuvo disponible desde junio de 1975 para mainframes Xerox 560 y Sigma 6, 7 y 9 con CP-V y para Honeywell CP-6 . [27]
En las décadas de 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 Norteamérica, 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 ingresó al mercado en 1978 con un intérprete APL basado en una versión modificada de Digital Equipment Corp y Carnegie Mellon, que corría 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 luego de la computadora personal, a mediados de la década de 1980, la industria del tiempo compartido prácticamente había desaparecido.
Sharp APL estaba 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 poner uno o más objetos en una sola variable), un sistema de archivos, matrices anidadas y variables compartidas .
También había intérpretes APL disponibles de 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 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 APL. [28]
En las microcomputadoras, que estuvieron disponibles a partir de mediados de la década de 1970, BASIC se convirtió en el lenguaje de programación dominante. [29] Sin embargo, algunas microcomputadoras proporcionaron APL en su lugar; la primera fue la MCM/70 basada 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 la VideoBrain Family Computer , lanzada 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 publicado.
A principios de la década de 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 facilitó la integración de matrices anidadas en el flujo de trabajo del programa. Ken Iverson, que ya no tenía el control del 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 en día, la mayoría de los proveedores de APL o sus usuarios citan la compatibilidad con APL2 como un punto 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 de APLX, Dyalog y otros incluyen extensiones para programación orientada a objetos , soporte para .NET , primitivas de conversión de matrices XML, gráficos, interfaces de sistema operativo y expresiones de cálculo lambda . Las versiones gratuitas incluyen GNU APL para Linux y NARS2000 para Windows (que se ejecuta en Linux bajo Wine). Ambas son versiones bastante completas de APL2 con varias extensiones de idioma.
APL ha formado la base o ha influido en los siguientes idiomas: [ cita necesaria ]
APL ha sido criticado y elogiado por su elección de un conjunto de caracteres único y no estándar. En las décadas de 1960 y 1970, pocos dispositivos terminales o incluso pantallas podían reproducir el juego de caracteres APL. Los más populares empleaban el mecanismo de impresión IBM Selectric utilizado con un elemento especial tipo APL. Uno de los primeros terminales de línea APL (operación en modo de línea únicamente, no en pantalla completa) fue el Texas Instruments TI Modelo 745 ( c. 1977 ) con el conjunto completo de caracteres APL [48] que presentaba modos de telecomunicaciones semidúplex y dúplex completo , para interactuar. con un servicio de tiempo compartido APL o una computadora central remota para ejecutar un trabajo de computadora remota, llamado RJE .
Con el tiempo, con el uso universal de pantallas gráficas de alta calidad, dispositivos de impresión y compatibilidad con Unicode , el problema de las fuentes de caracteres APL se ha eliminado en gran medida. Sin embargo, ingresar 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 encontró que escribir y usar caracteres APL no obstaculizaba a los estudiantes de ninguna manera mensurable. [54]
En defensa de APL, se requieren menos caracteres para escribir y las asignaciones de teclado se memorizan con el tiempo. En la actualidad también se fabrican y se utilizan teclados APL especiales, al igual que fuentes descargables gratuitamente para sistemas operativos como Microsoft Windows. [55] Las ganancias de productividad reportadas suponen que uno pasa suficiente tiempo trabajando en el idioma para que valga la pena memorizar los símbolos, su semántica y las asignaciones del teclado, sin mencionar una cantidad sustancial de modismos para tareas comunes. [ cita necesaria ]
A diferencia de los lenguajes de programación estructurados tradicionalmente, el código APL generalmente se estructura como cadenas de funciones monádicas o diádicas y operadores [56] que actúan sobre matrices . [57] APL tiene muchas primitivas no estándar (funciones y operadores) que se indican mediante un solo símbolo o una combinación de algunos símbolos. Todas las primitivas están definidas para tener la misma precedencia y siempre se asocian a la derecha. Por lo tanto, APL se lee o se comprende mejor de derecha a izquierda .
Las primeras implementaciones de APL ( c. 1970 aproximadamente) no tenían estructuras de control de flujo de bucle de programación , como bucles do
o y construcciones. En su lugar, utilizaron operaciones con matrices y el uso de construcciones de programación estructuradas a menudo no era necesario, ya que se podía realizar una operación en una matriz completa en una sola declaración. Por ejemplo, la función ( ) puede reemplazar la iteración del bucle for : ιN, cuando se aplica a un entero escalar positivo, produce una matriz unidimensional (vector), 1 2 3 ... N. Las implementaciones más recientes de APL generalmente incluyen estructuras de control integrales. , de modo que la estructura de datos y el flujo de control del programa se puedan separar clara y limpiamente.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. [58] En los ejemplos siguientes, el intérprete de 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 estado 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 una sola instrucción y funciones vectoriales de datos múltiples ( 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. [59] 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 necesaria ]
Debido al inusual juego de caracteres , muchos programadores utilizan teclados especiales con teclas APL para escribir código APL. [60] Aunque hay varias formas de escribir código APL utilizando sólo caracteres ASCII, [61] en la práctica casi nunca se hace. (Se puede pensar que esto respalda la tesis de Iverson sobre la notación como herramienta de pensamiento . [62] ) La mayoría, si no todas, las implementaciones modernas utilizan 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 siguen mostrando el juego de caracteres APL en una fuente personalizada.
Defensores de APL [ ¿quién? ] afirman que los ejemplos del llamado código de sólo escritura (código mal escrito y casi incomprensible) son casi invariablemente ejemplos de malas prácticas de programación o errores de principiante, 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 el software funcional se puede implementar en mucho menos tiempo y con muchos menos programadores que usando otras tecnologías. [ cita necesaria ]
También pueden afirmar que, debido a que es compacto y conciso, APL se presta bien al desarrollo y la complejidad de software a mayor escala, porque el número de líneas de código se puede reducir considerablemente. Muchos defensores y profesionales de APL también consideran que los lenguajes de programación estándar como COBOL y Java son comparativamente tediosos. APL se encuentra a menudo donde el tiempo de comercialización es importante, como en los sistemas comerciales. [63] [64] [65] [66]
APL hace una distinción clara entre funciones y operadores . [56] [67] Las funciones toman matrices (variables, 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 de suma se obtiene aplicando el operador de reducción a la función de suma . Al aplicar el mismo operador de reducción a la función máxima (que devuelve el mayor de dos números) se obtiene 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 integradas en el 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. Codificar 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 funciones ni operadores, sobre todo la asignación.
Algunas palabras utilizadas en la literatura APL tienen significados que difieren de los de las matemáticas y de 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 funciones extendidas en el lenguaje y herramientas para experimentar con ellas. [71]
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 demás lenguajes de programación.
Se muestra la constante de cadena 'Hola, mundo' anterior, porque mostrar es la acción predeterminada en cualquier expresión para la cual 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
, lo que indica elevar 2 a la potencia 3 (esto se escribiría como 2^3
o 2**3
en algunos idiomas, o se relegaría a una llamada de función como pow(2, 3);
en otros). Muchos idiomas usan *
para indicar multiplicación, como en 2*3
, pero APL elige usar 2×3
. Sin embargo, si no se especifica ninguna base (como ocurre 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 serie de números. Luego (+/X)÷⍴X
da su promedio. La lectura de derecha a izquierda⍴X
da el número de elementos en X y, dado que es ÷
un operador diádico, también se requiere el término a su izquierda. Está entre 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, se presenta lo siguiente La 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 en modo inmediato genera un conjunto típico de números de lotería Pick 6 : seis enteros pseudoaleatorios que van del 1 al 40, garantizados sin repetición , y los muestra ordenados en orden ascendente:
x [ ⍋ x ← 6 ? 40 ]
Lo anterior hace mucho, de manera concisa, aunque pueda parecer complejo para un nuevo APLer. Combina las siguientes funciones APL (también llamadas primitivas [72] y glifos [73] ):
?
(llamada así deal
cuando es diádica) que devuelve un vector que consta de un número seleccionado (argumento izquierdo: 6 en este caso) de enteros aleatorios que van desde 1 hasta un máximo especificado ( argumento correcto: 40 en este caso), que, si dicho máximo ≥ longitud del vector, se garantiza que no se repetirá; por lo tanto, genere/cree 6 números enteros aleatorios que van del 1 al 40. [74]←
) a la variable x
, porque será necesario más adelante.⍋
función monádica, que tiene como argumento derecho todo lo que está a la derecha hasta el siguiente paréntesis o paréntesis cercano desequilibrado. El resultado ⍋
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 decirle 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 número entero aleatorio entre 1 y su único operando [a su derecha], inclusive. Por tanto, un programa de juego de rol podría utilizar 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 O grande ).
( ~ R ∊ R ∘. × R ) / R ← 1 ↓⍳ R
Ejecutado de derecha a izquierda, esto significa:
⍳
crea un vector que contiene números enteros desde1
hastaR
(siR= 6
al inicio del programa,⍳R
es1 2 3 4 5 6
)↓
función), es decir 1
,. Asi 1↓⍳R
es2 3 4 5 6
R
en el nuevo vector ( ←
, primitiva 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 sea la tabla de multiplicar de R por R ( °.×
operador), es decir,R
en 1
cada lugar donde el número correspondiente R
está en la matriz del producto exterior ( ∈
, inclusión del conjunto o elemento de u operador Epsilon ), es decir,0 0 1 0 1
∼
lógico o operador Tilde ), es decir,1 1 0 1 0
R
para los cuales el elemento correspondiente es 1
( operador /
replicar ), es decir,2 3 5
(Tenga en cuenta que esto supone que el origen de APL es 1, es decir, los índices comienzan con 1. APL se puede configurar para que use 0 como origen, por lo que es ι6
, 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 "vida", escrita en Dyalog APL, [75] [76] 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 comprenderlo requiere cierto conocimiento avanzado 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 código HTML a una variable txt
y luego usa una expresión APL para eliminar todas las etiquetas HTML (explicación):
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] a pesar de que el libro describe la notación matemática de Iverson, en lugar del lenguaje de programación implementado descrito en este artículo. El nombre se utiliza sólo 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 escuchar 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 confesándole que nunca había oído que se llamara así. ¿De dónde había sacado la idea de que era bien conocido? ¿Y quién había decidido llamarlo así? De hecho, ¿por qué tenía que llamarse de alguna manera? Un tiempo después escuché cómo se llamaba. Cuando comenzaron los esfuerzos 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. Probablemente se hicieron muchas sugerencias en ese momento, pero sólo he oído hablar de dos. Un grupo de la SRA de Chicago que estaba desarrollando materiales didácticos utilizando la notación se mostró a favor del nombre "Mathlab". Esto no tuvo éxito. Otra sugerencia fue llamarlo "Las mejores matemáticas de Iverson" y luego dejar que la gente acuñara el acrónimo apropiado. Esto se consideró una broma.
Entonces, un día, Adin Falkoff entró en la oficina de Ken y escribió "Un lenguaje de programación" en la pizarra, y debajo el acrónimo "APL". Así nació. Aproximadamente una semana después de esto, Eric Iverson me hizo su pregunta, en un momento en que el nombre aún no había encontrado su camino en las trece millas de Taconic Parkway desde IBM Research hasta IBM Mohansic.
—Eugene McDonnell , [77]
APL se reinterpreta ocasionalmente como lenguaje de programación de matrices o lenguaje de procesamiento de matrices , [78] convirtiendo así a APL en un backronym .
Siempre ha habido cooperación entre los proveedores de APL, y se celebraron conferencias conjuntas de forma regular desde 1969 hasta 2010. [79] En dichas conferencias, a menudo se entregaba mercancía de APL, con motivos de APL o una colección de logotipos de proveedores. Comunes eran las manzanas (como un juego de palabras con 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ó ningún 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, [80] La Asociación Británica de APL lanzó una campaña en la segunda mitad de 2021 para establecer dicho logotipo para APL, y después de una elección comunitaria y múltiples rondas de comentarios. , se eligió un logotipo en mayo de 2022. [81]
APL se utiliza para muchos propósitos, incluidas aplicaciones financieras y de seguros , [82] inteligencia artificial , [83] [84] redes neuronales [85] y robótica . [86] Se ha argumentado que APL es una herramienta de cálculo y no un lenguaje de programación; [87] 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 [88] que no tienen ni requieren las habilidades de un programador informático . [ cita necesaria ]
APL se adapta bien a la manipulación de imágenes y la animación por computadora , donde las transformaciones gráficas se pueden codificar como multiplicaciones de matrices. Una de las primeras empresas comerciales de gráficos por computadora, Digital Effects , produjo un producto de gráficos APL llamado Visions , que se utilizó para crear comerciales de televisión y animación para la película Tron de 1982 . [89] Últimamente, el simulador de navegación Stormwind utiliza APL para implementar su lógica central, su interfaz con el middleware del proceso de renderizado y una parte importante de su motor de física . [90]
Hoy en día, APL sigue utilizándose en una amplia gama de aplicaciones comerciales y científicas, por ejemplo, gestión de inversiones , [82] gestión de activos , [91] [ cita necesaria ] atención médica , [92] y elaboración de perfiles de ADN . [93] [94]
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 permanecía en uso sólo dentro de 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). Fue otorgado "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". [95] [96] [97]
En 1975, la microcomputadora IBM 5100 ofrecía APL\360 [98] como uno de los dos lenguajes interpretados basados en ROM integrados para la computadora, completo con un teclado y una pantalla que admitía todos los símbolos especiales utilizados en el idioma. [99]
Los desarrollos importantes de APL\360 incluyeron CMS/APL, que hizo uso de las capacidades de almacenamiento virtual de CMS y APLSV, que introdujeron variables compartidas , variables del sistema y funciones del sistema. Posteriormente fue portado 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 . [100] Se convirtió en el software de biblioteca IBM Tipo III más popular que lanzó IBM. [101]
APL*Plus y Sharp APL son versiones de APL\360 con extensiones adicionales orientadas a los negocios, como formato de datos y funciones para almacenar matrices APL en archivos externos. Fueron desarrollados conjuntamente por dos empresas, empleando a varios miembros del equipo de desarrollo original de IBM APL\360. [102]
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 posteriormente continuaron trabajando juntos, pero desarrollaron APL por separado como APL*Plus y Sharp APL. STSC portó APL*Plus a muchas plataformas con versiones para VAX 11, [103] PC y UNIX, mientras que IPSA adoptó un enfoque diferente a la llegada de la computadora personal e hizo que Sharp APL estuviera disponible en esta plataforma utilizando PC-XT adicional. Hardware /360 . 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 . [104]
APL2 fue una reimplementación significativa 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 la compatibilidad con matrices anidadas (no rectangulares). [39] Todo el equipo de productos y servicios de APL2 recibió el premio Iverson en 2007. [104]
En 2021, IBM vendió APL2 a Log-On Software, quien desarrolla y vende el producto como Log-On APL2 . [105]
En 1972, APLGOL fue lanzado como una versión experimental de APL que agregó construcciones de lenguaje de programación estructuradas al marco del lenguaje. Se agregaron nuevas declaraciones para el control interestatal, la ejecución de declaraciones condicionales y la estructuración de declaraciones, así como declaraciones para aclarar la intención del algoritmo. [106] Se implementó para Hewlett-Packard en 1977. [107]
Dyalog APL fue lanzado por primera vez por la empresa británica Dyalog Ltd. [108] en 1983 [109] y, a partir de 2018 [actualizar], está disponible para las plataformas AIX , Linux (incluso en Raspberry Pi ), macOS y Microsoft Windows . Está basado en APL2, con extensiones para soportar programación orientada a objetos , [110] programación funcional , [111] y programación tácita . [112] Las licencias son gratuitas para uso personal/no comercial. [113]
En 1995, dos miembros del equipo de desarrollo, John Scholes y Peter Donnelly, recibieron el premio Iverson por su trabajo con el intérprete. [104] Gitte Christensen y Morten Kromberg recibieron conjuntamente el Premio Iverson en 2016. [114]
NARS2000 es un intérprete de APL de código abierto escrito por Bob Smith, un destacado desarrollador e implementador de APL de STSC en las décadas de 1970 y 1980. NARS2000 contiene funciones avanzadas y nuevos tipos de datos y se ejecuta de forma nativa en Microsoft Windows y otras plataformas bajo Wine . Lleva el nombre de una herramienta de desarrollo de la década de 1980, NARS (Nested Arrays Research System). [115]
APLX es un dialecto multiplataforma de APL, basado en APL2 y con varias extensiones, que fue lanzado por primera vez por la empresa británica MicroAPL en 2002. Aunque ya no está en desarrollo ni en venta comercial, ahora está disponible de forma gratuita en Dyalog. [116]
York APL [117] fue desarrollado en la Universidad de York , Ontario, alrededor de 1968, ejecutándose en mainframes IBM 360. Una diferencia notable entre este y APL\360 fue que definió la "forma" (ρ) de un escalar como 1, mientras que APL\360 la definió como el 0, más matemáticamente 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 gratuita de APL extendida 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 usando Cygwin para soporte completo de todas las funciones del sistema o como un binario nativo de Windows de 64 bits al que le faltan algunas de las funciones del sistema). GNU APL usa Unicode internamente y puede programarse mediante scripts. Fue escrito por Jürgen Sauermann. [118]
Richard Stallman , fundador del Proyecto GNU , fue uno de los primeros en adoptar APL y lo utilizó para escribir un editor de texto cuando era estudiante de secundaria en el verano de 1969. [119]
APL es tradicionalmente un lenguaje interpretado , que tiene características de lenguaje como una tipificación de variables débil que no se adapta bien a la compilación . [120] Sin embargo, con matrices como estructura de datos central [121] proporciona oportunidades para obtener ganancias de rendimiento a través del paralelismo , [122] computación paralela , [123] [124] aplicaciones masivamente paralelas , [125] [126] y aplicaciones muy grandes. integración de escala (VLSI), [127] [128] y desde el principio APL ha sido considerado como un lenguaje de alto rendimiento [129] ; 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". [130]
Sin embargo, APL rara vez se interpreta puramente 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 de APL admiten el reconocimiento de modismos [131] y evalúan modismos comunes como operaciones únicas. [132] [133] Por ejemplo, al evaluar el modismo BV/⍳⍴A
como una sola operación (donde BV
es un vector booleano y A
es una matriz), se evita la creación de dos matrices intermedias. [134]
La escritura 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, verificación de sintaxis, etc. en tiempo de ejecución. [135] 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 . [136] 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. [136]
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 [137] , que se lanzó alrededor de 1971. [138] Para poder compilar APL, se deben imponer limitaciones de idioma. [137] [139] APEX es un compilador APL de investigación escrito por Robert Bernecky y está disponible bajo la licencia pública GNU . [140]
El compilador STSC APL es un híbrido de un optimizador de código de bytes y un compilador: permite la compilación de funciones en código de máquina siempre que se declaren sus subfunciones y funciones globales , pero el intérprete todavía se utiliza como biblioteca de tiempo de ejecución y para ejecutar funciones que no lo hacen. no cumple con los requisitos de compilación. [141]
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), el Subcomité 22 del Comité Técnico Conjunto 1 de ISO/IEC, el Grupo de Trabajo 3. El lenguaje principal de APL es especificado en ISO 8485:1989, y el lenguaje APL extendido se especifica en ISO/IEC 13751:2001.
LISP y APL fueron dos de las primeras influencias
Sofia es una plataforma de gestión de inversiones integral 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 Efectos Digitales, 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.
Mediante la elección de APL como plataforma técnica, es relativamente fácil construir rápidamente una solución que pueda denominarse prototipo ejecutable (traducido del original).
Los lenguajes orientados a colecciones incluyen APL, APL2
GCA – Automatización Celular Global.
Inherentemente masivamente paralelo.
"Se ha elegido APL debido a su capacidad para 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, pueden conectarse a una pantalla de gráficos avanzada.