APL (programspråk)

Från Wikipedia
Hoppa till: navigering, sök
För andra betydelser, se APL.

APL är en förkortning av "A Programming Language" och är ett tidigt programspråk ursprungligen utvecklat av Kenneth E. Iverson under dennes tid vid Harvard University och sedan vidareutvecklat av IBM. APL togs från början fram främst som ett redskap för att beskriva datorer och algoritmer, d.v.s. i första hand inte som ett programspråk och användes huvudsakligen inom forskning.[1] Notationen användes bl.a. för att beskriva arkitekturen för IBM System/360.[2] Detta var en avsevärt mer exakt och detaljerad beskrivning än den dittills existerande dokumentationen och flera problem som tidigare inte uppmärksammats tydliggjordes. Iverson tilldelades 1979 års "Turing Award" för sitt arbete.

Historik[redigera | redigera wikitext]

Iverson publicerade sin notation i en bok med titeln A programming Language 1962. 1964 implementerades en delmängd av notationen som ett programspråk.[1] I början på 1980-talet presenterade IBM en avsevärt generaliserad och utvidgad version som man kallade APL2. Fram till senare halvan av 1980-talet var IBM sedan den dominerande leverantören av implementationer av APL. I början på 1990-talet skapade flera mindre företag konkurrerande versioner av språket, bl.a. APL2000 av STSC och Dyalog APL av Dyalog Ltd och dessa versioner har sedan på olika sätt vidareutvecklat språket.

Iverson konstruerade en efterföljare till APL kallat "J" som endast utnyttjar ASCII. Även andra språk erbjuder funktionalitet liknande APL. "A+" är ett öppen källkod-programspråk med många kommandon identiska med APL:s.

Översikt[redigera | redigera wikitext]

APL har (och är ökänt för) en ovanlig, kraftfull och extremt kompakt syntax, starkt påverkad av matematisk notation. Koden konstrueras typiskt som en kedja av monadiska och dyadiska operatorer som verkar på mer eller mindre komplexa datastrukturer (arrayer). Deklarationer saknas i språket, och endast två sorters primitiva datatyper finns definierade, numeriska värden och text. APL var ett av de första programspråken (tillsammans med Lisp) som tillät rekursiva funktionsanrop, och p.g.a. de många och ovanliga operatorerna finns ingen definierad precedensordning mellan dessa. En kodrad interpreteras därför alltid från höger till vänster. Från början fanns inga kontrollstrukturer, som loopar, if-satser etc., definierade, utan behovet av dessa täcktes av speciella operatorer verkande på arrayer.

Språket är interpretativt, och programmeringen sker vanligtvis via en interaktiv dialog. APL använder en speciell teckenuppsättning och krävde från början ett speciellt tangentbord. Sedermera har det införts olika sätt att skriva APL-kod med utnyttjande av en vanlig ASCII-teckenuppsättning.

Skämtsamt har APL betecknats som ett "write-only"-språk vars kod var obegriplig även för den som skrivit den. Ibland gavs APL epitetet "A Problem Language" eller "Ape-Language". Ytterligare ett skämt-namn på 1970-talet var "Chinese BASIC", kanske för de många specialtecknen på tangentbordet, kanske för att APL i enklare programrader inte var svårare än BASIC. (Senare tillkom Chinese BASIC som namn på flera "riktiga" programspråk på kinesiska.)

Exempel[redigera | redigera wikitext]

Följande APL-program hittar alla primtal från 2 till 10:

\left(\sim R \in R \circ . \times R\right)/R \leftarrow 1 \downarrow \iota R \leftarrow 10

Detta är vad som händer (från höger till vänster):

  1. Variabeln R tilldelas värdet 10 ( tilldelnings-primitiven \leftarrow )
  2. En vektor med värdena från 1 till 10 skapas (funktionen \iota)
  3. Element nr 1 från vänster (händelsevis talet 1) i denna vektor tas bort (funktionen \downarrow )
  4. Den på så sätt reducerade vektorn tilldelas variabeln R. (tilldelnings-primitiven \leftarrow ). Observera att samma variabel kan tilldelas helt olika typer av data under programmets exekvering, i detta fallet först heltalet 10 och sedan vektorn (2,3,4,5,6,7,8,9,10)
  5. Till vänster om R står reduktionsfunktionen, / , med ett parentesuttryck ytterligare till vänster.
  6. Parentesen exekveras först. Beräkna ytterprodukten R multiplicerat med R, d.v.s. i detta fall en matris med 9 x 9 element där elementi j är Ri x Rj (ytterprodukts-funktionen  \circ . \times skapas med operatorn \circ . applicerad på funktionen \times)
  7. Skapa en vektor med samma längd som vektorn R, där elementet är 1 om ett element i R återfinns i ytterprodukts-matrisen, annars 0. I detta fall vektorn (0,0,1,0,1,0,1,1,1). ( "ingår i"-funktion \in )
  8. Invertera denna vektor, d.v.s. byt 0 mot 1 och 1 mot 0 ( negerings-funktionen \sim ). Parentesen innehåller nu en vektor med värdena (1,1,0,1,0,1,0,0,0).
  9. Nu till reduktionsfunktionen / (pkt. 5 ovan). Välj ut de element ur vektorn R där motsvarande element i den nyss skapade vektorn är lika med 1. Vi får vektorn (2,3,5,7)
  10. Skriv ut resultatet (automatisk funktion. Resultatet av varje rad i Ett APL-program skrivs ut om inte den sista operationen är tilldelnings-primitiven)

Referenser[redigera | redigera wikitext]

  • A programming Language, Kenneth E. Iversson, John Wiley and Sons Inc, 1962, ISBN 0-471-43014-5
  • Programmera i APL, av J. Bohman och C-E. Fröberg, Studentlitteratur, 1976, ISBN 91-44-13161-5

Noter[redigera | redigera wikitext]

  1. ^ [a b] A. D. Falkoff och K. E. Iverson (1973). ”The design of APL”. IBM Journal of Research and Development "17" (4): sid. 324-334. doi:10.1147/rd.174.0324. http://www.jsoftware.com/papers/APLDesign.htm. Läst 17 november 2013. 
  2. ^ Falkoff, A.D., Iverson, K.E. och Sussenguth, E.H. (1964). ”A formal description of SYSTEM/360”. IBM Systems Journal "3" (2): sid. 198 - 261. doi:10.1147/sj.32.0198. http://www.cs.trinity.edu/~jhowland/class.files.cs2321.html/falkoff.pdf. Läst 17 november 2013. 

Externa länkar[redigera | redigera wikitext]