APL (lenguaje de programación)

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Lenguaje funcional y simbólico de programación para operar en arrays multidimensionales

APL (llamado así por el libro Un lenguaje de programación) 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 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 y paquetes matemáticos informáticos. También ha inspirado varios otros lenguajes de programación.

Historia

Notación matemática

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 Un lenguaje de programación en 1962. 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. Tales procedimientos explícitos se llaman algoritmos o Programas. Debido a que una notación efectiva para la descripción de los programas exhibe una estructura sintáctica considerable, se llama una lenguaje de programación.

Esta notación se usó 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 las máquinas de pila frente a las máquinas de registro para las próximas computadoras.

Iverson también usó 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 sería publicado en 1963.

En 1979, Iverson recibió el Premio Turing por su trabajo en APL.

Desarrollo en un lenguaje de programación de computadoras

Ya en 1962, el primer intento de utilizar la notación para describir un sistema informático completo ocurrió después de que Falkoff hablara con William C. Carter sobre su trabajo para estandarizar el conjunto de instrucciones para las máquinas que luego se convirtieron en la familia IBM System/360.

En 1963, Herbert Hellerman, que trabajaba en el Instituto de Investigación de Sistemas de IBM, implementó una parte de la notación en una computadora IBM 1620 y los estudiantes la utilizaron 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ó Traductor de matrices personalizadas (PAT).

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 la funcionalidad de la máquina de la serie IBM System/360, lo que resultó en 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, quien tenía nuevos deberes en Science Research Associates, una compañía educativa comprada por IBM en 1964. Lawrence le pidió a Iverson y a su grupo que lo ayudaran a usar el lenguaje como una herramienta para Desarrollar y utilizar las computadoras en la educación.

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 anterior 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. ejecutándose en el sistema operativo IBSYS. Este trabajo se terminó a fines de 1965 y luego se denominó IVSYS (por el 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. Al igual que el anterior sistema PAT de Hellerman, 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, se había reprogramado para la computadora IBM System / 360 Model 50 que se ejecutaba en modo de tiempo compartido y se usaba internamente en IBM.

Hardware

Tipoballs de IBM y rueda tipográfica que contienen caracteres griegos APL.
Vista del programador del diseño del teclado IBM 2741 con la cabeza de impresión del elemento APL

Un desarrollo clave en la capacidad de usar APL de manera efectiva, antes del uso generalizado de terminales de tubo de rayos catódicos (CRT), fue el desarrollo de un elemento de escritura intercambiable especial para máquina de escribir IBM Selectric con todos los caracteres APL especiales. Esto se usó en estaciones de trabajo de terminales de impresión en papel que utilizan la máquina de escribir Selectric y el mecanismo de elementos de escritura, como el terminal IBM 1050 e IBM 2741. Las teclas se pueden colocar sobre las teclas normales para mostrar qué caracteres APL se ingresarán y escribirán cuando se presione esa tecla. Por primera vez, un programador podía escribir y ver los caracteres APL correctos como se usan en la notación de Iverson y no verse obligado a usar representaciones de palabras clave en inglés incómodas. Falkoff e Iverson tenían los elementos especiales de tipeo APL Selectric, 987 y 988, diseñados a fines de 1964, aunque no había ningún sistema informático APL disponible para usarlos. Iverson citó a Falkoff como inspiración para la idea de utilizar un elemento de escritura IBM Selectric para el juego de caracteres APL.

Muchos símbolos APL, incluso con los caracteres APL en el elemento de escritura Selectric, aún tenían que escribirse superponiendo dos caracteres de elementos existentes. Un ejemplo es el carácter grade up, que se tuvo que hacer a partir de un delta (shift-H) y un trazo Sheffer (shift-M). Esto era necesario porque el juego de caracteres APL era mucho más grande que los 88 caracteres permitidos en el elemento de escritura, incluso cuando las letras estaban restringidas a mayúsculas.

Disponibilidad comercial

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 usando una terminal IBM 1050 en IBM Mohansic Labs cerca del Centro de Investigación Thomas J. Watson, el hogar de APL, en Yorktown Heights, Nueva York.

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 IBM 1130. IBM proporcionó APL1130 de forma gratuita pero sin responsabilidad ni soporte. Se ejecutaría en tan solo 8k palabras de 16 bits de memoria y usaría un disco duro dedicado de 1 megabyte.

APL se afianzó en los sistemas de tiempo compartido de mainframe desde finales de la década de 1960 hasta principios de la de 1980, en parte porque admitía múltiples usuarios en sistemas de especificaciones más bajas que no tenían hardware de traducción de direcciones dinámicas. Las mejoras adicionales en el rendimiento para los sistemas de 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 sistemas superiores. software de nivel. Un poco más tarde, cuando el hardware de rendimiento adecuado finalmente estuvo disponible 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 gestión multiusuario en lugar de depender de los servicios del host, por lo que eran sus propios sistemas de tiempo compartido. Introducido por primera vez para su uso en IBM en 1966, el sistema APL360 era un intérprete multiusuario. La capacidad de comunicarse mediante programación con el sistema operativo para obtener información y configurar las variables del sistema del intérprete se realizó a través de un "I-beam" funciones, usando operaciones tanto monádicas como diádicas.

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 instalaciones fuera del sistema APL, como los 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 del programa VSAPL disfrutó de un amplio uso con 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 de la serie Sperry UNIVAC 1100/2200. En ese momento, Sperry no tenía nada. En 1974, al estudiante Alan Stebbens se le asignó la tarea de implementar una función interna. Xerox APL estuvo disponible desde junio de 1975 para los mainframes Xerox 560 y Sigma 6, 7 y 9 que ejecutan CP-V y para Honeywell CP-6.

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 APL360. En América del Norte, los más conocidos 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's, que se ejecutaba 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 el advenimiento primero de los 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 casi 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 un servicio avanzado Implementación de APL con muchas extensiones de lenguaje, como paquetes (la capacidad de poner uno o más objetos en una sola variable), sistema de archivos, matrices anidadas y variables compartidas.

Los intérpretes APL también estaban disponibles de otros fabricantes de mainframe 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 los implementadores de APL' comunidad 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.

Microordenadores

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. Sin embargo, algunas microcomputadoras proporcionaron APL en su lugar; la primera fue la MCM/70 basada en Intel 8008, que se lanzó en 1974 y se usó principalmente en la educación. Otra máquina de esta época fue VideoBrain Family Computer, lanzada en 1977, que se suministró con su dialecto de APL llamado APL/S.

Commodore SuperPET, presentado en 1981, incluía un intérprete APL desarrollado por la Universidad de Waterloo.

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. Nunca fue lanzado.

APL2

A principios de la década de 1980, IBM APL Development, bajo la dirección de Jim Brown, implementó una nueva versión del lenguaje APL que contenía como principal mejora el concepto de matrices anidadas, donde una matriz puede contener otras matrices y nuevas funciones de lenguaje que facilitaron 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 I. P. Sharp Associates, donde una de sus principales contribuciones fue dirigir la evolución de Sharp APL para estar más de acuerdo con su visión. APL2 se lanzó por primera vez para CMS y TSO en 1984. La edición APL2 Workstation (Windows, OS/2, AIX, Linux y Solaris) siguió más tarde.

Como otros proveedores estaban ocupados desarrollando intérpretes APL para hardware nuevo, especialmente 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. IBM menciona su uso para la resolución de problemas, el diseño de sistemas, la creación de prototipos, los cálculos científicos y de ingeniería, los sistemas expertos, la enseñanza de matemáticas y otras materias, la visualización y el acceso a bases de datos.

Implementaciones modernas

Diversas implementaciones de APL por parte de APLX, Dyalog y otros incluyen extensiones para programación orientada a objetos, compatibilidad con.NET Framework, primitivas de conversión de matriz 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). Ambos son versiones bastante completas de APL2 con varias extensiones de idioma.

