![]() | |
Tipus | array programming language (en) ![]() ![]() |
---|---|
Data de creació | 1966 ![]() |
Disseny | Kenneth E. Iverson ![]() |
Desenvolupador | Kenneth E. Iverson, IBM i Lawrence M. Breed ![]() |
Paradigma de programació | array programming (en) ![]() ![]() |
Ha influenciat | |
Etiqueta d'Stack Exchange | Etiqueta ![]() |
APL (que pren el nom del llibre A Programming Language)[8] é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[9] 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,[10] i els paquets informàtics de matemàtiques.[4] També ha estat la inspiració d'alguns altres llenguatges de programació.[2][3][5] Encara s'utilitza avui en dia per algunes aplicacions.[11][12]
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[13] que actuen sobre vectors.[14] 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.[15] 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: . - 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.[16] 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.[17] Encara que hi ha diferents maneres d'escriure codi APL utilitzant només caràcters ASCII,[18] 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.)[19] 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:
Així es fa el típic "Hola món":[20]
'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.
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
".
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:
x[⍋x←6?40]
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[21] i glifs):[22]
←
) a la variable x, perquè després es necessitarà.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.
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 (en notació d'O gran).
(~R∊R∘.×R)/R←1↓ιR
Executant-se de dreta a esquerra, vol dir:
ι
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
)↓
), és a dir 1
. Per tant, 1↓ιR
és 2 3 4 5 6
R
al nou vector (←
, primitiva assignació), és a dir 2 3 4 5 6
/
és diàdic (binari) i l'intèrpret comença avaluant l'argument esquerre (tot entre parèntesis):R
multiplicat per R
, és a dir, una matriu que és la taula de multiplicar de R per R (operador °.×
), és a dir4 | 6 | 8 | 10 | 12 |
6 | 9 | 12 | 15 | 18 |
8 | 12 | 16 | 20 | 24 |
10 | 15 | 20 | 25 | 30 |
12 | 18 | 24 | 30 | 36 |
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
∼
, no lògic o operador Titlla), és a dir 1 1 0 1 0
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).
L'expressió següent ordena una llista de paraules emmagatzemada a la matriu X per llargada de paraula:
X[⍋X+.≠' ';]
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.
life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}
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:[24]
txt←'<html><body><p>Això és text <em>amb èmfasi</em>.</p></body></html>'
⎕←{⍵/⍨~{⍵∨≠\⍵}⍵∊'<>'}txt
Això retorna el text Això és text amb èmfasi.
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.[25] Tot això, naturalment, és un artifici literari.
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.
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.