Programmeertaal
Een programmeertaal is een formele taal waarin de opdrachten die een computer moet uitvoeren, worden geschreven. Deze talen hebben een andere syntaxis en grammatica dan natuurlijke talen. Deze laatste zijn te complex en ambigu om als programmeertaal te fungeren. Code die in een programmeertaal geschreven is, dient maar op één manier te kunnen worden 'begrepen' door de computer.
Inhoud |
[bewerken] Programmeerparadigma
Er zijn in de loop der jaren duizenden[1] verschillende programmeertalen ontstaan en zij kunnen op verschillende manieren gecategoriseerd worden. Een veel gebruikt onderscheid is dat van programmeerparadigma. Enkele belangrijke voorbeelden zijn de gestructureerde, objectgeoriënteerde, imperatieve, functionele en logische programmeerparadigma's, waarbij vermeld moet worden dat programmeertalenen vaak elementen uit meerdere paradigma's implementeren.
[bewerken] Gebruik
Er zijn verschillende manieren waarop programma's door een computer uitgevoerd worden.
- direct: wanneer het programma is geschreven in de machinetaal van de betrokken computer, kunnen de instructies direct uitgevoerd worden. Het schrijven van machinetaal is echter zo omslachtig en tijdrovend dat het nooit gebeurt. In de praktijk wordt assembler gebruikt, die gecompileerd wordt.
- na compilatie: met behulp van een compiler voor de programmeertaal worden de instructies eerst alle omgezet in instructies in machinetaal die door de processor in de computer direct kunnen worden begrepen en uitgevoerd,
- via tussencode: met behulp van een compiler voor de programmeertaal worden de instructies omgezet in een tussencode (bytecode, ook wel P-code genoemd), een speciale interpreter voor die bytecode voert dan deze instructies uit.
- via een interpreter: een interpreter leest tekst van het programmeertaal in, interpreteert deze in termen van machinecode, en voert die code direct uit; soms begint de uitvoering al voordat de gehele tekst is ingelezen.
Een programma dat met een compiler wordt vertaald, kan over het algemeen sneller door de computer worden uitgevoerd, dan wanneer gebruikgemaakt wordt van een interpreter, aangezien een interpreter de opdrachten eerst nog moet omzetten naar machinetaal. Veel programmeertalen worden alleen met een compiler of alleen met een interpreter gebruikt; voor sommige bestaan zowel compilers als interpreters.
[bewerken] Definitie
Onder programmeertalen worden, in de normaal gebruikte definitie, talen verstaan die turingvolledig zijn. Dat wil zeggen dat het mogelijk moet zijn om in de programmeertaal een interpreter voor een Turingmachine te schrijven, en het moet mogelijk zijn een interpreter te schrijven voor de programmeertaal op een Turingmachine.
In een taal die niet Turingvolledig is, kan een kleiner aantal problemen opgelost worden dan in een Turingvolledige taal. In SQL kan men bijvoorbeeld wel totalen van tabellen met gegevens berekenen, maar men kan bijvoorbeeld niet berekenen wat de kortste route tussen twee punten in een graaf is.
[bewerken] Elementen
In de meeste talen worden sleutelwoorden (of keywords) gebruikt om opdrachten aan te geven. Deze woorden zijn eigenlijk altijd uit het Engels afkomstig. Ook in andere landen gebruikt een programmeur de Engelstalige sleutelwoorden. Veel programmeertalen komen niet alleen qua programmeerparadigma overeen, maar ook gedeeltelijk qua syntaxis en sleutelwoorden, zodat de kenner van een programmeertaal weinig moeite zal hebben met het leren van een verwante taal.
[bewerken] Enkele definities
- Een identifier is een door de gebruiker gekozen woord. Identifiers worden vooral gebruikt voor variabelen waaraan een waarde kan worden toegekend.
- Een expressie is een waarde die kan worden uitgerekend. Een eenvoudig getal is een expressie, maar
3+(5*A)ook. De schrijfwijze van expressies is in de meeste talen gelijk. - Een array is een aantal variabelen die samen een identifier hebben. Om een enkel element van een array te adresseren, moet een index worden opgegeven. De syntaxis is
arraynaam{index)ofarraynaam[index]. Bij BCPL wordt een uitroepteken gebruikt:arraynaam!index. Een array kan ook meerdere indices hebben, in dat geval worden die gescheiden door komma's:arraynaam[index1,index2](bij APL door puntkomma's, bij C is de schrijfwijzearraynaam[index1][index2]).
[bewerken] Getal
Getallen worden op de gebruikelijke wijze geschreven. Het decimaalteken is een punt. Er is geen scheidingsteken tussen duizendtallen.
Zeer grote en kleine getallen kunnen worden aangegeven met een macht van tien, zoals gebruikelijk in de wetenschap, en daarvoor wordt meestal de letter E gebruikt. Dus het getal 6,022 × 1023 wordt geschreven als 6.022E23.
In sommige talen kan men een ander talstelsel kiezen. Bij ieder getal moet worden aangegeven welk talstelsel wordt gebruikt (dat verschilt per taal). Een hexadecimaal getal kan, afhankelijk van de taal, worden genoteerd als 0xabcd of als 0abcdh. Let in het laatste geval op de voorafgaande nul, een getal moet altijd met een cijfer beginnen (wat met een letter begint is immers een identifier). In C begint een octaal getal met een nul, dus 15 is decimaal en 013 is octaal.
[bewerken] String
Een string is een reeks tekens die afgedrukt kan worden. Een string staat meestal tussen aanhalingstekens. Daaruit volgt dat het niet goed mogelijk is aanhalingstekens in een string op te nemen. De gebruikelijke oplossing daarvoor is dat men twee aanhalingstekens achter elkaar zet. In sommige talen geldt een string als eenheid, in andere is het een array van tekens, die dus geïndiceerd kan worden.
[bewerken] Blok
In moderne talen is het nodig statements te groeperen. Zo'n groep statements heet een blok of samengesteld statement en geldt zelf weer als een enkel statement. Het groeperen geschiedt met BEGIN en END. Andere talen gebruiken hiervoor geen woorden maar bijvoorbeeld { en }.
- Voor het groeperen in COBOL, zie hierboven, bij Label.
[bewerken] CALL
Bij een aanroep (call) van een subroutine (ook wel procedure of functie genoemd) wordt de naam van de subroutine gegeven, gevolgd door (meestal tussen haakjes) de parameters (ook wel argumenten genoemd). Zijn er geen parameters, dan zijn vaak wel de haakjes nodig. In sommige talen wordt een expliciet gereserveerd woord CALL voorgevoegd.
- In COBOL schrijft men
PERFORM sectie- of paragraafnaam THRU sectie- of paragraafnaam. Het woordjeTHRUbetekent tot en met en de uitvoering eindigt dan ook bij de eerste sectie of paragraaf ná de genoemde naam.
[bewerken] Imperatieve elementen
Bij imperatief programmeren is een programma is een samenstel van instructies wat de computer moet doen, waarbij aan geheugenlocaties of meer abstracte variabelen waarden worden toegewezen en uitgelezen. Zulke instructues worden samengesteld tot programma's met behulp van elementen die de control flow specificeren. De meeste programmeertalen veronderstellen of ondersteunen deze manier van werken; typische elementen in zulke talen zijn de volgende.
[bewerken] Toewijzing
In een toewijzing (assignment) krijgt een variabele een waarde. De schrijfwijze is meestal:
variabele=expressievariabele:=expressie
- Bij sommige talen (o.a. C en APL) kan een assignment ook midden in een expressie voorkomen.
- Bij COBOL zijn er andere mogelijkheden. Wordt er niets berekend, dan schrijft men
MOVE waarde TO variabele. Een eenvoudige berekening kan worden geschreven alsADD waarde TO variabele, met daarachter eventueelGIVING variabele. De meest algemene assignment luidtCOMPUTE variabele = expressie. - Bij sommige implementaties van BASIC wordt de assignment voorafgegaan door het woordje
LET.
[bewerken] IF
Na IF komen een voorwaarde en een statement dat voorwaardelijk uitgevoerd moet worden. Tussen de voorwaarde en het statement soms het woord THEN (ook wel eens DO). Na de voorwaardelijk uit te voeren statements komt eventueel ELSE gevolgd door een statement dat juist wordt uitgevoerd als niet aan de voorwaarde is voldaan.
- Bij Fortran schrijft men
IF (expressie) label1, label2, label3. Afhankelijk van de waarde van de expressie gaat de uitvoering van het programma verder bij een van de labels. - Bij sommige implementaties van BASIC schrijft men
IF expressie THEN regelnummer. Is aan de voorwaarde voldaan, dan gaat de uitvoering bij het opgegeven regelnummer verder. Let op het ontbreken vanGOTO. - In BCPL bestaan:
IFconditieTHENstatement1UNLESSconditieTHENstatement2TESTconditieTHENstatement1ELSEstatement2
[bewerken] SWITCH of CASE
Een IF-statement heeft steeds twee takken, de THEN-tak en de ELSE-tak. Is er een gecompliceerde keuze nodig, dan kan men vaak gebruikmaken van een SWITCH-statement (in andere talen CASE). er wordt een expressie genoemd en die wordt vergeleken met een aantal constanten om te bepalen welke tak moet worden uitgevoerd.
[bewerken] FOR
Na FOR (ook wel DO) komt een statement dat herhaaldelijk uitgevoerd moet worden (een iteratie). Er wordt een lopende variabele gegeven, met begin- en eindwaarde en stapgrootte. Deze constructie wordt meestal gebruikt voor herhalingen waarvan het aantal slagen tot een vooraf bepaalde grens is beperkt.
- In Fortran:
DO label variabele=beginwaarde, eindwaarde, stapgrootte. In tegenstelling tot bij modernere talen kan hierna een onbeperkt aantal statements volgen, het label wijst naar het laatste statement van de iteratie. (Bij moderne talen moeten de statements tot een enkel statement samengevoegd zijn, zie Blok.) - In PL/1:
DO variabele=beginwaarde TO eindwaarde BY stapgrootte - In Algol:
for variabele=beginwaarde to eindwaarde step stapgrootte do - In C:
for (beginassignment; testconditie; verhogingsexpressie)
[bewerken] FOR EACH
for each. Geeft een iteratie, een lopende variabele, en een enumeratie, dat wil zeggen, een object dat zelf al een standaardmethode definieert op iteratie over de waarden ervan mogelijk te maken. Het kan gaan om een al bepaalde collectie waarden (zoals een lijst of array), maar dat hoeft niet. Het belangrijke verschil met FOR is dat er geen volgnummer wordt gebruikt om de elementen af te lopen.
[bewerken] WHILE
WHILE. Ook dit is een iteratie, maar in plaats van een lopende variabele wordt een voorwaarde gegeven; de iteratie wordt uitgevoerd totdat niet meer aan de voorwaarde voldaan is. Dit wordt meestal gebruikt voor iteraties waarvan het aantal stappen op het moment van ingaan nog onbekend is.
- Bij sommige talen kan
FORmetWHILEgecombineerd worden, bijvoorbeeld in Algol:for variabele=beginwaarde to eindwaarde step stapgrootte while conditie do. De iteratie stopt als de eindwaarde bereikt is of als de conditie onwaar is geworden. - BCPL kent ook
UNTIL.
[bewerken] BREAK
Om een iteratie voortijdig te beëindigen, bestaan er statements als BREAK of EXIT. Om direct verder te gaan met de volgende iteratie, schrijft men LOOP of CONTINUE. Om de uitvoering van een subroutine te beëindigen, schrijft men RETURN.
- In Fortran is
CONTINUEeen dummystatement dat geen effect heeft. Het wordt vaak gebruikt om een label te plaatsen.
[bewerken] Label
Een label is een identifier waarmee een punt van het programma gemarkeerd wordt. Meestal wordt een label gebruikt in een GOTO-statement. Na een label komt meestal een dubbele punt.
- In Fortran is een label een getal dat in de eerste zes posities van een regel wordt geplaatst. (De programmacode begint bij Fortran in positie 8.) De regels hoeven niet genummerd te zijn en de nummers hoeven ook niet op volgorde te zijn.
- BASIC heeft geen labels maar regelnummers. Elke regel moet genummerd zijn.
- COBOL kent geen labels maar paragrafen en secties. Een enkele identifier, te beginnen in positie 8, is een paragraafnaam en de paragraaf eindigt bij het begin van de volgende paragraaf of het einde van de sectie. Een identifier gevolgd door het woord
SECTIONis een sectienaam en de sectie eindigt bij het begin van de volgende sectie.
[bewerken] GOTO
Na GOTO of GO TO komt een label. De uitvoering van het programma gaat op de plek van het label verder. Bijna alle programmeertalen kennen GOTO, maar het gebruik ervan wordt in de moderne programmeerpraktijk afgeraden.
[bewerken] Geschiedenis
Het is mogelijk om computers direct in hun eigen machinetaal te programmeren: direct de enen en nullen te specificeren die door de processor kunnen worden begrepen. Dit was voor de eerste computers gebruikelijk, met schakelaartjes werden groepen van 8 bits ingesteld. Men ondervond echter snel dat het veel te lastig was om programma's die op die manier waren geschreven, te onderhouden. Snel werd er daarom een symbolische manier bedacht om de machine-instructies als tekst weer te geven in de vorm van mnemonics. Zo werd het mogelijk om instructies veel eenvoudiger te lezen. Deze code, die nog wel een-op-een met de instructiecodes overeen komt, noemt men assembler.
Voor het programmeren van assembler en machinetaal moet de programmeur heel veel weten van de computer die hij wil programmeren. Om programmeren makkelijker te maken, zijn daarna andere programmeertalen, de zogenaamde hogere programmeertalen ontwikkeld. Hoe hoger de orde, hoe verder de taal van de machine-instructies af staat. Een imperatieve programmeertaal (zoals Pascal en C) staat bijvoorbeeld dichter bij de machine-instructies dan een functionele programmeertaal (zoals Scheme en Haskell). Een functionele programmeertaal sluit meer aan bij het denken van de mens dan bij de interne werking van de computer. Zo is het in Haskell mogelijk om 'normale' wiskundige definities te gebruiken.
Programmeertalen worden ook wel onderverdeeld in generaties:
- Eerste generatie: machinetaal.
- Tweede generatie: assembler (de kale machine-instructies, maar leesbaar neergezet).
- Derde generatie: procedurele talen als COBOL, Algol, Pascal, C en Fortran, en later ook objectgeoriënteerde talen zoals C++ en Java.
- Vierde generatie: Talen met een hoger abstractieniveau die voor een bepaald doel zijn ontwikkeld, zoals SQL en Progress 4GL.
- Vijfde generatie: Probleemoplossende talen. Hierbij specificeert de programmeur geen algoritme maar het probleem zelf, met een aantal bijbehorende beperkingen. Vijfde generatie-talen worden vooral gebruikt op het gebied van kunstmatige intelligentie. Het bekendste voorbeeld is Prolog.
De generaties worden vaak afgekort als GL, bijvoorbeeld 3GL, als afkorting van 3rd Generation Language(s).
Er zijn honderden programmeertalen bedacht, maar die worden niet allemaal frequent gebruikt. Veel zijn specifiek voor één doel ontworpen. Een van de eerste hogere programmeertalen was Plankalkül, in 1946 ontwikkeld door de Duitser Konrad Zuse.
Om programmeertalen te beschrijven, is een meta-taal bedacht: BNF of Backus Naur Form.
Bij het ontwikkelen van software in een bepaalde programmeertaal kan de programmeur gebruikmaken van een software-ontwikkelomgeving.
[bewerken] Zie ook
Bronnen, noten en/of referenties
|
| Programmeertalen |
|---|
|
ActionScript · Ada · ALGOL · APL · AWK · Assembleertalen · BASIC · C · C++ · C# · COBOL · D · Eiffel · F♯ · Fortran · Haskell · J♯ · Java · JavaScript · Lisp · Logo · ML · Modula-2 · Oberon · Object Pascal · Ocaml · Pascal · Perl · PHP · PL/I · Prolog · Python · Ruby · Scheme · Simula · Smalltalk · Visual Basic |