Ohjelmiston helmiä: The Computer History Museum Historical Source Code Series
Ken Iverson Harvardin yliopistossa
Tuhansia ohjelmointikieliä keksittiin tietotekniikan aikakauden ensimmäisten 50 vuoden aikana. Monet niistä olivat samankaltaisia, ja monet seurasivat perinteistä, edeltäjiensä evoluutiopolkua.
Mutta joillakin vallankumouksellisilla kielillä oli kallistus, joka erotti ne yleiskäyttöisemmistä veljistään. LISP oli tarkoitettu listojen käsittelyyn. SNOBOL oli merkkijonojen käsittelyä varten. SIMSCRIPT oli simulointia varten. APL oli tarkoitettu matematiikkaan, ja siinä painotettiin matriisien käsittelyä.
Harvardin professori Kenneth E. Iverson keksi APL:n vuonna 1957 matemaattiseksi merkintätavaksi, ei tietokoneohjelmointikieleksi. Vaikka muitakin matriisipainotteisia symbolijärjestelmiä oli olemassa, kuten Einsteinin keksimä tiivis tensorimerkintätapa, ne oli suunnattu enemmän matemaattiseen analyysiin ja vähemmän algoritmien synteesiin. Iverson, joka oli Howard Aikenin oppilas, opetti Harvardin opiskelijoilleen algoritmien selittämiseksi niin sanottua ”Iversonin notaatiota”.
Iverson palkattiin IBM:lle vuonna 1960 työskentelemään yhdessä Adin Falkoffin ja muiden kanssa hänen notaationsa parissa. Nyt kuuluisaksi tulleessa kirjassaan ”A Programming Language” 1 vuodelta 1962 hän sanoo, että notaatio on tarkoitettu ”algoritmeiksi tai ohjelmiksi kutsuttujen proseduurien… kuvaamiseen” ja että se on kieli, koska siinä ”on huomattava syntaktinen rakenne”. Mutta siinä vaiheessa se oli vain merkintätapa, jota ihmiset voivat lukea, ei tietokoneiden ohjelmointikieli. Kirjassa annetaan monia esimerkkejä sen käytöstä sekä kuvailevana välineenä (esimerkiksi tietokoneiden käskykokonaisuuksien määrittelyn dokumentointiin) että keinona ilmaista yleisiä algoritmeja (esimerkiksi lajittelua ja hakua varten). Ennakoiden vastarintaa jotain näin uutta kohtaan, hän sanoo esipuheessa: ”Tämän kirjan keskeinen teesi on, että riittävän ohjelmointikielen kuvaileva ja analyyttinen voima korvaa runsaasti sen hallitsemiseen vaadittavan huomattavan vaivannäön”. Ehkä hän varoitti, että kielen hallitseminen ei ole triviaalia. Ehkä hän myös viestitti, että hänen mielestään muut merkintäkielet eivät olleet yhtä ”riittäviä”.
Työryhmä näki tietenkin pian, että merkintätapa voitiin muuttaa tietokoneiden ohjelmointikieleksi. Tämä kieli, jota kutsuttiin vuodesta 1966 alkaen APL:ksi, korosti joukkojen käsittelyä ja käytti epätavanomaisia symboleja. Se ei muistuttanut mitään muuta keksittyä tietokoneohjelmointikieltä.
APL:stä tuli suosittu, kun IBM esitteli ”APL360:n” System/360-pääkoneelleen. Toisin kuin useimmat muut kielet tuolloin, APL360 oli myös täydellinen interaktiivinen ohjelmointiympäristö. Ohjelmoija, joka istui sähkömekaanisen kirjoituskoneen ääressä, joka oli kytketty ajallisesti jaettuun tietokoneeseen, saattoi kirjoittaa APL-lauseita ja saada välittömän vastauksen. Ohjelmia voitiin määritellä, debugata, ajaa ja tallentaa tietokoneella, jota käytti samanaikaisesti kymmeniä muita ihmisiä.
Kokonaan 360-kokoonpanokielellä kirjoitettuna tämä APL-versio otti koko koneen hallintaansa. Se toteutti korkean tason kielen lisäksi täydellisen ajantasaisen käyttöjärjestelmän.
Tietokonehistoriallinen museo on IBM:n luvalla iloinen voidessaan antaa saataville System/360:lle tarkoitetun APL:n vuosien 1969-1972 ”XM6”-version lähdekoodin ei-kaupalliseen käyttöön.
Tekstitiedosto sisältää 37 567 riviä, jotka sisältävät koodia, makroja ja globaalimäärityksiä. 90 yksittäistä tiedostoa on erotettu toisistaan ’./ ADD”-komennoilla. Saadaksesi tämän materiaalin käyttöösi sinun on hyväksyttävä tässä näkyvän lisenssin ehdot, joka sallii vain ei-kaupallisen käytön eikä anna oikeutta lisensoida sitä kolmansille osapuolille julkaisemalla kopioita muualla verkossa.
Lataa APL360-lähdekoodi
Jürgen Winkelmann ETH:lla Zürichissä on tehnyt hämmästyttävää työtä muuttaessaan tämän lähdekoodin ajettavaksi järjestelmäksi. Lisätietoa löytyy MVT for APL Version 2.00.
Creating the APL Programming Language
Iversonin kirjassa ”A Programming Language” 1 käytetään graafista notaatiota, jota olisi ollut vaikea käyttää suoraan tietokoneiden ohjelmointikielenä. Hän piti sitä matriisialgebran laajennuksena ja käytti yleisiä matemaattisia typografisia konventioita, kuten ala- ja ylämerkkejä sekä merkkien painoon tai fonttiin perustuvia erotteluja. Tässä on esimerkiksi ohjelma numeroiden lajittelua varten:
Linearisoidakseen notaation käytettäväksi tietokoneiden ohjelmointikielenä näppäimistöllä kirjoitettuna APL:n toteuttajat joutuivat varmasti luopumaan merkittyjen nuolien käytöstä hallinnansiirtoihin. Mutta yksi piirre, jonka he pystyivät jossain määrin säilyttämään, oli erityisten symbolien käyttö primitiivisille funktioille, kuten tämä Huffman-koodeja luova ohjelma havainnollistaa:
APL käyttää symboleja, jotka ovat lähempänä tavallista matematiikkaa kuin ohjelmointia. Esimerkiksi jakamisen symboli on ÷, ei /. Epätavanomaisten symbolien tukemiseksi APL360 käytti räätälöityä näppäimistöä, jossa erikoismerkit olivat isoja kirjaimia.
APL360 käytti räätälöityä näppäimistöä
Erikoismerkkejä olikin enemmän kuin näppäimistölle mahtui, joten jotkin niistä kirjoitettiin yliviivaamalla kaksi merkkiä. Esimerkiksi ”grade up” -merkki ⍋, alkeisoperaattori, jota käytettiin lajittelussa, luotiin kirjoittamalla ∆ (shift H), sitten backspace ja sitten ∣ (shift M). Sekä isoille että pienille kirjaimille ei jäänyt tilaa, joten APL tuki vain isoja kirjaimia.
Ohjelmien tulostamista varten Iverson ja Falkoff saivat IBM:n suunnittelemaan erityisen kirjoituskuulan 1050- ja 2741-päätelaitteisiinsa, jotka käyttivät IBM:n Selectric-kirjoituskonemekanismia.
Ohjelmia voitiin nyt sekä kirjoittaa että tulostaa. Tässä on esimerkiksi tulostettu versio APL-kielen käsikirjaan 2 sisältyvästä ohjelmasta, joka laskee matriisin matemaattisen determinantin:
A Taste of APL
APL on ytimekäs korkean tason ohjelmointikieli, joka eroaa useimmista muista 1960-luvulla kehitetyistä ohjelmointikielistä monessa suhteessa:
Arvioinnin järjestys: APL:ssä lausekkeet arvioidaan oikealta vasemmalle, eikä funktiohierarkiaa ole. Esimerkiksi lausekkeen
2×4+3
kirjoittaminen saa tietokoneen kirjoittamaan välittömästi tuloksena olevan arvon
Arvo ei ole, kuten monissa muissa kielissä, joissa on operaattorien etusijajärjestys, 11. Suluilla voidaan tietysti ryhmitellä alilausekkeita evaluointijärjestyksen muuttamiseksi. Yleissääntö on, että minkä tahansa funktion oikea argumentti on sen oikealla puolella olevan lausekkeen arvo.
Vektoreiden ja matriisien automaattinen luominen: Korkeampiulotteinen rakenne luodaan automaattisesti evaluoimalla lauseke, joka palauttaa sen, ja skalaareja voidaan sekoittaa vapaasti. Esimerkiksi
A ← 2 + 1 2 3
luodaan vektori ”1 2 3”, lisätään siihen skalaari 2 ja luodaan muuttuja A pitämään sisällään vektoria, jonka arvo on
3 4 5
Muuttujia ei koskaan ilmoiteta, vaan ne luodaan automaattisesti, ja ne omaksuvat sen koon ja muodon, mikä lausekkeella niille annetaan.
Lukuisia primitiivejä: APL:ssä on runsaasti sisäänrakennettuja funktioita (ja ”operaattoreita”, joita sovelletaan funktioihin erilaisten funktioiden tuottamiseksi), jotka toimivat skalaareilla, vektoreilla, matriiseilla, jopa korkeampiulotteisilla objekteilla ja niiden yhdistelmillä. Esimerkiksi lauseke, jolla lasketaan yhteen edellä luodun vektorin ”A” luvut, on yksinkertaisesti
+/A
, jossa / on ”reduktio”-operaattori, joka saa aikaan sen, että vasemmalla olevaa funktiota sovelletaan peräkkäin kaikkiin oikealla olevan operandin alkioihin. Myös lausekkeessa, jolla lasketaan A:n lukujen keskiarvo, käytetään primitiivistä funktiota ρ määrittämään, kuinka monta elementtiä A:ssa on:
(+/A) ÷ ρA
Tässä on joitakin taulukoita vuoden 1970 ”APL360 User’s Manual” -julkaisusta 3, jotka antavat maistiaisen APL:n sisäänrakennettujen funktioiden ja operaattoreiden tehosta ja monimutkaisuudesta. (Klikkaa kuvia saadaksesi suuremmat versiot.)
APL rohkaisee ajattelemaan ohjelmoinnista toisin ja käyttämään tilapäisiä korkea-ulotteisia tietorakenteita väliarvoina, joita sitten pelkistetään tehokkaiden primitiivien avulla. Tunnettu esimerkki on seuraava lyhyt mutta täydellinen ohjelma, jolla lasketaan kaikki alkuluvut R:ään asti.
(~T∊T∘.×T)/T←1↓⍳R
Näin tämä lauseke arvioidaan:
kuutioilmaus |
merkitys |
arvo, jos R on 6 |
|||||||||||||||||||||||||
⍳R |
Luodaan lukuarvojen vektori 1:n ja R:n välillä. |
1 2 3 4 5 6 |
|||||||||||||||||||||||||
T←1↓ |
Pudota vektorin ensimmäinen alkio ja siirrä loput väliaikaiseen vektoriin T. |
2 3 4 4 5 6 |
|||||||||||||||||||||||||
T∘.×T |
Luo kertolaskun ulkotuote: taulukko, joka pitää sisällään tuloksen, joka on saatu kertomalla jokainen T:n alkio jokaisella T:n alkioilla. |
|
|||||||||||||||||||||||||
T∊ |
Käytä ”joukon jäsenyys”-operaattoria löytääksesi, mitkä T:n elementit ovat taulukossa. |
0 0 1 0 1 |
|||||||||||||||||||||||||
~ |
Negatiivista tulos selvittääksesi, mitkä T:n elementit eivät ole taulukossa. Nämä ovat ne kokonaisluvut, joiden kerrannaisia ei ole taulukossa. |
1 1 0 1 0 |
|||||||||||||||||||||||||
( )/T |
Valitaan ne T:n elementit, jotka olemme tunnistaneet. Nämä ovat kaikki alkuluvut, jotka ovat pienempiä kuin R. |
2 3 5 |
Huomaa, että tässä ohjelmassa ei ole silmukoita. APL-lausekkeiden tehon ansiosta ehdollisia haaroja ja silmukoita tarvitaan paljon harvemmin kuin perinteisemmissä ohjelmointikielissä.
APL-operaattoreita voidaan käyttää helposti kaikenlaisiin laskutoimituksiin, jotka tavallisesti vaatisivat silmukoita. Esimerkiksi lauseke, joka laskee vektorin X niiden elementtien lukumäärän, jotka ovat suurempia kuin 100, on
+/X>100
Se toimii, koska X>100 palauttaa 0:sta ja 1:stä koostuvan bittivektorin, joka osoittaa, mitkä X:n elementeistä ovat suurempia kuin 100, ja +/ laskee yhteen kaikki tuon vektorin bitit.
Mutta ehdollista suoritusprosessia ja silmukoita tarvitaan tietysti joskus. Strukturoidun ohjelmoinnin myöhemmän kehityksen valossa APL:n ainoa kontrollinsiirron alkeislaite, ”GO TO LINE x” -lause →, on erityisen heikko. Seuraavassa on esimerkki funktiosta, joka laskee kahden argumenttinsa suurimman yhteisen jakajan. Viimeinen lauseke luo silmukan haarautumalla alkuun. Rivillä 2 ehdollinen kontrollin siirto riville 0 saa funktion poistumaan ja palauttamaan arvon, joka on viimeksi annettu G:lle.
Kuinka 1960-luvun APL-kielestä voi lukea lisää, katso ”APL Language” -viiteopas 2 ja Paul Berryn vuonna 1969 ilmestynyt ”APL360 Primer” 4.
Kieli on tietenkin kehittynyt vuosien varrella, ja uudemmissa versioissa on mukana ohjausrakenteita, kuten IF-THEN-ELSE.
Miten APL toteutettiin
Ensimmäinen APL-notaation tietokonetoteutus oli FORTRAN-kielellä vuonna 1965 IBM:n 7090-pääkonetietokoneelle FORTRAN-kielellä kirjoitettu eräpohjainen kielen tulkki, jonka tekivät IBM:n tutkimuskeskuksessa Yorktown Heightsissa NY:ssä työskentelevä Larry Breed ja Stanfordin yliopistossa tuolloin jatko-opiskelijana työskennellyt Philip Abrams.
Ensimmäinen vuorovaikutteinen kieliversio kirjoitettiin vähän myöhemmin 7093:lle (virtuaalimuistia sisältävälle 7090:n kokeelliselle versiolle).Tekijöinä Larry Breed ja Roger Moore. Se toimi TSM-ajanjakojärjestelmän alla ja sitä kutsuttiin omituisesti nimellä ”IVSYS”, joka rimmaa 7090:n standardikäyttöjärjestelmän nimen ”IBSYS” kanssa. Vuonna 2012 lähetetyssä sähköpostiviestissä Breed sanoo,
IVSYS tarjosi sisäänkirjautumisen, uloskirjautumisen, välittömän suorituksen ja toimintojen määrittelyn; se tarjosi työtiloja, sekä aktiivisia että tallennettuja. Näiden toteuttaminen oli alkeellista; käytimme enimmäkseen sitä, mitä TSM-projekti tarjosi meille kirjautumiseen, uloskirjautumiseen ja tiedostojen tallentamiseen. Meillä oli vain muutama viikko aikaa käyttää 7093-järjestelmää, ennen kuin se poistettiin käytöstä, ja Roger ja minä aloimme suunnitella itsenäistä järjestelmää System/360:lle. Noiden viikkojen aikana Ken ja hänen ryhmänsä näkivät ensimmäistä kertaa, millaista suoritettava APL olisi.
Toinen toteutus kielen osajoukosta tehtiin vuonna 1967 IBM:n 1130-minitietokoneelle.
Ensimmäinen APL:n toteutus, joka sai laajaa käyttöä IBM:n ulkopuolella, oli IBM System/360:lle. Sitä kutsuttiin nimellä ”APL360”, ja se otettiin käyttöön ensimmäisenä IBM:n sisällä marraskuussa 1966. (Merkinnällä ”APL360″, koska backslash oli APL:n ”expansion”-operaattori, oli myös piilotettu merkitys: ”APL laajentaa 360″).
Breed sanoo juuri edeltävästä ajasta,
Tämä ajanjakso, alkuvuosi 1966, oli siirtymäkautta Iverson-notaatiosta APL:ään. (Itse asiassa Adin keksi ”APL:n” keväällä -66.) Kielen ja ympäristön hiominen ja laajentaminen jatkui monta vuotta. Kaupallista versiota varten ei lisätty juuri lainkaan koodia, vain paperityötä.
Elokuuhun 1968 mennessä APL360 oli IBM:n asiakkaiden saatavilla tukemattomana (”Type III”) ohjelmana IBM:n ”Contributed Program Library” -ohjelmakirjastossa 5. Pääasialliset toteuttajat olivat Larry Breed, Dick Lathwell ja Roger Moore; muita mukana olleita olivat Adin Falkoff ja Luther Woodrum.
Varhaisia APL:n kehittäjiä vasemmalta oikealle: Dick Lathwell, Ken Iverson, Roger Moore, Adin Falkoff, Phil Abrams, Larry Breed. Kuva on otettu noin vuonna 1983.
Apl-muuttujien dynaamisen luonteen vuoksi APL360 toteutettiin tulkkina, ei konekoodia tuottavana kääntäjänä. Ohjelmat tallennettiin sisäiseen muotoon, jota kutsuttiin ”codestringiksi” ja joka vastasi suoraan sitä, mitä käyttäjä oli kirjoittanut. Tulkki tutki koodiriviä ohjelman suorituksen aikana ja varasi ja muokkasi muuttujia dynaamisesti, kun lausekkeita arvioitiin.
APL360:n ensimmäiset versiot ottivat koko koneen hallintaansa. Se oli siis yhdistelmä käyttöjärjestelmää, tiedostojärjestelmää, ajanjakomonitoria, komentotulkkia ja ohjelmointikieltä. Koska keskusmuisti oli rajallinen, käyttäjän työtilat vaihdettiin tarpeen mukaan rummulle tai levylle. Suorituskyky oli vaikuttava, minkä Larry Breed selittää selkeässä ja ytimekkäässä kuvauksessaan toteutuksesta 6 kyvyllä räätälöidä käyttöjärjestelmä kielen vaatimusten mukaiseksi.
APL360 oli keskusteleva kieli, joka tarjosi nopean vasteen ja tehokkaan suorituksen jopa 50 samanaikaiselle käyttäjälle. Jokaisella käyttäjällä oli ”aktiivinen työtila”, jossa oli ohjelmia, muuttujia ja keskeytetyn ohjelman suorituksen tila. Järjestelmäkomennot, kuten ”)LOAD”, ”)SAVE” ja ”)COPY”, ylläpitivät käyttäjän tallennettujen työtilojen kirjastoa. Muilla järjestelmäkomennoilla ohjattiin kielen ominaisuuksia; esimerkiksi ”)ORIGIN”-komennolla ohjelmoija pystyi ohjaamaan, aloitetaanko vektoreiden ja matriisien numerointi 0:lla vai 1:llä.
APL oli ensimmäinen johdatus vuorovaikutteiseen aikajakoon monelle ohjelmoijasukupolvelle, joka oli kärsinyt panosohjelmoinnista reikäkorttien avulla.
Apl:n sovelluksia
Jopa ennen kuin siitä tuli tietokoneiden ohjelmointikieli Iversonin merkintätapa (Iverson notaatio) oli hyödyllinen kielenä, jolla voitiin dokumentoida algoritmeja ihmisiä varten. Klassinen esimerkki on uuden IBM System/360 -tietokoneen käskykanta-arkkitehtuurin muodollinen määrittely, joka julkaistiin Adin Falkoffin, Ken Iversonin ja Ed Sussenguthin artikkelissa IBM Systems Journal -lehdessä vuonna 1965 7.
Kuvaus, joka on pikemminkin muodollinen kuin verbaalinen, toteutetaan joukolla ohjelmia, jotka ovat vuorovaikutuksessa toistensa kanssa yhteisten muuttujien välityksellä ja joita käytetään aputaulukoiden kanssa… Vaikka muodollinen kuvaus on kattava ja itseriittoinen, tekstiä on annettu alkuopettelun avuksi.
Mutta paperissa annettu teksti on paljon muutakin. Se on rivikohtainen selitys muodollisesta kuvauksesta, mikä tarkoittaa, että se on myös osoitus ja selitys APL:n kuvailevasta voimasta.
Notaatiossa käytettiin Iversonin kirjassa olevaa graafista tyyliä kontrollinsiirroille. Tässä on esimerkiksi muistin käyttöoperaation kuvaus. (Klikkaa sitä suurentaaksesi.)
Juuri APL:n siirtyminen julkaisemiseen tarkoitetusta notaatiosta interaktiiviseksi tietokoneohjelmointikieleksi sai sen kukoistamaan. Kun APL360-toteutus oli saatavilla, IBM ja muut edistivät käyttöä tuottamalla erilaisia sovelluksia, kuten nämä:
- Starmap: Sarja APL-funktioita tähtien ja planeettojen sijainnin laskemiseen ja piirtämiseen. 8 9 Sen kirjoittivat vuonna 1973 IBM:n Paul Berry ja John Thorstensen, joka oli tuolloin Bryn Mawr Collegen tähtitieteen opiskelija ja nykyään Dartmouth Collegen fysiikan ja tähtitieteen professori. Se käyttää Keplerin yhtälöiden klassisia ratkaisuja tietylle päivämäärälle ja kellonajalle sekä sarjaa koordinaattien kiertoja osoittaakseen, missä planeetat ja tähdet näkyisivät taivaankulhossa.
- IBGS: Interaktiivinen yrityspelisimulaatio: ”Yleinen tietokonepohjainen liikkeenjohdon simulaatio, joka sisältää päätöksentekoa ja suunnittelua tuotannon, markkinoinnin ja rahoituksen toiminnallisilla alueilla.”
- Nollakohdat ja integraalit APL:ssä: ”Käyttämällä sekä klassisia menetelmiä, kuten Newtonin ja Mullerin menetelmiä, että hiljattain kehitettyjä menetelmiä, kuten Jenkinsin ja Traubin menetelmiä, se löytää reaalisen funktion reaaliset nollakohdat, reaaliset ja kompleksiset nollakohdat polynomille, jolla on reaalisia tai kompleksisia kertoimia, ja kompleksisen funktion kompleksiset nollakohdat.”
- Graphpak – Interaktiivinen grafiikkapaketti APL360:lle: ”…ominaisuuksia, jotka vaihtelevat grafiikkarajapinnan tuesta alimmalla tasolla useisiin sovellusalueisiin ylemmillä tasoilla… Piirtokomponentti… lineaarinen tai logaritminen… käyränsovitus… Kuvaileva geometriakomponentti sallii kolmiulotteisten objektien määrittelyn, skaalauksen, suurennuksen, käännöksen, kiertämisen ja projisoidun näyttämisen.”
- Graafit ja histogrammit APL:ssä: ”tuottaa käyriä ja pylväsdiagrammeja kirjoituskoneen päätelaitteella.”
- APL:n koordinaattigeometriajärjestelmä: ”ratkaisee koordinaattigeometriaongelmia interaktiivisesti päätelaitteella…maanmittareiden, rakennusinsinöörien, kaupunkisuunnittelijoiden käyttöön…”
- APL/PDTS – Programming Development Tracking System: ”…auttaa johtajia ja suunnittelijoita seuraamaan ohjelmointikehitysprojektien suorituskykyä suhteessa suunnitelmaan.” MINIPERT: ”A Critical Path Method (CPM) system for Project Management”
- APL Econometric Planning Language: ”Harjoittelevalle taloustieteilijälle, liike-elämän ennustajalle tai opettajalle tarjotaan helppokäyttöiset työkalut vuorovaikutteiseen mallien rakentamiseen ja mallien ratkaisemiseen.”
- APL Financial Planning System: ”antaa talousanalyytikon ja -suunnittelijan suunnitella raportteja, määritellä laskentalauseet, syöttää ja muuttaa tietoja ja saada tulostettuja raportteja välittömällä toimitusajalla.”
- APL Text Editor and Composer: ”Tämä ohjelma on suunniteltu käsittelemään tekstiä vuorovaikutteisesti päätelaitteessa…Mukana on toimintoja tekstin syöttämiseen, tarkistamiseen, laatimiseen, tulostamiseen ja tallentamiseen…käytettäväksi sihteereille, tiedemiehille, insinööreille, ylläpitäjille tai muille, jotka tuottavat papereita, kirjeitä, raportteja tai spesifikaatioita.”
Monissa näissä sovelluksissa korostettiin vuorovaikutteisuutta, mikä lisäsi tuottavuutta valtavasti tuolloin tyypillisimpään eräajotehtävien käsittelyyn nähden. Lisäksi APL:n avulla sovelluksia voitiin kehittää paljon nopeammin. Vuonna 2012 sähköpostitse, Larry Breed totesi,
Kaikilla aloilla, nopeus, jolla APL-ohjelmia voidaan kirjoittaa tekee siitä arvokkaan mallintamiseen ja prototyyppien … Yksi esimerkki: Noin vuonna 1973 Continental Can tarvitsi varastointijärjestelmän 21 tuotantolaitokselleen. FORTRAN-ohjelmoijaryhmä oli työskennellyt vuoden ajan, mutta menestystä ei ollut näkyvissä. Eräs STSC:n myyntimies rakensi yhdessä viikonlopussa käyttökelpoisen mallin APL Plus -ohjelmalla.
Alat, joilla APL:llä oli suurin levinneisyys, olivat tieteelliset, vakuutusmatemaattiset, tilastolliset ja taloudelliset sovellukset. Lisätietoja APL:n kehityksestä sen ensimmäisten 25 vuoden aikana on IBM System Journal 10:n vuoden 1991 erikoisnumerossa, jossa on 12 artikkelia ja yksi essee aiheesta.
APL:n ylistys ja kritiikki APL:ää ei alun perin suunniteltu ohjelmointikieleksi. Kuten Iverson sanoi,
APL:n kehittämisen alkuperäinen motiivi oli tarjota työkalu kirjoittamista ja opetusta varten. Vaikka APL:ää on hyödynnetty lähinnä kaupallisessa ohjelmoinnissa, uskon edelleen, että sen tärkein käyttötarkoitus on vielä hyödyntämättä: yksinkertaisena, täsmällisenä, suoritettavana notaationa monenlaisten oppiaineiden opetuksessa.11
Suurella määrällä ytimekkäitä ja epätavallisia symboleja APL-tietokoneohjelmissa, kuten sen innoittajina olleessa matemaattisessa notaatiossakin, on monien mielestä viehättävää ytimekkyyttä ja eleganssia. APL:llä on fanaattisia kannattajia. Alan Perlis (ensimmäinen ACM:n Turing-palkinnon saaja vuonna 1966) oli yksi heistä:
Silmän pyyhkäisy yhden lauseen yli voi paljastaa monimutkaisen, nerokkaan ja kauniin toiminnan ja hallinnan vuorovaikutuksen, joka muissa ohjelmointikielissä on havaittavissa vasta useiden tekstisivujen aikana. Silloin alkaa ymmärtää tyylin syntymisen ja merkityksen. 12
Monien mielestä APL:n ilmaisun vapaus on vapauttavaa.
Minulla oli tapana kuvailla APL:ää ”fasistiseksi ohjelmointikieleksi”, koska se on diktaattorimaisen jäykkä. …Jos Pascal on fasistinen, APL on anarkistinen. 13
Mutta APL-ohjelmat ovat usein kryptisiä ja vaikeasti purettavissa. Jotkut ovat vitsailleet, että se on ”vain kirjoittamiseen tarkoitettu kieli”, koska jopa ohjelman kirjoittajalla voi olla vaikeuksia ymmärtää sitä myöhemmin. Se inspiroi ohjelmointitemppuihin. On vaikea vastustaa haastetta kirjoittaa APL:llä ”yhden rivin ohjelma”, jolla toteutetaan täydellinen monimutkainen algoritmi. Tässä on esimerkiksi kaksi erilaista APL:n one-lineria, jotka toteuttavat versioita John Conwayn ”Game of Life” -ohjelmasta:
life←{1 ω∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂ω}
Ei selvästikään heikkohermoisille. Hollantilainen tietojenkäsittelytieteilijä Edsger Dijkstra sanoi,
APL on virhe, joka on toteutettu täydellisesti. Se on tulevaisuuden kieli menneisyyden ohjelmointitekniikoille: se luo uuden sukupolven koodauspummeja. 14
Mutta APL:n fanit sanoisivat, että kryptinen APL-koodaus on huono ohjelmointityyli, joka voi olla minkä tahansa kielen vaiva. APL tarjoaa rikkaamman paletin algoritmien ilmaisemiseen, väitetään, joten vaikeampia ongelmia voi ratkaista nopeammin ja vähemmällä merkityksettömällä syntaktisella sotkuisuudella.
Olipa näkemys mikä tahansa, APL ja sen innoittamat kielet, kuten APL2 ja J, ovat edelleen aktiivinen osa monipuolista ohjelmointikielten universumia.
Ken Iversonin lyhyt elämäkerta
Kenneth Eugene Iverson syntyi 17. joulukuuta 1920 maatilalla Camrosen lähellä Albertassa Kanadassa. Hän opiskeli maaseudulla yksiluokkaisissa kouluissa 9. luokan loppuun asti, jolloin hän jätti koulun kesken, koska oli laman huippu ja perheen maatilalla oli töitä. Myöhemmin hän sanoi, että ainoa tarkoitus jatkaa koulunkäyntiä olisi ollut ryhtyä opettajaksi, ja sitä ammattia hän ei todellakaan halunnut. Pitkien talvikuukausien aikana hän opiskeli laskutoimituksia omatoimisesti.
Hänet kutsuttiin armeijaan vuonna 1942, ja palvelusaikanaan hän suoritti sen verran kirjekursseja, että hän sai lukion lähes valmiiksi. Varusmiespalveluksen jälkeen hän suoritti kandidaatin tutkinnon sekä matematiikassa että fysiikassa Queen’s Universityssä Kingston Ontariossa ja sen jälkeen maisterin tutkinnon fysiikassa Harvardin yliopistossa. Vuonna 1954 hän väitteli tohtoriksi tietokonepioneeri Howard Aikenin johdolla aiheesta ”Machine Solutions of Linear Differential Equations: Applications to a Dynamic Economic Model”.
Valmistuttuaan tohtoriksi Iverson liittyi Harvardin tiedekuntaan opettajaksi Aikenin uuteen automaattiseen tietojenkäsittelyohjelmaan. Hän oli siellä vuoden ajan opettajana ja viisi vuotta apulaisprofessorina. Hän turhautui yhä enemmän tavanomaisten matemaattisten merkintätapojen riittämättömyyteen algoritmien ilmaisemiseen, joten hän alkoi keksiä omia merkintöjään.
Vuonna 1960 Iverson liittyi IBM:n uuteen tutkimuskeskukseen Yorktown Heightsissa, New Yorkissa, Frederick Brooksin neuvosta, joka oli ollut yksi Iversonin opetustovereista Harvardissa ja oli nyt IBM:ssä. He tekivät yhteistyötä uuden merkintätavan jatkokehityksessä. Vuonna 1962 Ken julkaisi nykyään klassisen kirjan ”A Programming Language” 1, jonka otsikko antoi APL-nimen notaatiolle, jota siihen asti oli epävirallisesti kutsuttu ”Iversonin notaatioksi”.
Iverson jatkoi APL:n kehitystyötä koko IBM:ssä toimikautensa ajan. Vuonna 1980 hän jätti IBM:n ja palasi Kanadaan työskentelemään I.P. Sharp Associatesille, joka oli perustanut APL:ään perustuvan timesharing-palvelun.
Vuonna 1987 hän ”jäi eläkkeelle palkkatyöstä” ja käänsi täyden huomionsa APL:n nykyaikaisemman murteen kehittämiseen. APL:ää käytettiin menestyksekkäästi kaupallisiin tarkoituksiin, mutta Iverson halusi kehittää uuden yksinkertaisen suoritettavan notaation, joka soveltuisi paremmin opetukseen ja joka olisi saatavilla edullisesti. Tämän kielen ensimmäinen toteutus, nimeltään J, julkistettiin APL90-käyttäjäkonferenssissa.
Iversonin kyky luoda tällaisia kieliä johtui hänen ”silkasta nautinnostaan kieltä ja sanoja kohtaan”, muistelee hänen tyttärensä Janet Cramer. ”Hän luki sanakirjoja kuin ihmiset romaaneja.” Iversonin mielestä oli tärkeää, että kieli, niin englannin kieli kuin matematiikkakin, kommunikoi selkeästi ja ytimekkäästi.
Yhteistyökumppaneidensa kanssa, joihin kuului myös hänen poikansa Eric, Iverson jatkoi J:n kehittämistä, ja hän jatkoi runsasta julkaisutoimintaa. Lauantaina 16. lokakuuta 2004 hän sai aivohalvauksen – työskennellessään J:n opetusohjelman parissa – ja kuoli kolme päivää myöhemmin 19. lokakuuta 83-vuotiaana.
Ken Iversonista on monia tarinoita. Tässä muutama:
Ken ei saanut virkaa Harvardissa. Hän toimi viisi vuotta apulaisprofessorina, ja tiedekunta päätti, ettei häntä ylennetä. Kysyin häneltä, mikä meni pieleen, ja hän sanoi: ”No, dekaani kutsui minut sisään ja sanoi: ’Ongelmana on se, ettet ole julkaissut mitään muuta kuin yhden pienen kirjan'”. Se yksi pieni kirja sai myöhemmin Turing-palkinnon. Mielestäni tämä on pikemminkin kommentti tavanomaisesta ajattelutavasta ylennysmenettelyissä kuin kommentti Kenistä; se on kommentti akateemisesta menettelystä ja Harvardista.
– Fred Brooks, A Celebration of Kenneth Iverson, 2004-11-30
Eräässä varhaisessa puheessa Ken selitti suvaitsevaisen vertailun etuja. Eräs yleisön jäsen kysyi epäuskoisena: ”Et kai tarkoita, että kun A=B ja B=C, A ei välttämättä ole sama kuin C?”. Ken vastasi hetkeäkään väliin jättämättä: ”Jokainen puuseppä tietää sen!” ja siirtyi seuraavaan kysymykseen.
– Paul Berry
Sosiaalisessa keskustelussa Kenin kanssa sanoin: ”Tiedätkö, Ken, sinä olet suosikkikielisuunnittelijani ja Don Knuth on suosikkiohjelmoijani”. Ja Ken sanoi heti: ”Mikä minun ohjelmoinnissani on vikana?”
– Joey Tuttle, A Celebration of Kenneth Iverson, 2004-11-30
Vuonna 1973 tai 1974 Ken ja minä pidimme puheen Kodakilla Rochesterissa 40-50 ohjelmoijan ryhmälle, joiden piti työskennellä PL/I:llä. Kyselytunnilla eräs ylempi toimihenkilö sanoi: ”Jos ymmärrän, mitä te puhutte, ehdotatte, että meidän pitäisi omaksua uusi ajattelutapa.” Ken hyppäsi ylös tuoliltaan ja sanoi: ”Kyllä! Juuri sitä minä tarkoitan!”.
– Joey Tuttle, A Celebration of Kenneth Iverson, 2004-11-30
Kiitokset
Kiitos Michael Karasickille, Yvonne Perkinsille, Steve Selbstille ja Ken Edwardsille IBM:ltä siitä, että he lopettivat kymmenen vuotta kestäneen odysseiani saadakseni luvan julkaista APL:n lähdekoodi. Kiitokset Curtis Jonesille, Larry Breedille, Paul Berrylle ja Roy Sykesille heidän kommenteistaan tämän artikkelin varhaiseen luonnokseen.
– Len Shustek
Bibliografia
- K. E. Iverson, A Programming Language, John Wiley and Sons, Inc., 1962.
- IBM, ”APL Language,” March 1975.
- IBM, ”APL360 User’s Manual,” maaliskuu 1970.
- IBM, Paul Berry, ”APL360 Primer – Student Text”, 1969.
- L. M. Breed ja R. H. Lathwell, ”APL360”, 1968.
- L. M. Breed ja R. H. Lathwell, ”The Implementation of APL360,” in ACM Symposium on Experimental Systems for Interactive Applied Mathematics, 1967.
- A. D. Falkoff, K. E. Iverson ja E. H. Sussenguth, ”A Formal Description of SYSTEM/360,” IBM Systems Journal, vol. 3, no. 3, s. 198-261, 1964.
- P. C. Berry ja J. R. Thorstensen, ”Starmap”, 1978.
- P. C. Berry ja J. R. Thorstensen, ”Starmap”, IBM Systems Development Division, 1975.
- IBM Systems Journal, vol. 30, no. 4, 1991.
- K. E. Iverson, ”A Personal View of APL,” IBM Systems Journal, vol. 30, no. 4, 1991.
- A. J. Perlis, ”In Praise of APL: A Language for Lyrical Programming”, SIAM News, kesäkuu 1977.
- B. McCormick, ”A Programming Language”, 2000,2002.
- E. W. Dijkstra, ”How Do We Tell Truths That Might Hurt?”, SIGPLAN Notices, vol. 17, no. 5, toukokuu 1982.
- A. D. Falkoff ja K. E. Iverson, ”The Design of APL,” IBM Journal of Research and Development, vol. 17, no. 4, 1973.
- A. D. Falkoff ja K. E. Iversion, ”The Evolution of APL,” SIGPLAN Notices, vol. 13, no. 8, pp. 45-57, elokuu 1978.
- L. Breed, ”How We Got to APL1130,” 10. toukokuuta 2004.
- ACM, ”Proceedings of the APL’69 Conference on APL,” SUNY Binghamton, NY, 1969.
- ”The Origins of APL – 1974”; hieno haastattelu APL:n alkuperäisten kehittäjien kanssa.
Historialliset lähdekoodijulkaisut
- MacPaintin ja QuickDrawin lähdekoodi, 18. heinäkuuta 2010
- APL-ohjelmointikielen lähdekoodi, 10. lokakuuta 2012
- Adobe Photoshopin lähdekoodi, 13. helmikuuta 2013
- Apple II DOS -lähdekoodi, 12. marraskuuta 2013
- Microsoft MS-DOS Early Source Code, 25. maaliskuuta 2014
- Microsoft Word for Windows Version 1.1a Lähdekoodi, 25.3.2014
- Early Digital Research CP/M Lähdekoodi, 1.10.2014
- Xerox Alto Lähdekoodi, 21.10.2014
- Electronic Arts DeluxePaint Early Lähdekoodi, 22.7.2015