Gebruiker:Erik Baas/De geschiedenis van C++
Als je onmiddellijk wilt beginnen met studeren, kun je dit hoofdstuk overslaan, maar het kan zeker leerzaam zijn om de geschiedenis van C++ als programmeertaal te kennen. Soms zullen er misschien termen gebruikt worden die je niet kent of begrijpt, maar zodra we met de eigenlijke lessen beginnen zul je deze zeker heel snel begrijpen. Alvast veel succes met je studie van C++.
C++ is waarschijnlijk de belangrijkste programmeertaal die een programmeur kan leren. C++ is immers het centrale punt waarop alle moderne programmeertalen in meer of mindere mate gebaseerd zijn. Zijn syntax en ontwerpfilosofie vormen immers de basis van object-georiënteerd programmeren. Bovendien bepaalt C++ hiermee in grote mate de programmeervorm en ontwikkelingsmethode van toekomstige programmeertalen. Het beste voorbeeld hiervan is dat zowel Java als C# (C sharp) rechtstreekse afstammelingen van C++ zijn. C++ is ook een universele programmeertaal, daar het de taal is waarin programmeurs heden ten dage het overgrote deel van hun ideeën delen met anderen. Als je heden ten dage aanzien wilt hebben als een volwaardige en professionele programmeur, is een grondige kennis van C++ simpelweg een must. C++ kan beschouwd worden als de meest fundamentele en meest belangrijke programmeertaal voor professionele programmeurs. C++ is immers de toegangspoort tot zowat alle moderne programmeermethoden en -talen.
Vooraleer we onze studie van C++ aanvatten, is het zeker geen slecht idee om te weten hoe C++ past in de historische context van computertalen. Door te leren wat de aanleiding was om C++ te ontwerpen, de ontwerpfilosofie te begrijpen waar C++ voor staat, en de bagage dat C++ meekreeg van zijn voorgangers,kan je veel beter de vele innovatieve en unieke kenmerken appreciëren van C++. Met dit in het achterhoofd, kan je in dit hoofdstuk op beknopte wijze kennismaken met de geschiedenis van C++, zijn oorsprong, zijn relatie met zijn voorganger C, zijn gebruiken en de programmeerfilosofie welke C++ ondersteunt. Het plaatst C++ ook in perspectief ten overstaan van andere programmeertalen.
De oorsprong van C++
[bewerken]De geschiedenis van C++ begint met C. De reden daarvoor is eenvoudig: C++ werd immers gebouwd op de funderingen van C. C++ is in feite een superset van C, wat betekent dat in principe alle C++ compilers ook kunnen gebruikt worden om C programma's te compileren. Met superset wordt bedoeld dat C++ een uitgebreidere en verbeterde versie is van C, met toevoeging van de filosofie van object-georiënteerd programmeren (meer daarover verder in dit hoofdstuk). C++ bevat ook vele andere verbeteringen tegenover de C programmeertaal, waaronder een veel uitgebreidere set van routines (bibliotheken). Maar tezelfdertijd erfde C++ wel de geest en waardering van de C programmeertaal. Om C++ volledig te begrijpen en appreciëren, moet je het hoe en waarom dat schuilgaat achter C begrijpen.
De geboorte van C
[bewerken]De programmeertaal C bracht een schok teweeg doorheen de hele computerwereld. De impact hiervan mag zeker niet onderschat worden, daar het een fundamentele wijziging teweegbracht in de benadering en denkwijze over programmeren. C wordt door velen beschouwd als de eerste moderne programmeertaal. Vóór de creatie van C werden computertalen meestal 'slechts' ontworpen als academische studies of door bureaucratische commissies. De programmeertaal C is echter totaal anders, daar deze werd ontworpen, gebruikt en ontwikkeld door professionele programmeurs. Hierdoor weerspiegelde C de manier waarop deze programmeurs hun programmeertaken benaderden. De bouwblokken van C werden immers bedacht, getest en herbedacht door de mensen welke de programmeertaal ook echt gebruikten voor hun programmeertaken. Het resultaat van dit proces was een programmeertaal welke graag gebruikt werd door programmeurs. De programmeertaal C trok immers snel vele volgelingen aan welke soms zelfs een bijna religieuze aanbidding voor de taal hadden. Het is dan ook niet te verwonderen dat C snel een brede aanhang verwierf binnen de programmeergemeenschap. Kort gezegd, C is een programmeertaal welke werd ontworpen door en voor professionele programmeurs.
C werd bedacht en voor het eerst toegepast door Dennis Ritchie op een DEC PDP-11 computer, gebruikmakend van het UNIX besturingssysteem. De programmeertaal C is het resultaat van een ontwikkelingsproces dat begon met een oudere programmeertaal genaamd BCPL, welke werd ontworpen door Martin Richards. BCPL beïnvloedde een programmeertaal genaamd B, welke werd ontworpen door Ken Thompson, wat uiteindelijk leidde tot de ontwikkeling van de programmeertaal C in de jaren 70.
Gedurende vele jaren was de bedrijfsstandaard van C diegene welke geleverd werd met het Unix besturingssysteem. Deze standaard werd beschreven in The C Programming Language, geschreven door Brian Kernighan en Dennis Ritchie, uitgegeven door Prentice Hall in 1978. Maar door het feit dat er geen officiële standaard bestond van de programmeertaal C, ontstonden er verschillende interpretatie van diverse functies tussen de verschillende versies van C. Om dit probleem op te lossen, werd een commissie opgericht in de zomer van 1983 om te werken aan een ANSI (American National Standard Institute) standaard welke de definitieve standaard van C moest worden. Deze definitieve versie werd uiteindelijk pas in december 1989 goedgekeurd en het eerste exemplaar ervan werd publiekelijk beschikbaar begin 1990. Deze versie van de programmeertaal C wordt gewoonlijk C89 genoemd. Het is deze versie waarop C++ werd uitgebouwd.
Opmerking De C-standaard werd aangepast in 1999 en deze versie van C wordt gewoonlijk C99 genoemd. Deze versie bevat een aantal nieuwigheden, inclusief enkele welke geleend werden van C++, maar in het algemeen is deze versie compatibel met de originele C89 standaard. Op het moment van schrijven bestaat er geen algemeen beschikbare compiler die C99 ondersteunt, en is het nog steeds de C89-versie welke beschouwd wordt als de standaard voor de programmeertaal C. Bovendien is, zoals reeds gezegd, C89 de basis waarop C++ werd uitgebouwd. Misschien dat een toekomstige standaard van C++ de nieuwigheden van C99 zal bevatten, maar op dit moment maken deze geen deel uit van C++. |
Het is misschien moeilijk begrijpbaar, maar de programmeertaal C wordt vaak een midden-niveau computertaal genoemd. Midden-niveau heeft in dit geval zeker geen negatieve weerklank, want het betekent zeker niet dat de programmeertaal C minder krachtig, moeilijker te gebruiken of minder ontwikkeld zou zijn dan een zogenaamde hoog-niveau programmeertaal. Het betekent ook zeker niet dat het even moeilijk te leren en gebruiken zou zijn als assembleertaal. Assembleertaal of Assembler zoals het meestal genoemd wordt, is eenvoudigweg een symbolische weergave van de machinecode zoals deze rechtstreeks door de computer kan uitgevoerd worden. De programmeertaal C wordt aanzien als een midden-niveau programmeertaal omdat het elementen van hoog-niveau programmeertalen zoals Turbo Pascal, Modula-2 of Visual Basic, combineert met de kracht en functionaliteit van Assembler.
Vanuit theoretisch oogpunt, tracht een hoog-niveau programmeertaal aan de programmeur alles aan te bieden wat deze mogelijks nodig zou kunnen hebben. Een laag-niveau programmeertaal biedt niets meer aan dan rechtstreekse toegang tot de machinecode van je computer. Een midden-niveau programmeertaal bied de programmeur een degelijke commandoset aan, en laat hem van hieruit toe om zelf hoog-niveau procedures en functies te maken. Een midden-niveau programmeertaal bied de programmeur de ingebouwde kracht van een hoog-niveau programmeertaal aan, gecombineerd met de flexibiliteit van een laag-niveau programmeertaal. Doordat C een midden-niveau programmeertaal is, laat dit aan deze toe om bits, bytes en adressen te manipuleren, welke de basis bouwblokken zijn waarmee de computer werkt. Bijgevolg tracht de programmeertaal C niet om een hardwarematige gegevensbuffer te creëren vanuit je programma welke groter is dan strikt noodzakelijk. Bijvoorbeeld de grootte van een integer in C is rechtstreeks gerelateerd aan de woordgrootte van de CPU (Central Processing Unit). Geen nood als dit je nu nog als Chinees in de oren klinkt, het zal je tijdens het lezen van dit boek allemaal duidelijk worden.
De meeste high-level programmeertalen beschikken over ingebouwde opdrachten (keywords) voor het lezen en schrijven van bestanden. In C worden al deze procedures uitgevoerd via het aanroepen van bibliotheekfuncties en niet met ingebouwde keywords welke reeds door de programmeertaal zelf gedefinieerd werden. Deze aanpak verhoogt de flexibiliteit van de programmeertaal C. In C is het voor de programmeur noodzakelijk om zelf routines de definiëren voor het uitvoeren van hoog-niveau opdrachten. Deze routines worden functies genoemd, en zijn uiterst belangrijk in de programmeertaal C. Deze zogenaamde functies zijn immers de bouwblokken van zowel C als C++. Je kan immers eenvoudigweg een functiebibliotheek maken om diverse taken uit te voeren volgens de noodzaak van het programma dat je ontwerpt. Hierdoor kan je de programmeertaal C volledig aanpassen aan je persoonlijke noodzakelijkheden.
Er is nog een aspect van de programmeertaal C welke je goed moet begrijpen, omdat dit ook belangrijk is voor C++, namelijk dat C een gestructureerde programmeertaal is. Het meest uitgesproken kenmerk van een gestructureerde programmeertaal is dat het gebruik maakt van zogenaamde blokken. Zulk een blok is een groep van opdrachten welke op een logische wijze met elkaar verbonden zijn. Neem nu bijvoorbeeld het IF commando. Wat dit commande doet is momenteel nog niet echt belangrijk, maar eenvoudig gezegd voert dit commando een controle uit. Indien deze controle geslaagd is, zal het bv. 5 commando's uitvoeren (het aantal commando's is niet belangrijk). Indien deze commando's gegroepeerd kunnen worden als een zogenaamde onzichtbare eenheid (met andere woorden dat deze ergens anders in het programma samengebracht kunnen worden, waarna men ze vanuit het IF commando kan aanroepen), vormen deze 5 commando's een blok.
Een gestructureerde programmeertaal ondersteunt ook zogenaamde subroutines met het gebruik van lokale variabelen. Een lokale variabele is een variabele welke enkel binnen de subroutine waar deze gedefinieerd is kan gebruikt worden. Een gestructureerde programmeertaal ondersteunt eveneens diverse vormen van herhalingslussen, waaronder while, do-while en for. Echter het gebruikt van commando's zoals goto, is in principe verboden, of wordt op z'n minst sterk ontmoedigd. Dergelijke commando's worden in een gestructureerde programmeertaal beschouwd als een ongebruikelijke en ongewenste vorm van programmacontrole, zoals dit bijvoorbeeld bij BASIC of FORTRAN wel het geval is. Een gestructureerde programmeertaal laat tevens toe om commando's in te laten springen en vereist geen rechtlijnig concept, wat bijvoorbeeld in eerdere versies van FORTRAN wel het geval was.
Misschien wel het belangrijkste aspect van de programmeertaal C is dat deze je in principe geen strobreed in de weg zal leggen. De filosofie van C is dat de programmeur en niet de programmeertaal de baas is over het programma. Dit betekent dat de programmeertaal C je bijna letterlijk alles zal laten doen wat je maar wilt, zelfs als datgene wat je hem wilt laten doen onorthodox, hoogst ongebruikelijk of zelf uiterst verdacht is. De programmeertaal C geeft je bijna 100% controle over de computer. Uiteraard brengt deze haast ongelimiteerde vrijheid een grote verantwoordelijkheid met zich mee, welke jij als programmeur zult moeten dragen.
De noodzaak van C++
[bewerken]Gezien de voorafgaande uiteenzetting over de programmeertaal C, kan je je misschien afvragen waarom C++ gecreëerd werd. Aangezien C een succesvolle en uiterst bruikbare programmeertaal is, waarom is er dan de noodzaak voor een andere programmeertaal? Het antwoord hierop is gecompliceerdheid. Doorheen de geschiedenis van programmeren heeft de toenemende gecompliceerdheid van programma's de noodzaak gevoed om een betere manier te vinden om deze gecompliceerdheid te beheren. De programmeertaal C++ is het antwoord op deze noodzaak. Overweeg het volgende om deze samenhang beter te begrijpen. De benaderingswijze van programmeren is enorm veranderd sinds de uitvinding van de computer. De belangrijkste reden hiervoor is het feit dat men de groeiende complexiteit van programmeren moest kunnen herbergen. Bij de allereerste computers bijvoorbeeld, werden computers geprogrammeerd door het rechtstreeks ingeven van de binaire code via het frontpaneel van de computer. Zolang programma's slechts enkele honderden instructies lang waren, was dit een goede werkwijze. Door de steeds groter wordende programma's, werd assembleertaal (kortweg assembler) gecreëerd zodoende dat programmeurs overweg konden met grotere en meer complexe programma's. Hierdoor konden programmeurs gebruik maken van symbolische voorstellingen van de machine-instructies. Doordat programma's steeds maar groter en complexer werden, werden hoog-niveau programmeertalen ontwikkeld om programmeurs de mogelijkheid te bieden om de steeds complexer wordende programma's goed te kunnen beheren.
De eerste wijdverspreide programmeertaal was uiteraard FORTRAN. Hoewel FORTRAN een zeer indrukwekkende eerste stap was, kan men het bezwaarlijk een programmeertaal noemen waarmee men eenvoudig te begrijpen en duidelijke programma's kan creëren. In de zestiger jaren ontstond dan het concept van gestructureerd programmeren. Dit is de programmeermethode zoals deze ondersteund wordt door onder andere de programmeertaal C. Dankzij deze gestructureerde programmeertalen was het voor programmeurs voor het eerst mogelijk om aanzienlijk complexere programma's te creëren op een redelijk eenvoudige wijze. Maar zelfs door toepassing van gestructureerde programmeertalen, overtref de complexiteit en grootte van een programma op een bepaald moment dat wat een programmeur kan beheren. Tegen het einde van de zeventiger jaren waren diverse projecten dichtbij of op dit punt aanbeland. Om dit probleem op te lossen ontstond een nieuwe manier van programmeren genaamd Object-Oriented Programming (of kortweg OOP). Door gebruik te maken van OOP kon een programmeur veel grotere en complexere programma's beheren. Het probleem was echter dat de programmeertaal C geen ondersteuning aanbood voor object-georiënteerd programmeren. Het verlangen naar, en ook de uiteindelijke noodzaak naar een object-georiënteerde versie van C, leidde uiteindelijk tot het ontstaan van C++.
Dus hoewel de programmeertaal C de meest geliefde en meest gebruikte professionele programmeertaal ter wereld is, komt er een moment dat deze zijn limiet bereikt voor wat betreft het beheren van de complexiteit van een programma. Het doel van C++ is aan programmeurs de mogelijkheid bieden om deze barrière te doorbreken en hen in staat te stellen om steeds complexere en grotere programma's te beheren.
De geboorte van C++
[bewerken]Uit de noodzaak om programma's met een steeds groter wordende complexiteit te beheren werd C++ geboren. Het werd gecreëerd door Bjarne Stroustrup in 1979, die toen werkzaam was bij Bell Laboratories in Murray Hill, New Jersey. Oorspronkelijk noemde hij de nieuwe programmeertaal "C met klassen", maar in 1983 werd de naam gewijzigd naar C++. C++ bevat de programmeertaal C in zijn geheel. Zoals reeds eerder gezegd is C immers de fundering waarop C++ gebouwd werd. C++ bevat dus alle functies, attributen en voordelen van de programmeertaal C. Het volgt uiteraard ook de filosofie van C dat de programmeur en niet de programmeertaal de baas is. Het is belangrijk om goed te begrijpen dat C++ geen poging was en is om een nieuwe programmeertaal de creëren. C++ dient beschouwd te worden als een uitbreiding van een reeds zeer succesvolle programmeertaal.
De meeste dingen die Stroustrup toevoegde aan de programmeertaal C, werden ontworpen om het object-georienteerd programmeren te ondersteunen. In zijn essentie is C++ de object-georiënteerde versie van de programmeertaal C. Door te bouwen vanaf de funderingen van C, zorgde Stroustrup voor een eenvoudige migratie naar OOP. Immers, programmeurs dienden geen volledig nieuwe programmeertaal te leren. Het enige wat programeurs van C moesten doen, was eenvoudigweg enkele nieuwe functies aan te leren om gebruik te kunnen maken van de object-georiënteerde methodologie. Maar de programmeertaal C was niet de enige programmeertaal welke C++ beinvloedde. Stroustrup liet zich voor sommige van zijn object-georiënteerde functies inspireren door een andere object-georiënteerde taal, genaamd SIMULA67. Ten gevolge daarvan vertegenwoordigd C++ dus de samensmelting van twee totaal verschillende programmeermethoden. Het is om deze reden dat er over het algemeen niet over de uitvinding van C++ gesproken wordt, maar wel over de creatie van C++.
Toen Stroustrup C++ creëerde, wist hij dat het belangrijk was om de originele geest van de programmeertaal C te behouden, met inbegrip van zijn efficiëntie, flexibiliteit en filosofie. Maar tegelijkertijd voegde hij er de ondersteuning voor object-georiënteerd programmeren aan toe. Tot eenieders blijdschap werd zijn doel volledig bereikt. C++ biedt de programmeur nog steeds de vrijheid en de controle van de programmeertaal C aan, maar koppelt deze aan de kracht van objecten.