Lenguas derivadas

APL ha formado la base o ha influido en los siguientes idiomas:

  • A y A+, una alternativa APL, esta última con extensiones gráficas.
  • FP, un lenguaje funcional de programación.
  • Ivy, un intérprete para un lenguaje similar a la APL desarrollado por Rob Pike, y que utiliza la ASCII como entrada.
  • J, que también fue diseñado por Iverson, y que utiliza ASCII con gráficos en lugar de símbolos especiales.
  • K, una variante patentada de APL desarrollada por Arthur Whitney.
  • MATLAB, una herramienta de cálculo numérica.
  • Nial, un lenguaje de programación de gamas de alto nivel con una notación de programación funcional.
  • Lenguaje de programación polimorfo, un lenguaje interactivo y extensible con un lenguaje base similar.
  • S, un lenguaje de programación estadística (generalmente ahora visto en la versión de código abierto conocida como R).
  • Talkeasy, un ambiente interactivo de computación numérica.
  • Wolfram Language, el lenguaje de programación de Mathematica.

Características del idioma

Conjunto de personajes

APL ha sido criticado y elogiado por su elección de un juego de caracteres único y no estándar. Algunos de los que lo aprenden se convierten en fervientes adherentes. 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 (solo operación en modo de línea, no pantalla completa) fue el Texas Instruments TI Model 745 (c. 1977) con el conjunto completo de caracteres APL que presentaba modos de telecomunicaciones de dúplex completo y medio, para interactuar con un servicio de tiempo compartido de APL o mainframe remoto 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 la fuente 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 o tarjetas de teclado impresas de fácil referencia que pueden frustrar a los principiantes acostumbrados a otros lenguajes de programación. 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 medible.

