# APL

APL (que pren el nom del llibre A Programming Language) és un llenguatge de programació desenvolupat durant els anys 1960 per Kenneth Iverson. El seu tipus de dades central és el vector multidimensional. Utilitza una varietat molt gran de símbols gràfics per representar la majoria de funcions i operadors, i el resultat és un codi molt concís. Ha tingut una influència important en el desenvolupament del modelatge de conceptes, els fulls de càlcul, la programació funcional, i els paquets informàtics de matemàtiques. També ha estat la inspiració d'alguns altres llenguatges de programació. Encara s'utilitza avui en dia per algunes aplicacions.

## Característiques

A diferència dels llenguatges de programació d'estructura tradicional, el codi APL s'estructura típicament com a cadenes de funcions monàdiques o diàdiques, i operadors que actuen sobre vectors. APL té moltes primitives no estàndard (funcions i operadors) que s'indiquen amb un únic símbol o amb una combinació d'alguns símbols. Totes les primitives es defineixen amb la mateixa precedència, i sempre s'associen cap a la dreta; per tant, APL es llegeix o s'entén millor de dreta a esquerra.
Les primeres implementacions d'APL (cap a 1970) no tenien estructures de control de flux per bucles, com ara "do" o "mentre", ni construccions "si-llavors-sinó". En comptes d'això, utilitzaven operacions amb vectors; a més, sovint no era necessari utilitzar les eines de programació estructurada, perquè una operació es podia dur a terme sobre tot un vector amb una sola sentència. Per exemple, la funció iota (ι) pot substituir la iteració amb "per": ιN aplicat a un enter positiu escalar retorna un vector unidimensional, 1 2 3 ... N. Implementacions d'APL més recents inclouen estructures de control completes, i així es pot separar de forma clara i neta l'estructura de dades del flux de control del programa.
L'entorn APL s'anomena espai de treball (workspace). En un espai de treball, l'usuari pot definir-se programes i dades, és a dir, que els valors de les dades també existeixen fora del programa, i l'usuari també pot manipular les dades sense haver de definir un programa. En els exemples següents, l'intèrpret d'APL comença escrivint sis espais abans d'esperar la resposta de l'usuari. La sortida de l'intèrpret comença a la primera columna.
| n ← 4 5 6 7 | Assignar un vector de valors, {4 5 6 7}, a la variable n, una operació de creació d'un vector. Una expressió APL equivalent però més concisa seria n ← 3 + ⍳4. S'emmagatzemen múltiples valors al vector n, i l'operació es fa sense bucles formals ni control de flux. |
| n 4 5 6 7 | Mostrar els continguts de n, ara mateix una matriu o vector. |
| n+4 8 9 10 11 | Ara se suma 4 a tots els elements del vector n, creant un vector de 4 elements {8 9 10 11}. Com abans, l'intèrpret d'APL mostra el resultat perquè el valor de l'expressió no s'havia assignat a cap variable (amb un ←). |
| +/n 22 | APL mostra la suma dels components del vector n, és a dir 22 (= 4 + 5 + 6 + 7) utilitzant una notació molt compacta: +/ es llegeix com a "més, per tot..." i un lleuger canvi seria "multiplicar, per tot..." |
| m ← +/(3+⍳4) m 22 | Aquestes operacions es poden combinar en una sola sentència, recordant que APL avalua expressions de dreta a esquerra: primer ⍳4 crea un vector, [1,2,3,4], llavors se suma 3 a cada component, i després se sumen tots i el resultat s'emmagatzema a la variable m, que és la que es mostra finalment. En notació matemàtica convencional, és equivalent a: $\displaystyle m=\sum \limits _{i=1}^{4}(i+3)$. - recordeu que les expressions matemàtiques no es llegeixen de dreta a esquerra... |
L'usuari pot desar l'espai de treball amb tots els valors, programes, i estat d'execució.
APL és conegut per utilitzar un conjunt de símbols no-ASCII, que són una extensió de la notació tradicional aritmètica i algebraica. Tenir noms d'un sol caràcter per funcions vectorials SIMD és una manera amb què APL permet la formulació compacta d'algorismes per transformació de dades, com ara calcular el joc de la vida en una sola línia de codi. En gairebé totes les versions d'APL, és possible teòricament expressar qualsevol funció computable en una expressió, és a dir, en una sola línia de codi.
A causa del joc de caràcters poc habitual, molts programadors utilitzen teclats especials amb els símbols d'APL per programar-hi. Encara que hi ha diferents maneres d'escriure codi APL utilitzant només caràcters ASCII, a la pràctica no es fa gairebé mai. (Es pot pensar que això reforça la tesi d'Iverson sobre notació com a eina de pensament.) La majoria, si no totes les implementacions modernes utilitzen disposicions de teclat estàndard, amb correspondències especials o editors amb mètodes d'entrada per accedir als caràcters no-ASCII. Històricament, el tipus de lletra d'APL ha estat distintiu, amb caràcters alfabètics en majúscula i cursiva i nombres i símbols sense cursiva. La majoria de les distribucions continuen mostrant el joc de caràcters APL amb un tipus de lletra exclusiu.
D'altra banda, malgrat ser un llenguatge de tan alt nivell, també és capaç de manipular a escala de bits i té interfícies amb llenguatges de programació de baix nivell (C, assemblador, etc) mitjançant els anomenats processadors auxiliars.
Té la propietat que des d'una rutina es pot (en temps d'execució) crear, compilar i executar, unes altres, la qual cosa ho fa també molt apropiat per a l'elaboració automàtica de compiladors i intèrprets.
Algunes dificultats pràctiques radiquen que:
* Necessita adhesius (o marcar amb retolador permanent) en el teclat, per poder veure els operadors (símbols propis de APL) que s'assignen a cada tecla (poden re-definir-se per l'usuari quan i com agradi).
* Els programes escrits en APL són molt concisos i això pot fer que siguin prolixos de documentar i de comprendre per als principiants. No obstant això, per als iniciats, la seva brevetat i l'ordre d'execució (cada sentència sempre s'executa de dreta a esquerra), els facilita enormement el seu seguiment.
* En ser interpretat (en temps d'execució), la seva velocitat és típicament una mica més lenta que la de les aplicacions amb llenguatges de programació compilats. Per la qual cosa, avui dia, amb les grans velocitats dels processadors, no suposa un desavantatge apreciable, en la major part de les aplicacions. Per contra, facilita la seva prova i revisió interactiva immediata.
* Encara que existeix una versió lliure disponible al catàleg de la "Free Software Foundation", la majoria dels intèrprets o compiladors de APL, són de codi tancat i els seus usuaris no comparteixen el seu codi, la qual cosa impedeix que s'estengui el seu ús, al nivell que tenen altres llenguatges per fer càlculs aritmètics com Matlab, Mathematica, SAGE, Maxima, Octave entre d'altres.

## Exemples
### Hola, món

Així es fa el típic "Hola món":
És freqüent en APL que per disseny es defineixin accions predeterminades en alguns casos que donarien errors sintàctics a la majoria de llenguatges de programació.
En aquest cas, es mostra la cadena de text 'Hola, món', perquè l'acció predeterminada sobre qualsevol expressió per la qual no s'especifica cap acció explícita (com una assignació, o un pas de paràmetres a una funció) és mostrar-ne el contingut per pantalla.

### Exponenciació

Un altre exemple de la tendència d'APL a les accions predeterminades és que l'exponenciació s'escriu com a "2⋆3", que indica 2 elevat a la potència de 3 (això s'escriuria com a "2^3" en alguns altres llenguatges i "2**3" en FORTRAN y Python). No obstant, si no es dona la base (fent "⋆3" en APL, o "^3" en altres llenguatges), la majoria donarien un error sintàctic. En canvi, APL suposa que la base que manca és la constant del logaritme natural e (2.71828....) i, per tant, interpreta "⋆3" com a "2.71828⋆3".

### Triar 6 números de la loto

La següent expressió genera el típic conjunt de 6 números de la loto: sis enters pseudoaleatoris entre 1 i 40, sense repetir-se, i els mostra en ordre ascendent:
El codi anterior fa moltes coses, de forma molt concisa, encara que sembla complex per un principiant. Combina les següents funcions d'APL (també anomenades primitives i glifs):
* El primer que s'executa (APL s'executa de dreta a esquerra) és la funció diàdica "?" (anomenada deal (en català, repartir cartes) quan és diàdica) que retorna un vector que consisteix un nombre donat (l'argument de l'esquerra: en l'exemple, 6) d'enters aleatoris entre 1 i un màxim especificat (l'argument de la dreta: en aquest cas, 40), que, si el màxim ≥ longitud del vector, es garanteix que no es repetiran; així, es generen 6 enters aleatoris entre 1 i 40.
* Llavors, aquest vector s'assigna (←) a la variable x, perquè després es necessitarà.
* El vector s'ordena en ordre ascendent amb una funció monàdica "⍋", que té com a argument tot el que té a la seva dreta, fins al proper claudàtor de tancament no equilibrat. El resultat de ⍋ són els índexs que posaran el seu argument en ordre ascendent.
* Llavors la sortida de ⍋ s'aplica a la variable x, que havíem desat abans, i posa els elements de x en seqüència ascendent.
Com que no hi ha cap més funció a l'esquerra de l'x de més a l'esquerra que li digui a APL què n'ha de fer del resultat, simplement el treu per la pantalla (en una sola línia, separat per espais), sense que calgui cap instrucció concreta per fer-ho.
"?" també té un equivalent monàdic que s'anomena roll (en català, llançar un dau), que simplement retorna un únic enter aleatori entre 1 i l'únic argument (que va a la dreta), ambdós inclosos. Així, un joc de rol podria utilitzar l'expressió "?20" per tirar un dau de vint cares.

### Nombres primers

L'expressió següent troba tots els nombres primers entre 1 i R. La complexitat del càlcul, tant en temps com en espai, és de $O(R^{2})\,\!$ (en notació d'O gran).
Executant-se de dreta a esquerra, vol dir:
* Iota ι crea un vector que conté enters entre 1 i R (si R = 6 al principi del programa, ιR és 1 2 3 4 5 6)
* Drop (llençar) el primer element d'aquest vector (funció ↓), és a dir 1. Per tant, 1↓ιR és 2 3 4 5 6
* Set (assignar) R al nou vector (←, primitiva assignació), és a dir 2 3 4 5 6
* L'operador de reducció / és diàdic (binari) i l'intèrpret comença avaluant l'argument esquerre (tot entre parèntesis):
* Generar el producte exterior de R multiplicat per R, és a dir, una matriu que és la taula de multiplicar de R per R (operador °.×), és a dir
| 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 mateixa llargada que R amb un 1 a cada posició on el nombre corresponent en R és en la matriu del producte exterior (operador ∈, inclusió en conjunt o element de o èpsilon), és a dir 0 0 1 0 1
* Fer la negació lògica (not) dels valors del vector (canviar zeros per uns i uns per zeros) (∼, no lògic o operador Titlla), és a dir 1 1 0 1 0
* Seleccionar els elements de R per als quals l'element corresponent és 1 (operador / de reducció), és a dir 2 3 5
(Nota, això suposa que l'origen d'APL és 1, és a dir, que els índexs comencen amb 1. APL es pot configurar perquè utilitzi zero com a origen, i llavors ι6 és 0 1 2 3 4 5, que pot ser convenient per alguns càlculs).

### Ordenació

L'expressió següent ordena una llista de paraules emmagatzemada a la matriu X per llargada de paraula:

### Joc de la vida

La següent funció "life", escrita en Dyalog APL, agafa una matriu booleana i calcula la nova generació del joc de la vida. Demostra la potència d'APL per implementar un algorisme complex amb molt poc codi, però també és molt difícil de seguir sense tenir un coneixement avançat d'APL.

### Treure tags HTML

En el següent exemple, també de Dyalog, la primera línia assigna codi HTML a una variable txt i després utilitza una expressió APL per treure'n tots els tags HTML:
Això retorna el text Això és text amb èmfasi.

## APL en la cultura popular

Com a curiositat, en la novel·la Cheap Complex Devices, de J. C. Sundman, l'autor afirma que el contingut del llibre ha estat escrit automàticament per un ordinador, usant codi generat en APL, la qual cosa li va valer el premi Douglas R. Hofstadter, de creació de novel·les per ordinador, en 1997. Tot això, naturalment, és un artifici literari.

## Successors de l'APL

Kenneth Iverson, posteriorment, va liderar el desenvolupament d'un altre llenguatge de programació, presentat com el successor de APL, anomenat J. Una de les característiques particulars de J és el que s'ha donat a denominar programació funcional tàcita, en què es considera que, per expressar programes, no és necessari nomenar variables, ni paràmetres a funcions (Aquests conceptes de programació tàcita han estat incorporats al llenguatge Logo a la biblioteca LogoFE). En J, la varietat de les rutines (que en APL es diuen "operadors"), és molt major.

## Influència en altres llenguatges

John Backus, en la conferència que va donar en rebre el premi Turing, va presentar FP/FFP. FP és un llenguatge funcional i FFP són formes funcionals, que es van basar en el llenguatge aplicatiu APL. Un exemple de les formes funcionals en APL és l'operació redueix (op/vector), que redueix un vector aplicant l'operador. +/1 2 3 4 computa 1 + 2 + 3 + 4, en alguns llenguatges com alguns dialectes de Lisp es va conservar el nom redueix, que es va heretar a altres llenguatges funcionals.

## Referències

* ↑ Pike, Rob. «Hello Gophers», 24-04-2014. [Consulta: 11 març 2016].
* 1 2 «A Bibliography of APL and J». Jsoftware.com. [Consulta: 3 febrer 2010].
* 1 2 «Kx Systems — An Interview with Arthur Whitney — Jan 2004». Kx.com, 04-01-2004. Arxivat de l'original el 2009-04-04. [Consulta: 3 febrer 2010].
* 1 2 «The Growth of MatLab — Cleve Moler» (PDF). Arxivat de l'original el 2009-04-11. [Consulta: 3 febrer 2010].
* 1 2 «About Q'Nial». Nial.com. Arxivat de l'original el 2011-08-23. [Consulta: 3 febrer 2010].
* ↑ Rubinsteyn, Alex. New York University. Runtime Compilation of Array-Oriented Python Programs (tesi doctoral), 2014, p. 30. «APL directly inspired Speakeasy»
* ↑ «Wolfram Language Q&A». Wolfram Research. [Consulta: 7 desembre 2016].
* ↑ Iverson, Kenneth E. A Programming Language. Wiley, 1962. ISBN 0-471-43014-5.
* ↑ McIntyre, Donald B. «Language as an Intellectual Tool: From Hieroglyphics to APL». IBM Systems Journal, 30, 4, 1991, pàg. 554-581. Arxivat de l'original el 4 de març 2016. DOI: 10.1147/sj.304.0554 [Consulta: 9 gener 2015].
* ↑ «ACM Award Citation – John Backus. 1977». Awards.acm.org, 03-12-1924. Arxivat de l'original el 2008-02-12. [Consulta: 3 febrer 2010].
* ↑ «APLX version 4 – from the viewpoint of an experimental physicist. Vector 23.3». Vector.org.uk, 20-05-2008. Arxivat de l'original el 2010-01-25. [Consulta: 3 febrer 2010].
* ↑ Bergquist, Gary A. «The future of APL in the insurance world». ACM SIGAPL APL Quote Quad [New York, N.Y.], 30, 1, 1999, pàg. 16–21. DOI: 10.1145/347194.347203. ISSN: 0163-6006.
* ↑ «Operators». MicroAPL. [Consulta: 12 gener 2015].
* ↑ «Primitive Functions». [Consulta: 1r gener 2015].
* ↑ «The Workspace». [Consulta: 1r gener 2015].
* ↑ «example». Catpad.net. Arxivat de l'original el 2013-07-08. [Consulta: 17 juny 2013].
* ↑ «Entering APL Symbols». [Consulta: 1r gener 2015].
* ↑ Dickey, Lee, A list of APL Transliteration Schemes Arxivat 2006-09-29 a Wayback Machine., 1993
* ↑ Iverson K.E., "Notation as a Tool of Thought", Communications of the ACM, 23: 444-465 (August 1980).
* ↑ 'Hello World,' exemple de sessió d'usuari a YouTube: «Producing a standalone 'Hello World' program in APL». Dyalog-APLtrainer. [Consulta: 11 gener 2015].
* ↑ «APL Primitives». MicroAPL. [Consulta: 11 gener 2015].
* ↑ «APL Font - Extra APL Glyphs». NARS2000. [Consulta: 11 gener 2015].
* ↑ «Systematically Random Numbers». SIGAPL. [Consulta: 11 gener 2015].
* ↑ Explicació del codi de treure tags HTML
* ↑ «Notes on the source code». Arxivat de l'original el 2009-03-30. [Consulta: 2009].

## Enllaços externs

* APL - El meu Univers HACT Breu introducció en espanyol a les convencions sintàctiques del llenguatge i biografia de K. I. Iverson