|
|
De ontwikkeling van Algol speelde een belangrijke rol bij de totstandkoming van de informatica als academische discipline. Het voormalige Mathematisch Centrum Amsterdam, nu CWI, Centrum voor Wiskunde & Informatica was een toonaangevend instituut bij het ontwerpen van Algol 68, net zoals het dat in latere jaren was bij de ontwikkeling van Python. Om de positie van Algol 68 beter te begrijpen te midden van de tegenwoordige overvloed aan programmeertalen, moeten we hun ontwikkeling in ogenschouw nemen. Eerst geef ik een chronologisch overzicht van de periode 1950-1960, waarin een aantal programmeertalen tot stand kwam, vervolgens van de periode 1980-1990, waarin imperatieve talen zich consolideerden, en later van de recombinatie en verdere ontwikkeling van bestaande ideeën in de jaren negentig, en ten slotte van de huidige trends. Daarna wordt de specifieke geschiedenis van Algol 68 besproken, evenals de huidige positie ervan. U zult zich er natuurlijk van bewust zijn dat deze geschreven is vanuit het perspectief van een Algol 68-implementator.
In de periode 1950-1960 ontstonden er een aantal programmeertalen, waarvan de afstammelingen nog steeds op grote schaal worden gebruikt. De meest opvallende zijn Fortran van Backus e.a., Lisp van McCarthy e.a., Cobol van Hopper e.a. en Algol 60 van een commissie van Europese en Amerikaanse wetenschappers, waaronder Backus. Algol 60 was bijzonder invloedrijk voor het ontwerp van latere talen, aangezien het geneste blokstructuren, lexicale scope en een syntaxis in Backus-Naur-vorm (BNF) introduceerde. Bijna alle latere programmeertalen hebben een variant van BNF gebruikt om contextvrije syntaxis te beschrijven.
Ten tijde van de ontwikkeling van Algol 68 moesten programmeertalen twee doelen dienen. Ze moesten concepten en instructies bieden waarmee computerprocessen nauwkeurig en formeel konden worden beschreven en die de communicatie tussen programmeurs vergemakkelijkten, en ze moesten een middel zijn om kleine tot middelgrote problemen op te lossen zonder hulp van specialisten. De context van de ontwikkeling van Algol 68 wordt wellicht goed geïllustreerd door een citaat [1] van Edsger Dijkstra: The intrinsic difficulty of the programming task has never been refuted … I vividly remember from the late 60’s the tendency to blame the programming languages in use and to believe in all naivety that, once the proper way of communicating with the machines had been found, all programming ills would have been cured.
De vroege procedurele programmeertalen voldeden aan de doeleinden waarvoor ze waren ontwikkeld. De groeiende behoefte aan het bouwen van complexe interactieve systemen vroeg echter om een opsplitsing van een probleem in "natuurlijke" componenten, wat al in de jaren zestig leidde tot de opkomst van objectgeoriënteerde programmeertalen. Zowel het objectgeoriënteerde als het procedurele paradigma hebben hun sterke en zwakke punten, en het is niet altijd duidelijk welk paradigma het meest geschikt is voor bepaalde problemen. Bij numerieke en wetenschappelijke berekeningen bijvoorbeeld is het voordeel van objectgeoriënteerde talen ten opzichte van procedurele talen omstreden, aangezien bij intensieve rekenoperaties efficiëntie de hoogste prioriteit heeft. Dit laatste is waarschijnlijk een reden waarom softwarepakketten die zijn geprogrammeerd in Fortran vandaag de dag nog steeds in gebruik zijn, en dat bijvoorbeeld Python voor een aantal rekenintensieve taken oorspronkelijke Fortran pakketen gebruikt.
In de periode van 1960 tot 1980 ontstonden de meeste van de belangrijke taalparadigma's die tegenwoordig in gebruik zijn. Algol 68 werd bedacht als opvolger van Algol 60. De syntaxis en semantiek ervan werden nog orthogonaler en werden gedefinieerd door een Van Wijngaarden-grammatica, een formalisme dat speciaal voor dit doel was ontworpen. Simula van Nygaard en Dahl was een superset van Algol 60 die objectgeoriënteerd programmeren ondersteunde, terwijl Smalltalk van Kay, Ingalls en Kaehler een nieuw ontworpen objectgeoriënteerde taal was. C, de programmeertaal voor het Unix-systeem, werd tussen 1969 en 1973 door Ritchie en Thompson bij Bell Laboratories ontwikkeld. Prolog van Colmerauer, Roussel en Kowalski was de eerste logische programmeertaal. ML van Milner bouwde een polymorf typesysteem bovenop Lisp en was daarmee een pionier op het gebied van statisch getypeerde functionele programmeertalen. Elk van deze talen bracht een familie van afstammelingen voort, en de meeste moderne talen hebben ten minste één van deze talen in hun stamboom. Andere belangrijke talen die in deze periode werden ontwikkeld, zijn onder meer Pascal, Forth, Scheme en SQL.
In de jaren tachtig raakten imperatieve talen steeds meer ingeburgerd. Hoewel er geen grote nieuwe paradigma’s voor imperatieve talen opkwamen, bouwden veel onderzoekers voort op bestaande ideeën uit de jaren zeventig, zoals objectgeoriënteerd programmeren, en pasten ze deze aan aan nieuwe contexten, bijvoorbeeld aan gedistribueerde systemen. C++ combineerde objectgeoriënteerd programmeren met systeemprogrammeren. De Amerikaanse overheid stelde Ada vast als standaard voor systeemprogrammeertalen voor defensiecontractanten. Vooral in Japan werd veel aandacht besteed aan onderzoek naar zogenaamde programmeertalen van de vijfde generatie, waarin constructies uit de logische programmering waren verwerkt. De gemeenschap van functionele talen stelde ML en Lisp vast als standaard. In dit decennium begon het onderzoek naar Miranda, een functionele taal met "lazy" evaluatie. Een belangrijke trend in het taalontwerp van de jaren tachtig was de toegenomen focus op het programmeren van grootschalige systemen door middel van modules, wat tot uiting kwam in de ontwikkeling van Modula, Ada en ML. Enkele andere opmerkelijke talen uit de jaren tachtig zijn Objective C en Perl.
In de jaren negentig zetten de recombinatie en verdere ontwikkeling van bestaande ideeën zich voort. Een belangrijke drijfveer in deze periode was productiviteit. Er ontstonden veel talen voor snelle applicatieontwikkeling (RAD), die meestal voortkwamen uit oudere, doorgaans objectgeoriënteerde talen, die waren uitgerust met een IDE en garbage collection. Tot deze talen behoorden Object Pascal, Visual Basic en Java. Met name Java kreeg veel aandacht. Radicaler en innovatiever waren de nieuwe scripttalen. Deze waren niet direct afgeleid van andere talen en kenmerkten zich door een nieuwe syntaxis en een ruime integratie van functies. Velen beschouwen deze scripttalen als productiever dan RAD-talen, hoewel anderen aanvoeren dat scripttalen kleine programma's weliswaar eenvoudiger maken, maar dat grote programma's moeilijker te schrijven en te onderhouden zijn. Niettemin werden scripttalen de meest prominente talen die in verband met het internet werden gebruikt. Enkele belangrijke talen die in de jaren negentig werden ontwikkeld, zijn Haskell, Python en PHP.
Enkele actuele trends op het gebied van programmeertalen zijn mechanismen voor het controleren van beveiliging en betrouwbaarheid, alternatieve mechanismen voor modulariteit, componentgeoriënteerde softwareontwikkeling, constructies ter ondersteuning van gelijktijdige en gedistribueerde programmering, metaprogrammering en integratie met databases. In deze eeuw zijn tot nu toe onder andere C#, Visual Basic.NET en Go geïntroduceerd.
Algol, ALGOrithmic Language, is een familie van imperatieve programmeertalen die grote invloed heeft gehad op vele andere talen en bijna drie decennia lang de de facto standaard was voor het beschrijven van algoritmen in leerboeken en wetenschappelijke publicaties. De twee specificaties die relevant zijn voor deze publicatie zijn Algol 60, herzien in 1963, en Algol 68, herzien in 1976. Algol 58, oorspronkelijk bekend als IAL (International Algebraic Language), was een vroeg lid van de Algol-familie dat al snel werd vervangen door Algol 60. Algol 58 introduceerde een samengestelde instructie die uitsluitend beperkt was tot de controle-flow en geen verband hield met het lexicale bereik, zoals de blokken van Algol 60 dat wel doen.
Idealiter ondersteunt een programmeertaal de systematische uitdrukking van algoritmen door geschikte controlestructuren en gegevensstructuren aan te bieden, evenals een nauwkeurige, consistente formele definitie om verrassingen en portabiliteitsproblemen te voorkomen die voortvloeien uit implementatieafhankelijke details. Leden van de Algol-familie (Algol 60 en Algol 68, Simula, Pascal en ook Ada, …) worden beschouwd als redelijke benaderingen van dergelijke "ideale" talen, hoewel ze allemaal zowel sterke punten als nadelen hebben. Algol 68 biedt geschikte middelen voor abstractie en voorbeeldige controlestructuren die leiden tot een goed begrip van gestructureerd programmeren. De orthogonaliteit ervan resulteert in een zuinig gebruik van taalconstructies, waardoor het een prachtig middel is voor het programmeren.
Het ontwerp van Algol was stevig geworteld in de computing community, destijds een term voor de kleine maar groeiende groep computerprofessionals en wetenschappers. Deze vormde een internationaal platform voor discussies over programmeertalen, het bouwen van compilers, het ontwerpen van programma’s, enzovoort, en zo speelde Algol een belangrijke rol bij het vestigen van de informatica als een volwaardige academische discipline. Algol 60 werd ontworpen door en voor numerieke wiskundigen; in die tijd was het de Lingua Franca van de informatica. De taal introduceerde een blokstructuur met lexicale scope en een beknopte BNF-definitie die gewaardeerd werden door mensen met een wiskundige achtergrond, maar het ontbrak aan compilers en industriële ondersteuning, waardoor talen als Fortran en Cobol de overhand kregen. Om Algol te promoten, moest het toepassingsgebied ervan worden uitgebreid. IFIP [2] Werkgroep 2.1 Algoritmische Talen en Calculi (WG 2.1), die tot op de dag van vandaag verantwoordelijk blijft voor Algol 60 en Algol 68, nam de taak op zich om een opvolger voor Algol 60 te ontwikkelen.
In het begin van de jaren zestig besprak WG 2.1 deze opvolger en in 1965 werd er opgeroepen tot het indienen van beschrijvingen van een taal, Algol X, die op deze besprekingen was gebaseerd.
Dit resulteerde in diverse taalvoorstellen van Wirth, Seegmüller en Van Wijngaarden [3] en andere belangrijke bijdragen van Hoare en Naur.
Van Wijngaardens artikel Orthogonal design and description of a formal language [4] bevatte een nieuwe techniek voor ontwerp en definitie van een taal en vormde de basis voor wat zich zou ontwikkelen tot Algol 68.
Veel kenmerken van Algol 68 werden voor het eerst voorgesteld in
Referentie [5] geeft een verslag uit de eerste hand van de gebeurtenissen die hebben geleid tot Algol 68. Algol 68 heeft een grote invloed gehad op de ontwikkeling van programmeertalen, omdat het veel kwesties aan de orde stelde; bijvoorbeeld orthogonaliteit, een sterk typesysteem, procedures als typen, geheugenbeheer, de behandeling van arrays, een rigoureuze beschrijving van de syntaxis en parallelle verwerking, maar ook ideeën die door de jaren heen tot discussie hebben geleid, zoals contextgevoelige coercies en vrij ingewikkelde invoer- en uitvoeropmaak. Na diverse, blijkbaar levendige, bijeenkomsten had WG 2.1 geen unanieme instemming bereikt. Uiteindelijk werd Algol 68 ontwikkeld door die leden die een nieuwe mijlpaal in het taalontwerp wilden. Dijkstra, Hoare, Seegmüller en anderen schreven een kort "Minority Report" - eigenlijk meer een brief dan een rapport - waarin zij hun visie uiteenzetten over hoe de opvolger van Algol 60 eruit had moeten zien; vele jaren later werd opgemerkt dat geen enkele programmeertaal die sindsdien is ontwikkeld, aan die visie zou hebben voldaan. Weer anderen, bijvoorbeeld Wirth en Hoare, kozen ervoor om de ontwikkelingscyclus te verkorten door Algol 60 te verbeteren, wat uiteindelijk leidde tot Algol W en later Pascal.
De syntaxis van Algol 60 is in BNF-vorm, terwijl de syntaxis van Algol 68 wordt beschreven door een W-grammatica met twee niveaus (W voor Van Wijngaarden) waarmee een contextgevoelige grammatica kan worden gedefinieerd. Simpel gezegd: in een W-grammatica genereert met een grammatica op hoog niveau, een grammatica op laag niveaum voor alle correcte programma’s. Het concept van de contextgevoelige grammatica werd in de jaren vijftig door Chomsky geïntroduceerd om de syntaxis van natuurlijke taal te beschrijven, waarbij een woord al dan niet geschikt kan zijn op een bepaalde positie, afhankelijk van de context. Analoog hieraan definieert de Algol 68-syntax syntactische beperkingen; bijvoorbeeld door te eisen dat toegepaste identifiers of operatoren worden gedeclareerd (maar niet noodzakelijkerwijs voordat z worden toegepast), of door te eisen dat modi resulteren in eindige objecten die eindige coercion vereisen, enzovoort. Om onjuiste programma’s te weigeren, moet een contextvrije syntax, zoals die van C, worden aangevuld met extra regels die in natuurlijke taal zijn geformuleerd. De rigoureuze Algol 68-specificatie had een paar losse eindjes, terwijl de C-specificatie er een paar honderd had.
Waarschijnlijk vanwege het formele karakter van het herziene rapport, dat bestudering vereist om te begrijpen, is de misvatting ontstaan dat Algol 68 een complexe taal is. In werkelijkheid is de taal vrij eenvoudig, en de vermeende onduidelijkheid van de beschrijving wordt door de meesten die zich erin hebben verdiept, gerelativeerd [5]. Aangezien wordt gesteld dat de specificatie van veel hedendaagse talen, waaronder die van het moderne C, complexer is dan die van Algol 68 [6], kan men zich afvragen of deze laatste vijftig jaar geleden alleen maar complex leek.
Algol 68 werd vastgelegd in een formeel document, dat voor het eerst verscheen in januari 1969 en later werd gepubliceerd in Acta Informatica en ook verscheen in Sigplan Notices. In 1976 verscheen er een herzien rapport [7]. Algol 68 was de eerste grote programmeertaal waarvoor een volledige formele definitie werd opgesteld voordat deze werd geïmplementeerd. Hoewel het herziene rapport bekend staat als beknopt, bevat het toch humor solis sacerdotibus - om Koster uit [5] te citeren: The strict and sober syntax permits itself small puns, as well as a liberal use of portmanteau words. Transput is input or output. ’Stowed’ is the word for structured or rowed. Hipping is the coercion for the hop, skip and jump. MOID is MODE or void. All metanotions ending on ETY have an empty production. Just reading aloud certain lines of the syntax, slightly raising the voice for capitalized words, conveys a feeling of heroic and pagan fun (…) Such lines cannot be read or written with a straight face.
Algol 68 was ontworpen voor programmeurs, niet voor compilatorontwikkelaars, in een tijd waarin de compilatorontwikkeling nog niet zo ver gevorderd was als vandaag de dag. Pogingen tot implementatie op basis van formele methoden mislukten over het algemeen; de contextgevoelige grammatica van Algol 68 vereiste enige vindingrijkheid om te kunnen worden ontleed [8]. In die tijd werden compilers meestal door rekencentra op mainframes beschikbaar gesteld, wat wellicht verklaart waarom Algol 68 populair was in bepaalde plaatsen in plaats van in regio’s, bijvoorbeeld Amsterdam, Berlijn of Cambridge. Het was relatief populair in het Verenigd Koninkrijk, waar de ALGOL68R-, ALGOL68RS- en ALGOL68C-compilers werden ontwikkeld. Commerciële initiatieven waren relatief onsuccesvol; van de FLACC-compiler werden bijvoorbeeld slechts tweeëntwintig exemplaren verkocht [9].
De industrie heeft Algol 68 niet omarmd, op enkele uitzonderingen na. Er zijn hierover waarschijnlijk net zoveel meningen als er deskundigen zijn die je ernaar zou kunnen vragen. IBM wilde het niet ondersteunen (hoewel CDC dat wel deed, op verzoek van de academische wereld), het was niet zo snel als Fortran (maar had dat wel kunnen zijn), er was geen gemeenschap buiten de academische wereld, de implementaties bleven achter … Maar al te vaak moet de timing kloppen wil de omgeving openstaan voor acceptatie, en moet er adequate marketing zijn wil een innovatie een kans maken. Maar dit is slechts mijn bescheiden mening.
Toen de mainframes van de universiteiten werden uitgefaseerd, werden ook de compilers daarop buiten gebruik gesteld. Voor wetenschappelijk werk stapten velen in de jaren negentig over van mainframes naar werkstations waarop Algol 68 niet beschikbaar was. Toen ik in 1991 de academische wereld verliet, besloot ik zelf mijn eigen Algol 68-implementatie te schrijven, zodat ik ermee kon blijven programmeren.
Algol 68 heeft blijkbaar veel mensen beïnvloed die ermee in aanraking zijn gekomen, en dat doet het wellicht nog steeds. Sommigen vragen zich zelfs vandaag de dag nog af of het een toekomst zou hebben. Naar mijn mening is de wereld verder gegaan. Hoewel de taal in zijn tijd baanbrekend was, is de ontwikkeling ervan gestopt, waardoor het een afspiegeling gebleven is van het tijdperk waarin de taal werd ontwikkeld. Waarschijnlijk is er een nieuwere taal, zoals Python, die beter past bij uw moderne toepassingen op moderne infrastructuur, en die een grote gemeenschap heeft. Algol 68 zal deze achterstand niet meer inhalen en verdere ontwikkeling zou het waarschijnlijk tot een anachronisme maken. Aan de andere kant komt Algol 68 jonge mensen erg bekend voor, wat een bewijs is van de invloed die het heeft gehad op hoe we over programmeertalen denken.
Daarom zet het Algol 68 Genie project zich in voor het behoud van Algol 68, zowel vanuit educatief als vanuit wetenschappelijk-historisch oogpunt. Wie geïnteresseerd is in de taal kan deze bestuderen en daadwerkelijk gebruiken om de taal en de invloed die deze heeft gehad te begrijpen, en te ervaren hoe informatica en computergebruik er in de pioniersjaren, een halve eeuw geleden, uitzagen. Gezien de reacties op het project denk ik dat het redelijk is om te zeggen dat het in dit opzicht geslaagd is. Natuurlijk gebruiken mensen het ook om te programmeren, bijvoorbeeld in de numerieke wiskunde, zoals ik graag doe. Ondanks zijn leeftijd is Algol 68 zelfs vandaag de dag nog een prachtig middel om algoritmen te schrijven.
Notes
[1] Transcript van de keynote-lezing gehouden tijdens de ACM South Central Regional Conference van 1984. Bron: E. W. Dijkstra Archief – de manuscripten van Edsger W. Dijkstra.
[2] IFIP, de International Federation for Information Processing, is een overkoepelende organisatie voor nationale organisaties op het gebied van informatieverwerking. D e federatie werd in 1960 opgericht onder auspiciën van UNESCO.
[3] Adriaan van Wijngaarden (1916-1987) wordt door velen beschouwd als de grondlegger van de informatica in Nederland. Hij was medeoprichter van IFIP en een van de ontwerpers van Algol 60 en later Algol 68. Als voorzitter van de Algol 68-commissie leverde hij een belangrijke bijdrage aan het ontwerp, de definitie en de beschrijving van programmeertalen.
[4] A. van Wijngaarden, Orthogonal design and description of a formal language. Online beschikbaar via CWI.
[5] Proceedings, Conference on the history of Algol 68 [1993]. Online beschikbaar via CWI.
[6] K. Henney. Procedural Programming: It’s Back? It Never Went Away. Te bekijken op YouTube.
[7] A. van Wijngaarden et al., Revised report on the algorithmic language Algol 68 [1976]. Online beschikbaar via CWI, of in een HTML versie, of als deel van Learning Algol 68 Genie.
[8] B. Mailloux, On the implementation of Algol 68 [1968]. Online beschikbaar via CWI. Algol 68 Genie maakt gebruik van een multi-pass-methode om Algol 68 te parseren. Door declaraties vóór het parseren te extraheren, zoals voorgesteld door Mailloux, wordt de W-grammatica een LALR grammatica.
[9] Bron: Chris Thomson, voorheen bij Chion Corporation, op comp.lang.misc [1988].