En defensa de APL, requiere escribir menos caracteres y las asignaciones de teclado se memorizan con el tiempo. Hoy en día también se fabrican y utilizan teclados APL especiales, al igual que fuentes que se pueden descargar gratuitamente para sistemas operativos como Microsoft Windows. 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 de teclado, sin mencionar una cantidad sustancial de expresiones idiomáticas para tareas comunes.

Diseño

A diferencia de los lenguajes de programación estructurados tradicionalmente, el código APL suele estar estructurado como cadenas de funciones monádicas o diádicas y operadores que actúan sobre matrices. APL tiene muchas primitivas no estándar (funciones y operadores) que se indican con 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 entiende mejor de derecha a izquierda.

Las primeras implementaciones de APL (c. 1970 más o menos) no tenían estructuras de control de flujo de bucle de programación, como bucles do o while y construcciones if-then-else. En cambio, usaron operaciones de matriz, y el uso de construcciones de programación estructurada a menudo no era necesario, ya que una operación se podía realizar en una matriz completa en una declaración. Por ejemplo, la función iota (ι) puede reemplazar la iteración de bucle for: ιN cuando se aplica a un entero positivo escalar 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 pueden separar clara y limpiamente.

El entorno APL se denomina área 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. En los ejemplos a continuación, el intérprete de APL primero escribe seis espacios antes de esperar la entrada del usuario. Su propia salida comienza en la columna uno.

 n  4 5 6 7
Asignaciones vector de valores, {4 5 6 7}, a variable n, un array crear operación. Una expresión APL equivalente pero más concisa sería n 3 + 4. Múltiples valores se almacenan en array n, la operación realizada sin bucles formales o lenguaje de flujo de control.
 n 4 5 6 7
Mostrar el contenido de n, actualmente una matriz o vector.
 n+48 9 10 11
4 se añade ahora a todos los elementos del vector n, creando un vector de 4 elementos {8 9 10 11}.
Como arriba, el intérprete de APL muestra el resultado porque el valor de la expresión no fue asignado a una variable (con una variable) ).
 +/n22
APL muestra la suma de componentes del vector n, es decir, 22 (= 4 + 5 + 6 + 7) usando una notación muy compacta: leer +/ como "más, más..." y un ligero cambio sería "multiply, over..."
 m  +/3+⍳4 m22
Estas operaciones se pueden combinar en una declaración, recordando que la APL evalúa las expresiones derecha a izquierda: primera 4 crea un array, [1,2,3,4], entonces 3 se añade a cada componente, que se resumen juntos y el resultado almacenado en variable m, finalmente mostrado.

