Wat doet een compiler precies?

daan , 23 jaar
1 maart 2016

Een compiler vertaalt een "zin" geschreven in een kunstmatige taal zoals een computertaal naar iets "begrijpbaars" voor een machine zoals een smartphone; dit heet een machinetaal. Men zegt dat een machine alleen nulletjes en eentjes kan begrijpen, maar is dit letterlijk of symbolisch bedoeld want 0101110 bijvoorbeeld is toch ook kunstmatig? Wat is de levensloop van een kunstmatige uitdrukking zoals 'PRINT 1+3'?

Antwoord

Dag Daan,

 

het is eigenlijk gek dat je een verschil maakt tussen een kunstmatige taal, een computertaal en een machinetaal, want die 3 dingen overlappen heel sterk.

Dus laat ons beginnen met die dingen wat preciezer te definieren.

  • een kunstmatige taal is voor mij een taal die niet natuurlijk is, waarbij ik een natuurlijke taal zie als iets levend waarmee mensen zich min of meer spontaan uitdrukken.
    Je zou kunnen zeggen dat een taal die iemands moedertaal is of is geweest, een natuurlijke taal is. Voorbeelden zijn alle dialecten en de "officiële" talen van een land, zoals Nederlands, Duits, Frans, ... Ook Latijn valt hier onder alhoewel er waarschijnlijk niet veel mensen zijn die nu nog Latijn als moedertaal hebben, maar het is ooit wel een moedertaal geweest.
    Esperanto zou ik onder kunstmatige taal klasseren omdat de taal geconstrueerd is door mensen en die geëvolueerd uit een natuurlijke omgeving.
    Programmeertalen zijn kunstmatige talen, maar niet alle kunstmatige talen zijn programmeertalen (bv. Esperanto of geheimtalen).
  • Een computertaal definiëren vind ik moeilijk. Je kan hiermee de taal bedoelen waarmee computers teksten voorlezen: dat taaltje klinkt meestal toch anders dan hoe wij zelf praten. Je kan hiermee ook de taal bedoelen waarmee je tegen computers kan praten om die handelingen laten uit te voeren. Er zijn bv. robots die je met spraak kan aansturen "links"-"rechts"-"ga"-"stop". Maar je bedoelt waarschijnlijk geen van beiden. Je kan ook een taal bedoelen waarmee computers onderling communiceren, bv. om boodschappen uit te wisselen. XML zou zo'n voorbeeld kunnen zijn.
    Kortom "computertaal" zou ik niet gebruiken in de context die je bedoelt. Ik denk dat je eigenlijk "programmeertaal" bedoelt: de taal waarin je een programma voor een computer schrijft.
  • Machinetaal definiëren lukt wel goed: dat is de taal die rechtstreeks door de processor van een computer begrepen wordt. Dit noemen we ook wel de instructieset van een processor. Het moge duidelijk wezen dat dit afhankelijk is van processor tot processor. Een ARM heeft een andere instructieset dan een Pentium, een Motorola 68000 (uit mijn jeugd ;-) of een i7.
  • Maar je bent eigenlijk nog een extra "taal" vergeten: "bytecode". Dit is een taal die niet begrepen wordt door de processor zelf, maar wel door een virtuele machine. De virtuele machine kan dan de bytecode uitvoeren door deze te vertalen naar de machinetaal van de onderliggende computer. De "Java Virtuele Machine" (JVM genoemd) is hiervan een voorbeeld. De mensen van Oracle hebben voor elk soort computer (Mac, Windows, Linux, Android en nog veel andere embedded devices) een virtuele machine gemaakt die Java-bytecode kan uitvoeren.

 

En met deze definities kunnen we een compiler definiëren als een programma dat code geschreven in een programmeertaal omzet in een andere programmeertaal, een vertaalprogramma dus.

Meestal ga je een programma in een 'hogere' programmeertaal omzetten in een 'lagere' programmeertaal. Met een "hogere" programmeertaal bedoelen we dan een programmeertaal waar je grotere concepten in kan toepassen en "dichter bij de mensentaal" kan programmeren. Je kan wel begrijpen dat dit een relatief vage definitie is en dat mensen kunnen discussieren over welke taal "hoger" is, maar het is in ieder geval wel duidelijk dat machinetaal een bytecode heel lage talen zijn in de zin dat het niet meer nodig is om die nog verder te vertalen. Maar je zou perfect een compiler kunnen schrijven die machinetaal compileert naar Java of C++. Of dat mooie resultaten zou geven, is een andere vraag, maar het kan.

In de praktijk zullen de nuttigste compilers een (hogere) programmeertaal vertalen naar ofwel machinetaal ofwel bytecode. Compilers voor meer experimentele talen gaan eerst vertalen naar een populaire taal waarna die compiler vertaalt naar uitvoerbare code.

Merk op dat er heel gekke programmeertalen zijn, bv. ArnoldC gebaseerd op de online van Arnold Schwarzenegger.

 

Reacties op dit antwoord

Er zijn nog geen reacties op deze vraag.

Enkel de vraagsteller en de wetenschapper kunnen reageren op een antwoord.

Zoek andere vragen

© 2008-2026
Ik heb een vraag wordt gecoördineerd door Eos wetenschap. Voor vragen over het platform kan je terecht bij ikhebeenvraag@eos.be