Geschiedenis
LISt Processor
Lisp1 is een familie van programmeertalen met een lange geschiedenis. Oorspronkelijk
gespecificeerd in 1958, waardoor het de tweede oudste programmeertaal is. Fortran is 1 jaar
ouder.
Lisp heeft vele dialecten die al in een vroeg stadium ontstonden. Een aantal daarvan kennen
we vandaag nog steeds: Racket, Common Lisp, Scheme en Clojure.
De taal was oorspronkelijk bedoeld voor praktische mathematische notatie voor computers.
Al snel werd het een favoriete taal voor onderzoek naar "Artificial Intelligence" (AI). De naam
Lisp komt van List processor. Linked lists zijn één van de belangrijkste datastructuren in
Lisp. De Lisp source code is opgebouwd uit lists. Vandaar de afkomst list processor.
De ontdekking van de interpreter
Een paar jaar na Grace Hoppers werk aan de compiler, waren er een aantal studenten op
het MIT aan het werken aan een IBM 704 computer. Een van de studenten, Steve Russell
genaamd, werkte aan iets dat het "MIT Artificial Intelligence Project" heette. Hij heeft
handmatig de eerste Lisp interpreter gemaakt.
Nogmaals de compiler
Machine language is binaire code, dit is code die de processor direct kan verwerken. Ook
hebben we assembly language, dit is code dat een soort leesbaar is voor mensen, deze
code kost veel moeite om te lezen en heeft een hoge leercurve. Daarnaast hebben we high-
level language hierbij moet je denken aan C++, Java en Python, deze code is beter te
begrijpen voor mensen.
Compilers lezen de source code en in één compileer actie zetten ze de source code om
naar machinecode. Machinecode die direct door de processor kan worden verwerkt.
De compiler maakt daarvoor gebruik van verschillende tools/onderdelen:
● Scanner, leest alle karakters van de source code
● Lexer/Tokenizer, geeft codes (tokens) voor alle onderdelen (keywords, variabelen,
etc.)
● Parser, maakt een parse tree
● Emitter (Code generator), genereert de machine code op basis van de parse tree
● Linker, deze pakt alle object files bij elkaar en produceert de executable of DLL
Wat is nu een interpreter?
Een interpreter is een vertaler. Net als een compiler zet deze high-level languages om naar
machinecode. Dit gebeurt echter op een iets andere manier dan bij een compiler. De
, interpreter runt het vertaalde stuk programma direct nadat hij het heeft vertaald. Stukje voor
stukje wordt de source code vertaald en uitgevoerd. Dat is het grote verschil met een
compiler.
Dit betekent dat de interpreter een regel source code vertaalt en deze vervolgens direct gaat
uitvoeren. Op het moment dat het vertalen mislukt, een fout in de source code, dan stopt het
programma ook op die plek.
Elke keer dat het programma wordt gerund, wordt deze opnieuw vertaald en uitgevoerd.
Wanneer we het programma achter elkaar runnen met verschillende parameters, wordt het
elke keer opnieuw vertaald en uitgevoerd.
Hier zie je het verschil met een compiler heel duidelijk. Nadat de compiler het programma
heeft gecompileerd, kan het programma meerdere keren worden gerund zonder dat deze
eerst hoeft te worden gecompileerd. Wanneer we het programma met nieuwe parameters
willen runnen, dan bieden we de parameters aan en kan het gewoon runnen.
Als er tijdens het interpreteren een fout in de source code zit, dan stopt het programma
precies op de plek waar het probleem is. De fout is dan relatief eenvoudig te vinden. Bij een
gecompileerd programma zijn runtime fouten (fouten die optreden als het programma loopt)
heel lastig te vinden. Tegenwoordig zijn er veel tools beschikbaar om de fout toch te
achterhalen.