En la notación matemática normal, es equivalente a: m=.. i=14()i+3){displaystyle displaystyle m=sum limits - ¿Qué?. Recuerda que las expresiones matemáticas no se leen ni evalúan de derecha a izquierda.

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 que no son 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, 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 la computación del Juego de la vida de Conway en una línea de código. 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.

Debido al juego de caracteres inusual, muchos programadores usan teclados especiales con cubiertas APL para escribir código APL. Aunque hay varias formas de escribir código APL usando solo caracteres ASCII, en la práctica casi nunca se hace. (Se puede pensar que esto respalda la tesis de Iverson sobre la notación como una herramienta de pensamiento). 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 juego de caracteres APL en una fuente personalizada.

Los defensores de APL afirman que los ejemplos del llamado código de solo escritura (mal escrito y código casi incomprensible) son casi invariablemente ejemplos de mala práctica de programación o errores de principiante, que pueden ocurrir en cualquier idioma. Los defensores también afirman que son mucho más productivos con APL que con los lenguajes informáticos más convencionales, y que el software funcional se puede implementar en mucho menos tiempo y con muchos menos programadores que con otras tecnologías.

También pueden afirmar que debido a que es compacto y conciso, APL se presta bien para el desarrollo y la complejidad de software a mayor escala, porque la cantidad 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 con los sistemas comerciales.

Terminología

APL hace una clara distinción entre funciones y operadores. 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 suma se obtiene aplicando el operador reducción a la función suma. Aplicando el mismo operador de reducción a la función máximo (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 integradas en el lenguaje y representadas por un símbolo, o una combinación fija de símbolos, como primitivos. 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, se considera que algunas primitivas no son ni funciones ni operadores, sobre todo asignación.

Algunas palabras utilizadas en la literatura APL tienen significados que difieren de los de las matemáticas y la generalidad de las ciencias de la computación.

Terminología de los operadores de APL
Término Descripción
función operación o mapeo que toma cero, uno (derecho) o dos argumentos (izquierda " derecha ") que pueden ser escalares, arrays o estructuras más complicadas, y puede devolver un resultado igualmente complejo. Una función puede ser:
  • Primitivo: incorporado y representado por un solo glifo;
  • Definido: como una colección nombrada y ordenada de declaraciones del programa;
  • Derivado: como una combinación de un operador con sus argumentos.
array data valued objeto de cero o más dimensiones ortogonales en el orden de mayor fila en el que cada elemento es un datum scalar primitivo u otro array.
niladic no tomar o exigir ningún argumento, nular
monadic requiriendo sólo un argumento; a la derecha para una función, a la izquierda para un operador, no
dyadic requerir tanto una izquierda como un argumento derecho, binario
ambivalente o monadic capaz de utilizar en un contexto monadic o dyadic, permitiendo que su argumento izquierdo se elimine
operador operación o mapeo que toma una función (izquierda) o dos (izquierda " derecha) o argumentos valorados de array (operands) y deriva una función. Un operador puede ser:
  • Primitivo: incorporado y representado por un solo glifo;
  • Definido: como una colección nombrada y ordenada de declaraciones del programa.

Sintaxis

APL tiene representaciones explícitas de funciones, operadores y sintaxis, lo que proporciona una base para la declaración clara y explícita de las funciones extendidas en el lenguaje y las herramientas para experimentar con ellas.

Ejemplos

Hola mundo

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.

El mensaje 'Hola, mundo' la constante de cadena anterior se muestra, 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).

Exponenciació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 en algunos otros idiomas y 2**3 en FORTRAN y Python). Muchos idiomas usan * para representar la multiplicación, como en 2*3, pero APL elige usar 2×3. Sin embargo, si no se especifica ninguna base (como con la instrucció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. Sin embargo, APL asume que la base faltante es la constante e del logaritmo natural e interpreta *3 como 2.71828*3.

Estadísticas simples

Supongamos que X es una matriz de números. Entonces (+/X)÷⍴X da su promedio. Lectura de derecha a izquierda, ⍴ X da el número de elementos en X, y desde ÷ 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 proporciona la suma de los elementos de X. A partir de esto, la siguiente expresión calcula la desviación estándar:

()+/()X - ()+/X)X)*2)X)*0.5

Naturalmente, uno 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

Elige 6 números de lotería

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, garantizado de no repetición, y los muestra ordenados en orden ascendente:

x[x6?40]

Lo anterior hace mucho, de manera concisa, aunque puede parecer complejo para un nuevo APLer. Combina las siguientes funciones de APL (también llamadas primitivas y glifos):

  • El primero en ser ejecutado (APL ejecuta de la derecha a la izquierda) es función dyadic ? (Nombre deal cuando dyadic) que devuelve un vector que consiste en un número selecto (argumento izquierdo: 6 en este caso) de enteros aleatorios que van desde 1 a un máximo especificado (argumento derecho: 40 en este caso), que, si se dice máximo ≥ longitud vectorial, se garantiza que no se repita; por lo tanto, generar/crear 6 números aleatorios que van desde 1 a 40.
  • Este vector es entonces asignado ()) a la variable xPorque es necesario más tarde.
  • Este vector es entonces ordenados por clasificación en orden ascendente por un monadic función, que tiene como argumento correcto todo a la derecha de ella hasta el siguiente desequilibrado close-bracket o paréntesis. El resultado son los índices que pondrán su argumento en orden ascendente.
  • Luego la salida se utiliza para indexar la variable x, que salvamos antes para este propósito, seleccionando así sus artículos en ascendente secuencia.

