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 |
Programmeerparadigma [bewerken]
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 imperatieve, functionele en logische programmeerparadigma's, waarbij vermeld moet worden dat programmeertalen soms meerdere paradigma's combineren.
Gebruik [bewerken]
Met het coderingsproces zijn de volgende fases gemoeid: Edit, compile/assemble, eventueel link en run-time. In edit-time wordt de leesbare broncode samengesteld en in een broncode bestand opgeslagen. Het vertaalproces wordt vervolgens meestal geëntameerd door een buildtool met het commando make, build o.i.d. Hierdoor loopt de compile en de overige 'tijden' vaak op een strategische manier af. De machinecode kan dan uit gevoerd worden, dit noemt men run-time.
Er zijn verschillende manieren waarop een programma's door een computer vertaald en uitgevoerd worden. De vertaling is van zogenaamde broncode naar doelcode.
- Direct: wanneer het programma is geprogrammeerd in de machinetaal van de betrokken computer, kunnen de instructies direct uitgevoerd worden. Het programmeren in machinetaal is echter zo omslachtig en tijdrovend dat het nooit meer gebeurt. In de praktijk wordt een assembler-taal gebruikt, die met behulp van een assembler naar machinecode compileert.
- Compilatie: met behulp van een compiler voor de programmeertaal wordt de broncode omgezet in instructies in de machinetaal die door de processor in de computer direct kunnen worden begrepen en uitgevoerd. Vaak vertaalt deze compiler naar een objectcode omdat de linker er nog code uit verschillende bibliotheken er aan vast moet knopen,
- Via tussencode: met behulp van een compiler voor de programmeertaal worden de instructies omgezet in een tussencode of pseudocode (bytecode, ook wel P-code genoemd), een speciale interpreter voor die bytecode voert dan deze instructies uit.
- Interpreter: een interpreter leest tekst van de broncode in, interpreteert deze ad hoc naar termen van machinecode en een runtimebibliotheek, en voert die code direct uit. Vaak wordt de input, de tekst dus, script genoemd en de programmeertaal is een scripttaal.
Compilers optimaliseren vaak de doelcode, bijvoorbeeld een optelling of aftrekking met 0 wordt geëlimineerd. Dit is een eenvoudig geval ter illustratie maar er zijn complexere optimalisaties. Een programma dat met een compiler wordt vertaald, kan over het algemeen — mede door optimalisatie — sneller door de computer worden uitgevoerd, dan wanneer gebruikgemaakt wordt van een interpreter, aangezien een interpreter de opdrachten altijd eerst nog moet omzetten naar machinetaal. Met andere woorden de compilatie wordt run-time gedaan. Maar er zijn ook zeer slimme strategieën; voorbeelden van interpretercode die omgezet wordt naar broncode om alsnog door een compiler te worden gehaald voor de optimalisatie en machinecode. Veel programmeertalen worden alleen met een compiler of alleen met een interpreter gebruikt; voor sommige bestaan zowel compilers als interpreters.
Definitie [bewerken]
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.
Geschiedenis [bewerken]
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 overeenkomt, 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-generatietalen 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 ervan 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.
Zie ook [bewerken]
Bronnen, noten en/of referenties
|
| Programmeertalen |
|---|
|
ABAP · ABC · ActionScript · Ada · Algol · APL · Assembleertalen · AWK · B · BASIC · BCPL · C · C++ · C♯ · Clean · Clipper · Clojure · COBOL · Curry · D · Eiffel · Erlang · F♯ · Forth · Fortran · Go · Haskell · Icon · J♯ · Java · JavaScript · JScript · Kotlin · Lisp · Logo · Lua · ML · Modula-2 · Oberon · Object Pascal · Objective-C · Ocaml · Oz · Pascal · Perl · PHP · PL/I · PL/SQL · Prolog · Prova · Python · Rexx · RPG · Ruby · SAS · Scala · Scheme · Self · Simula · Smalltalk · TCL · Vala · Visual Basic |