Programmeren is een kunst en een kunde die computerhardware tot leven brengt. Hoe goed de hacker ook is, zonder programmeertaal is hij nergens. Daarom mag een overzicht van die talen in een dossier over programmeren niet ontbreken. Van Short Code tot C#: alle grote talen uit zestig jaar historie.
Vanaf hun ontstaan hebben computers instructies nodig gehad om een bepaalde taak te kunnen verrichten. Die instructies krijgen ze door middel van een programma, geschreven in een programmeertaal. Eind jaren ‘40, ten tijde van de Mark-familie van de US Navy (aan de Harvard Universiteit ontworpen door Grace Hopper en Howard Aiken) en de ENIAC van de Amerikaanse regering, bestaat die taal nog uit weinig meer dan handelingen die de operator op het schakelpaneel met snoeren en relais moet uitvoeren om de computer een bepaalde opdracht te laten uitvoeren.
Het begin…
De wiskundige John Von Neumann, werkzaam bij het Institute for Advanced Study is vooral geïntrigeerd door de reusachtige ENIAC, gebouwd in 1942 en in gebruik tot 1955, alom beschouwd als de eerste succesvolle elektronische digitale computer. In 1945 zet hij zich aan een abstracte wiskundige studie van computation en ontwikkelt twee concepten die aan de wieg hebben gestaan van het programmeren en programmeertalen. Het eerste theorema staat bekend als de shared-program technique en stelt dat de computerhardware simpel moet zijn; die zou niet voor elk programma handmatig met kabeltjes en relais opnieuw moeten worden geïnstrueerd. Complexe instructies moesten de eenvoudige hardware besturen, waardoor die veel sneller geherprogrammeerd kon worden.
Het tweede concept noemt Von Neumann conditional control transfer. Dat concept geeft aanleiding tot de notie van subroutines, kleine blokken code waartussen vrijelijk heen en weer gesprongen kan worden, in plaats van één set van stappen die de computer in chronologische volgorde moet zetten. De tweede notie die in het concept ligt opgesloten is dat computercode vertakkingen kan hebben, die gebaseerd zijn op logische beweringen met een IF – THEN karakter of een ‘loop’ kunnen vormen met een FOR-statement. De eerste logische stap dus op weg naar bibliotheken van blokken code die steeds weer herbruikbaar zijn.
Short Code
Een paar jaar na het baanbrekende werk van Von Neumann verschijnt in 1949 de eerste toepassing van zijn gedachtegoed in de vorm van Short Code. Weliswaar de eerste werkende programmeertaal ter wereld, maar de programmeur is genoodzaakt na het schrijven alle nullen en enen handmatig aan te brengen. Wat een van hen snedig doet opmerken dat de taal ondanks zijn naam toch nog goed was voor lange nachten. Grace Hopper schreef in 1951 de eerste compiler, die de leesbare statements automatisch omzette in binaire code voor de computer.
Fortran
In 1954 begint IBM aan de ontwikkeling van Fortran, een samentrekking van FORmula en TRANslator, dat beschouwd wordt als de eerste crossplatform programmeertaal. De eerste versie van de taal in gebruik voor wetenschappelijke berekeningen komt in 1957 beschikbaar. Fortran wordt statisch ingetikt, vervolgens gecompileerd en stuurt de computer aan met dwingende commands (imperative). Met zijn IF, DO en GOTO statements wordt met Fortran een enorme stap voorwaarts gezet. Ook de logische variabelen TRUE en FALSE vinden hun oorsprong in Fortran.
De eerste compiler van Fortran voor de IBM 704 is – vanaf 1954 – in drie jaar tijd ontwikkeld door een team onder leiding van John W. Backus. Vroege Fortran-programma’s worden geschreven op ponskaarten met een regellengte van 72 posities, het maximum dat een kaartlezer van de 704 kon lezen. Fortran is na de beginjaren voortdurend doorontwikkeld en is nog steeds in gebruik. In de loop der jaren komen nieuwe versies van de taal op de markt: Fortran II (1958), Fortran IV (1961), Fortran 66, Fortran 77 tot Fortran 2003 aan toe.
Cobol
Het fort van Fortran is het doorrekenen van grote aantallen getallen, maar het is aanmerkelijk zwakker in het afhandelen van I/O (input/output). Dat maakt de taal minder geschikt voor zakelijke computing dat vanaf 1959 van de grond begint te komen. Dit verklaart de komst in 1960 van Cobol, COmmon Business Oriented Language, vanaf de tekentafel opgezet als de taal voor zakenlieden. De enige toegestane datatypen zijn alfanumeriek: tekst of getallen. Die worden gegroepeerd in reeksen en records, zodat data beter georganiseerd is en makkelijker op te sporen. Cobol stamt af van Flowmatic, een taal die Grace Hopper in het midden van de jaren ’50 ontwikkelde voor de UNIVAC-I computer.
De ontwikkeling van Cobol is geïnitieerd door zes Amerikaanse computerfabrikanten op instigatie van het ministerie van defensie: Burroughs Corporation, IBM, Honeywell, RCA, Sperry Rand en Sylvania Electric Products. De eerste vergadering van de stuurgroep had in 1959 plaats in het Pentagon. Cobol is ontwikkeld in zes maanden tijd en kwam in de openbaarheid als Cobol 60. Ruim 45 jaar later is het nog steeds op grote schaal in gebruik, vooral op de mainframes van financiële instellingen, overheidsinstanties en grote multinationale ondernemingen.
Cobol heeft lange tijd te lijden gehad van een slechte reputatie als een ‘vervelende taal om geestloze dingen te doen op dinosaurusachtige mainframes’. De Nederlandse wiskundige Edsger Dijkstra, vader van het gestructureerd programmeren en in december 1999 door de Computable-lezers uitgeroepen tot Nederlandse it-persoonlijkheid van het (vorige) millennium is beroemd geworden met de volgende uitspraak: “Het gebruik van Cobol maakt het brein kreupel; lesgeven in Cobol dient derhalve beschouwd te worden als een misdaad.”
LISP en Algol
Tussen het geweld van de reuzen Fortran en Cobol spelen twee andere talen een veel geringere rol: LISP en Algol. LISP is vooral opmerkelijk omdat de taal heel anders is van structuur en syntax dan andere: de data bestaat uit lijsten en er is geen syntax-verschil tussen data en instructies. LISP wordt vooral gebruikt in het onderzoek naar kunstmatige intelligentie (AI). Algol-60 is vooral veel gebruikt in Europa. Het was de eerste taal die over een formele grammatica beschikte, BNF geheten. Algol is vooral bekend als de wortel van de boom waaraan veel beroemdere takken kwamen te hangen: Pascal, C, C++ en Java.
Pascal
Niklaus Wirth startte in 1968 met het ontwikkelen van Pascal, dat twee jaar later op de markt kwam. De taal is vernoemd naar de wiskundige en filosoof Blaise Pascal en gebaseerd op Algol. Het was oorspronkelijk bedoeld om studenten de fijne kneepjes te leren van gestructureerd programmeren. Delen van het oorspronkelijk Macintosh besturingssysteem van Apple zijn geschreven in Pascal en de assembly language van de Morola 68000, de chip in de vroege Macs. De eerste Pascal-compiler in Noord-Amerika is door Donald B. Gillies aan de University of Illinois gebouwd voor de wereldberoemde PDP-11 van Digital (DEC).
Pascal is tot een heel succesvolle taal uitgegroeid op basis van zijn features, zijn goede input/output en de solide mathematische mogelijkheden. Pascal verbetert ook het datatype ‘pointer’ en voegt het CASE-statement toe aan het bestaande arsenaal, waardoor instructies in een boomstructuur kunnen worden gezet. Hoewel Pascal dynamische variabelen ondersteunt met de commando’s NEW en DISPOSE werd het ontbreken van dynamische groepen van variabelen het begin van het einde voor deze taal.
C
C nam de rol van Pascal pijlsnel over. De taal werd in 1972 door Dennis Ritchie en Ken Thompson ontwikkeld in de Bell Labs in New Jersey en veroverde in de tweede helft van de jaren ’80 de wereld van de commerciële softwarebouw van besturingssystemen en applicaties. Uitgebreid gebruik van pointers in C en de snelheid en kracht van de taal (hoewel dat ten koste gaat van de leesbaarheid) maken dat Pascal snel verdrongen raakt. Ritchie en Thompson ontwikkelen C voor het programmeren van Unix, dat tegelijkertijd door hen ontwikkeld wordt.
Unix en C gaan hand in hand. Van Unix krijgt C vooruitstrevende features als dynamische variabelen, multitasking, afhandelen van interrupts, forking en sterke I/O. Daardoor zijn veel besturingssystemen in C geprogrammeerd: Unix, Windows, MacOS en Linux. C was buitengewoon populair in academische kringen en in het bedrijfsleven tot begin jaren negentig. De invloed van de wederzijdse beïnvloeding van Unix en C kan maar moeilijk overschat worden. Ook het web draaide in de eerste jaren op servers en clients die geschreven waren in C.
C++
In de late jaren ’70, begin jaren ’80 werd een nieuwe programmeermethode ontwikkeld: OOP, Object Oriented Programming. Objecten zijn stukjes data die door programmeurs verpakt en gemanipuleerd kunnen worden. Bjarne Stroustroup was wel gecharmeerd van OOP en ontwikkelde extensies op C die bekend staan als ‘C with Classes’. Daaruit groeide C++, dat in 1983 op de markt verscheen. C++ is ontworpen om de rauwe kracht van C te organiseren met behoud van de snelheid daarvan. Bovendien moest C++ draaien op verschillende typen computers.
De syntax van C++ lijkt erg op die van C; met extensies en extra sleutelwoorden worden klassen ondersteund, inheritance en andere OO features. C++ beschikt daarnaast over dynamic memory management, templates, exception handling en overloading. Om al die redenen wordt het beschouwd als een van de meest volwassen en meest geïmplementeerde objectgeoriënteerde talen. Een paar belangrijke zaken ontbreken echter, zoals concurrency, persistence en automatic garbage collection in het geheugen.
Java
Naast C++ heeft Java zich in de loop van de jaren negentig een plaats verworven in de wereld van de servers. Java is vanaf 1991 door James Gosling ontwikkeld bij Sun Microsystems, oorspronkelijk als eenvoudige, draagbare OO-taal om embedded programma’s te schrijven voor de set-top boxes van interactieve televisies. In 1994 keert het ontwikkelteam zijn aandacht naar het web. Java is objectgeoriënteerd en platformonafhankelijk. Het draait op elk platform dat over een JavaVirtualMachine beschikt. Ondanks alle hype zijn Java-applicaties en applets maar matig succesvol aan de clientzijde. Op de server is het echter mateloos populair. Suns J2EE enterprise model is uitgegroeid tot de de facto standaard voor applicatieservers.
Java heeft tamelijk te lijden gehad van de soms wat overdreven wijze waarop Sun Microsystems de regie wenste te behouden op de ontwikkeling en de distributie van de programmeertaal. Ook lieten de prestaties van de eerste generatie applets en JVM’s veel te wensen over. Java staat bekend als een bijzonder volledige en ‘schone’ taal, reden waarom het in universitaire kring bijzonder geliefd is geworden als lesmateriaal voor studenten als opvolger van Pascal.
Visual Basic
Visual Basic (VB) van Microsoft is vanaf 1991 op de markt. Het is een geavanceerd gestructureerd dialect van het aloude Basic en bedoeld voor applicatieontwikkeling. ‘Visual’ slaat op de ontwikkelomgeving. VB is bijzonder sterk in het op het scherm ontwikkelen van grafische interfaces voor eindgebruikers (gui’s), Windows interfaces, dialoogkaders en menu’s. Dergelijke gui-programma’s zijn eenvoudig te schrijven, reden voor de aanzienlijke populariteit van VB in de wereld van programmeurs en applicatieontwikkelaars.
C#
C# (uitgesproken als C-sharp) is een objectgeoriënteerde programmeertaal, ontwikkeld door Anders Hejlsberg van Microsoft als deel van het .NET-initiatief. Het is gebaseerd op C++ en heeft ook geleend van Visual Basic en Java. C# is onlosmakelijk verbonden met CLR (Common Language Runtime) waarop alle .NET-programma’s draaien. C# zag het licht in 2000 en is sinds 2003 een ISO-standaard (23270).
Perl, Dylan & Ruby
Een aantal kleinere talen als de scripting-taal Perl (1987), Dylan (in 1992 ontwikkeld door Apple Computer) en de OO-taal Ruby (1995) zijn populair onder Unix-gebruikers en bij de open-sourcegemeenschap. Perl wordt wel aangeduid als het ‘plakband van internet’ omdat het vaak gebruikt wordt als ‘engine’ voor een webinterface of in scripts die configuratiefiles modificeren. Kortom: ruim zestig jaar ontwikkeling om de kabels en relais van toen in te ruilen voor het plakband van nu.
De vijf generaties
Programmeertalen worden voor het gemak onderverdeeld in 5 generaties, net als bij gsm/umts aangeduid met 1G tot 5G.
1G
Een eerste generatie programmeertaal is een programmeertaal op machineniveau. De taal bestaat dus uit nullen en enen. Oorspronkelijk werd geen vertaler gebruikt om de taal te compileren of the ‘assemblen’. De taal werd in de machine ingevoerd via de relais op het frontpaneel. Voordeel is dat dergelijke code direct en dus heel snel en efficiënt wordt uitgevoerd door de cpu. 1G heeft ook nadelen: een langer leertraject, moeilijker te debuggen en een ingewikkelde afwikkeling van instructies die tijdelijk in het geheugen moeten worden opgeslagen.
Nu: Elke native-code compiler produceert ook nu nog steeds machinetaal vanuit Fortran, C, C++ of Pascal. Iets dergelijks geldt voor virtual machines: die vertalen just-in-time machine-taal uit de uniforme byte code.
2G
Een tweede generatie programmeertaal is een assembly-taal. De code is relatief eenvoudig lees- en schrijfbaar, maar moet geconverteerd worden alvorens op een computer te kunnen draaien. Die een-op-een omzetting naar binaire machinecode (1G) is specifiek voor een bepaalde processorfamilie of omgeving. Er is een snelheidsvoordeel, maar 2G vereist meer programmeerinspanning en leent zich moeilijk voor grote applicaties.
3G
Een derde generatie taal is ontworpen voor een makkelijker menselijk begrip. 3G werkt met benoembare variabelen. Fortran, Algol en Cobol zijn vroege voorbeelden van 3G, maar ook Basic, C, C++, Delphi en Java behoren daartoe. De meeste 3G-talen ondersteunen gestructureerd programmeren.
4G
Een vierde generatie taal is een programmeertaal ontworpen met een specifiek doel voor ogen, zoals bijvoorbeeld de ontwikkeling van zakelijke software. Deze talen ontstonden na de introductie van moderne, blokgestructureerde 3G-talen. Report generators, form generators en automatische data flow diagrammen behoren tot de 4G-talen.
5G
Vijfde generatie talen lossen problemen niet op door algoritmes geschreven door een programmeur, maar door beperkingen die in het programma vastliggen. De meeste constraint-based en logic programming talen behoren tot deze generatie. 5G-talen zijn ontworpen om de computer het probleem zelf te laten oplossen; de programmeur bekommert zich om het doel van het programma en de randvoorwaarden voor het systeem. 5G-talen als Prolog, OPS5 en Mercury worden vooral gebruikt bij het onderzoek naar kunstmatige intelligentie (AI).
‘Debuggen’ met en zonder mot
Een van de meest gebruikte termen bij het programmeren is ongetwijfeld ‘debuggen’. Een ‘bug’ is een fout in een computerprogramma, waardoor dat niet werkt als bedoeld of een incorrect resultaat produceert. Bugs zijn het gevolg van menselijke fouten of vergissingen in de broncode of in het ontwerp van het programma. Debuggen is het opsporen en verhelpen van die fouten. Grace Hopper, een van de grote (vrouwelijke) helden uit de beginjaren van de computer en het programmeren ontwierp in 1944 samen met Howard Aiken aan Harvard University de Mark-computers. Lawaaiige bakbeesten ter grootte van een fikse zaal met vijf ton buizen en relais en 800 kilometer kabel, bestaand uit ongeveer 760.000 onderdelen. De eerste uit de serie, de Mark I, was tot in 1959 in gebruik bij de US Navy voor het uitrekenen van de baan van granaten en andere ballistische berekeningen.
Op een dag in 1945, zo gaat het verhaal, was Hopper aan het werk op een Mark I in een stokoud gebouw van Harvard, dat tijdelijk in gebruik was. Een mot (een insect dus, ofwel in het Engels een bug) had zijn einde gevonden in de kaken van een relais, waardoor het programma vastliep dat Hopper aan het draaien was. Ze viste de dode mot uit de computer en plakte de bug in het logboek van de computer. Een legende was geboren.
Het heeft er echter alle schijn van dat het verhaal apocrief is. Het woord ‘bug’ was op dat moment al tientallen jaren opgenomen in het jargon van hardware ingenieurs om een mechanisch defect aan een machine mee aan te duiden. De beroemde wetenschapper en uitvinder Thomas Alva Edison gebruikte het al in een brief van 1878 in precies deze betekenis. Het was bovendien niet Hopper die het insect heeft gevonden, zoals ze overigens zelf al direct toegaf. Bovendien stond de kalender toen op 9 september 1947. Wat wel klopt was dat de mot een ereplaats kreeg in het logboek. De operators van de Mark II (nog een verschil, dus), bekend met de ingenieursdefinitie van een bug schreven er bij: “Eerste echte bug ooit gevonden.”