Dado que no hay una 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 Haz eso.

? también tiene un equivalente monádico llamado roll, que simplemente devuelve un entero aleatorio entre 1 y su único operando [a la derecha], inclusive. Por lo tanto, un programa de juego de rol podría usar la expresión ?20 para lanzar un dado de veinte caras.

Números primos

La siguiente expresión encuentra todos los números primos de 1 a R. Tanto en el tiempo como en el espacio, la complejidad del cálculo es O()R2){displaystyle O(R^{2},!} (en Big O notation).

()~RR∘.×R)/R1R

Ejecutado de derecha a izquierda, esto significa:

  • Iota crea un vector que contiene enteros de 1 a R (si R= 6 al comienzo del programa, ⍳R es 1 2 3 4 5 6)
  • Suelta primer elemento de este vector ( función), es decir, 1. Así que... 1↓⍳R es 2 3 4 5 6
  • Set R al nuevo vector, asignación primitivo), es decir, 2 3 4 5 6
  • El / réplica el operador es dyadic (binario) y el intérprete primero evalúa su argumento izquierdo (totalmente entre paréntesis):
  • Generar producto exterior de R multiplicado por R, es decir, una matriz que es la tabla de multiplicación de R por R°.× operador), es decir,
4 6 8 10 12
6 9 12 15 18
8 12 16 20 24
10 15 20 25 30
12 18 24 30 36
  • Construir un vector de la misma longitud R con 1 en cada lugar donde el número correspondiente R está en la matriz del producto exterior (, inclusión o elemento o Epsilon operador), es decir, 0 0 1 0 1
  • Negación lógica (no) valores en el vector (cambiar ceros a uno y uno a ceros) (, lógica no o Tilde operador), es decir, 1 1 0 1 0
  • Seleccione los elementos R para el cual el elemento correspondiente es 1 ()/ réplica operador), es decir, 2 3 5

(Nota, esto supone que el origen de APL es 1, es decir, los índices comienzan con 1. APL se puede configurar para usar 0 como origen, de modo que ι6 sea 0 1 2 3 4 5, lo cual es conveniente para algunos cálculos).

Clasificación

La siguiente expresión ordena una lista de palabras almacenada en la matriz X según la longitud de la palabra:

X[X+.ل';]

Juego de la vida

La siguiente función 'vida', escrita en Dyalog APL, toma una matriz booleana y calcula la nueva generación de acuerdo con 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 un conocimiento avanzado de APL (como lo haría el mismo programa en muchos idiomas).

vida  {}.1  Alternativa. 3 4 = +/ + ̄1 0 1 ∘. ̄1 0 1 . }

Eliminación de etiquetas HTML

En el siguiente ejemplo, también Dyalog, la primera línea asigna un código HTML a una variable txt y luego usa una expresión APL para eliminar todas las etiquetas HTML (explicación):

 Txt"Seguido" Esto es lo que se hace texto. ' {} / ~{}Alternativa}' '} TxtEsto es subrayado texto.

Nombramiento

APL deriva su nombre de las iniciales del libro de Iverson Un lenguaje de programación, aunque 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 usa solo para implementaciones reales, comenzando con APL360.

Adin Falkoff acuñó el nombre en 1966 durante la implementación de APL360 en IBM:

