Imperatieve programmeertaal
Een imperatieve programmeertaal is een programmeertaal waarin programma's opgesteld worden in de vorm van opdrachten die direct uitgevoerd kunnen worden door de onderliggende hardware.
Inhoud |
[bewerk] Berekeningsmodellen
Als een computer een programma uit moet voeren, dan doet de computer dat door achtereenvolgens de instructies uit te voeren die het programma voorschrijft. Dit werkt doordat beide (computer en programma) opgesteld zijn volgens hetzelfde concept van programmaverwerking – zij "denken" beide hetzelfde over hoe het programma uitgevoerd dient te worden.
In dit concept van uitvoering zijn twee termen belangrijk: de Turingmachine en de Von Neumann-cyclus.
[bewerk] Turingmachine en berekenbaarheid
De Turingmachine is een model van berekenen: de Turingmachine beschrijft in detail hoe een berekening uitgevoerd dient te worden. Met dit model in de hand wordt het mogelijk om na te gaan denken over zaken als
- Wat kan er precies berekend worden?
- Hoe moeilijk is het om iets te berekenen?
Het Turingmodel van berekenbaarheid bestaat uit twee onderdelen: een (oneindig) geheugen en een toestandsautomaat.
[bewerk] Geheugen
Het geheugen dient om alle relevante informatie over de berekening bij te houden: in het geheugen ligt opgeslagen wat er al gebeurd is en wat de uitkomsten waren, wat er nog behandeld dient te worden en in welke volgorde, en belangrijkst van alles: waar de berekening nu ("op dit moment") is, in welk stadium. Dit laatste wordt de toestand van de machine genoemd.
[bewerk] Toestandsautomaat
De toestandsautomaat voert de eigenlijke berekening uit, in kleine stapjes. De automaat bestaat in feite uit één grote serie beschrijvingen van de vorm "in deze toestand moet je deze stap zetten". Een hele berekening van de Turingmachine is dan een aaneenschakeling van veel van deze kleine stappen.
[bewerk] Von Neumann-cyclus en hardware
De Von Neumann-cyclus beschrijft hoe een computer in praktische zin zou kunnen werken, in termen van het ophalen en uitvoeren van één enkele instructie en dan doorgaan met de volgende instructie. Dit is de centrale gedachte achter de werking van vrijwel iedere, moderne computer.
[bewerk] Het imperatieve programma
Het imperatieve programma is een programma dat een berekening beschrijft volgens het Turingmodel: de gehele berekening valt uit elkaar in een lange serie kleine stappen die ieder op zich de toestand van de berekening een beetje aanpassen, totdat er uiteindelijk een compleet antwoord "uit komt rollen".
Het imperatieve programma doet dit door gebruik te maken van de architectuur van de onderliggende machine: het geheugen van de computer vormt het geheugen waarin de berekening en de toestand opgeslagen liggen, de processor wordt de toestandsautomaat. Iedere stap van de automaat past precies in één omloop van de Von Neumann-cyclus en heeft de vorm "beschouw de huidige toestand en mogelijke stappen om te zetten (instructie-fetch); beslis wat er nu precies moet gebeuren (instructie-decode); pas dat toe op de huidige toestand (instructie-execute); begin opnieuw".
Beschouwt men de code van een imperatief programma (dat zo genoemd wordt omdat het bestaat uit een serie opdrachten of bevelen), dan kan men deze structuur direct terugzien, bijvoorbeeld in het volgende stukje code in de programmeertaal C:
- ....
- c = 12 + 13;
- d = c;
- c++;
- ....
- printf("Hello, World!");
Dit zijn allemaal kleine opdrachten (simpele stappen) die door de onderliggende machine in volgorde uitgevoerd dienen te worden. Bovendien maken zij direct gebruik van de verdeling van het geheugen in kleine cellen – dat wil zeggen, zowel van het geheugenmodel van de Turingmachine als van de fysieke eigenschappen van de hardware in de computer – door deze cellen direct aan te spreken in termen van variabelen in het programma.
[bewerk] Onderscheid met andere soorten programmeertalen
Imperatieve talen zijn in hun vorm sterk verbonden aan het berekeningsmodel van Turing en de onderliggende hardware. Hierin onderscheiden zij zich van functionele programmeertalen, die het Churchmodel van functietoepassing gebruiken als model van berekening (zie ook Lambdacalculus). Ook onderscheiden de imperatieve talen zich van de logische programmeertalen, waarin het bewijsobject en de predicatencalculus als berekeningsmodel centraal staan.
De logische en functionele talen, die in vorm sterk afwijken van de imperatieve talen, staan bekend als de declaratieve paradigma.
Tenslotte is er veel onenigheid over de positie van object-georiënteerde programmeertalen in dit geheel; deze talen verdelen een berekening in verschillende onderdelen, waarbij ieder onderdeel de verantwoordelijkheid is van een op zichzelf staand programma-object. Deze objecten op zich worden intern echter weer opgesteld aan de hand van één (of meer) van de bovengenoemde modellen, dus de vraag blijft of dit model als iets geheel afzonderlijks gezien kan worden.