Mientras caminaba por la oficina los tres estudiantes compartían, podía escuchar sonidos de un argumento. Me metí la cabeza en la puerta, y Eric me preguntó: "¿No es verdad que todos saben que la notación que usamos se llama APL?" Lamento tener que decepcionarlo confesando que nunca había oído que lo llamara así. ¿Dónde tenía la idea de que era bien conocido? ¿Y quién decidió llamarlo así? De hecho, ¿por qué tenía que llamarse algo? Un poco más tarde escuché cómo se llamaba. Cuando el esfuerzo de implementación comenzó en junio de 1966, el esfuerzo de documentación también comenzó. Supongo que cuando tuvieron que escribir sobre "lo", Falkoff e Iverson se dieron cuenta de que tendrían que dar "lo" un nombre. Probablemente hubo muchas sugerencias hechas en ese momento, pero he oído de sólo dos. Un grupo en SRA en Chicago que estaba desarrollando materiales de instrucción usando la notación estaba a favor del nombre "Mathlab". Esto no se puso al día. Otra sugerencia fue llamarlo "Mejor Matemática de Iverson" y luego dejar que la gente coincida con el acrónimo apropiado. Esto se consideró cara.

Luego un día Adin Falkoff entró en la oficina de Ken y escribió "A Programming Language" en el tablero, y debajo de él el acrónimo "APL". Así nació. Fue sólo una semana después de esto que Eric Iverson me hizo su pregunta, en un momento en que el nombre todavía no había encontrado su camino a las 13 millas hasta el Taconic Parkway de IBM Research a IBM Mohansic.

Eugene McDonnell,

APL ocasionalmente se reinterpreta como Lenguaje de programación de matrices o Lenguaje de procesamiento de matrices, lo que convierte a APL en un backrónimo.

British APL Association (BAPLA) bolsa portátil de conferencias.

Logotipo

Siempre ha habido cooperación entre los proveedores de APL, y las conferencias conjuntas se llevaron a cabo regularmente desde 1969 hasta 2010. En dichas conferencias, a menudo se entregaban productos de APL, con motivos de APL o una colección de logotipos de proveedores. Las manzanas eran comunes (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 el diseño de teclado APL clásico cuando se mantiene presionada la tecla modificadora APL y se escribe "APL&# 34;.

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, 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 comunitaria y múltiples rondas de comentarios, un logotipo fue elegido en mayo de 2022.

Usar

APL se utiliza para muchos fines, incluidas aplicaciones financieras y de seguros, inteligencia artificial, Redes neuronales y robótica. Se ha argumentado que APL es una herramienta de cálculo y no un lenguaje de programación; su naturaleza simbólica y sus capacidades de matriz lo han hecho popular entre los expertos en dominios y los científicos de datos que no tienen o requieren las habilidades de un programador de computadoras.

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 casas 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 de 1982 Tron. Últimamente, el simulador de navegación de Stormwind utiliza APL para implementar su lógica central, su interfaz con el middleware de canalización de representación y una parte importante de su motor de física.

Hoy, APL sigue en uso en una amplia gama de aplicaciones comerciales y científicas, por ejemplo gestión de inversiones, gestión de activos, cuidado de la salud, y perfiles de ADN, y por aficionados.

Implementaciones notables

AP360

La primera implementación de APL que utilizó símbolos APL reconocibles fue APL360, que se ejecutó en IBM System/360 y se completó en noviembre de 1966, aunque en ese momento se mantuvo en uso solo dentro de IBM. 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 otorgó "por su trabajo en el diseño e implementación de APL360, estableciendo nuevos estándares en simplicidad, eficiencia, confiabilidad y tiempo de respuesta para sistemas interactivos".

En 1975, la microcomputadora IBM 5100 ofreció APL360 como uno de los dos lenguajes interpretados basados en ROM incorporados para la computadora, completo con un teclado y una pantalla que admitían todos los símbolos especiales utilizados en el lenguaje.

Los desarrollos significativos de APL360 incluyeron 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 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.

AP1130

En 1968, APL1130 se convirtió en el primer sistema APL disponible públicamente, creado por IBM para IBM 1130. Se convirtió en el software de biblioteca tipo III de IBM más popular que lanzó IBM.

APL*Plus y Sharp APL

APL*Plus y Sharp APL son versiones de APL360 con extensiones adicionales orientadas a los negocios, como formato de datos y funciones para almacenar arreglos APL en archivos externos. Fueron desarrollados conjuntamente por dos empresas, empleando a varios miembros del equipo de desarrollo original de IBM APL360.

Las dos empresas eran I. P. Sharp Associates (IPSA), una empresa de servicios APL360 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 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 hechas para VAX 11, PC y UNIX, mientras que IPSA adoptó un enfoque diferente para 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 admitir Sharp APL y desarrolló Sharp APL en SAX (Sharp APL para Unix). A partir de 2018, 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.

APL2

APL2 fue una importante reimplementación 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). Todo el equipo de productos y servicios de APL2 recibió el premio Iverson en 2007.

En 2021, IBM vendió APL2 a Log-On Software, que desarrolla y vende el producto como Log-On APL2.

APLGOL

En 1972, APLGOL se lanzó como una versión experimental de APL que agregaba construcciones de lenguaje de programación estructurado 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. Fue implementado para Hewlett-Packard en 1977.

APL de diálogo

Dyalog APL fue lanzado por primera vez por la empresa británica Dyalog Ltd. en 1983 y, a partir de 2018, está disponible para las plataformas AIX, Linux (incluso en Raspberry Pi), macOS y Microsoft Windows. Se basa en APL2, con extensiones para admitir programación orientada a objetos, programación funcional y programación tácita. Las licencias son gratuitas para uso personal/no comercial.

En 1995, dos miembros del equipo de desarrollo, John Scholes y Peter Donnelly, recibieron el premio Iverson por su trabajo en el intérprete. Gitte Christensen y Morten Kromberg recibieron conjuntamente el Premio Iverson en 2016.

NARS2000

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 características 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).

APLX

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

GNU APL

GNU APL es una implementación gratuita 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 (incluso en Raspberry Pi), macOS, varios dialectos BSD y en Windows (ya sea usando Cygwin para soporte completo de todas sus funciones del sistema o como un binario nativo de Windows de 64 bits con algunas de sus funciones del sistema faltantes). GNU APL usa Unicode internamente y se puede programar. Fue escrito por Jürgen Sauermann.

Richard Stallman, fundador del Proyecto GNU, fue uno de los primeros en adoptar APL y lo usó para escribir un editor de texto cuando era estudiante de secundaria en el verano de 1969.

Interpretación y compilación de APL

APL es tradicionalmente un lenguaje interpretado, que tiene características de lenguaje como un tipo de variable débil que no se adapta bien a la compilación. Sin embargo, con los arreglos como su estructura de datos central, brinda oportunidades para aumentar el rendimiento a través del paralelismo, la computación paralela, las aplicaciones paralelas masivas y la integración a muy gran escala (VLSI), y desde el principio, APL se ha considerado un lenguaje de alto rendimiento. – 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 matriz internamente".

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:

Reconocimiento de modismos

La mayoría de los intérpretes de APL admiten el reconocimiento de modismos y evalúan modismos comunes como operaciones únicas. Por ejemplo, evaluando 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.

Código de bytes optimizado

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 será y, por lo tanto, debe realizar análisis, verificación de sintaxis, etc. en tiempo de ejecución. Sin embargo, en ciertas 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. El intérprete ejecutará el código de bytes cuando esté presente y cuando se cumplan las suposiciones que se hayan hecho. Dyalog APL incluye soporte para bytecode optimizado.

Compilación

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 es el Burroughs APL-700, que se lanzó alrededor de 1971. Para poder compilar APL, se deben imponer limitaciones de idioma. APEX es un compilador APL de investigación que fue escrito por Robert Bernecky y está disponible bajo la Licencia Pública GNU.

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 funciones secundarias y globales, pero el intérprete todavía se usa como una biblioteca de tiempo de ejecución y para ejecutar funciones que no cumplen los requisitos de compilación.

Estándares

APL ha sido estandarizado por el grupo de trabajo X3J10 del American National Standards Institute (ANSI), la Organización Internacional de Normalización (ISO) y la Comisión Electrotécnica Internacional (IEC), Comité Técnico Conjunto 1 de ISO/IEC, Subcomité 22, Grupo de Trabajo 3. El lenguaje APL se especifica en ISO 8485:1989 y el lenguaje APL extendido se especifica en ISO/IEC 13751:2001.

Contenido relacionado

Formato de texto enriquecido

El formato de texto enriquecido es un formato de archivo de documento patentado con especificaciones publicadas desarrollado por Microsoft Corporation desde...

Ventanas 95

Windows 95 es un sistema operativo orientado al consumidor desarrollado por Microsoft como parte de su familia de sistemas operativos Windows 9x. El primer...

Tecnología MOS 6502

La tecnología MOS 6502 es un 8 microprocesador de bits que fue diseñado por un pequeño equipo dirigido por Chuck Peddle para MOS Technology. El equipo de...
Más resultados...
Tamaño del texto:
Copiar