Wat is een compilerontwerp? Typen, constructiegereedschap, voorbeeld
Wat is een compiler?
Een compiler is een computerprogramma waarmee u broncode die in een taal op hoog niveau is geschreven, kunt omzetten in machinetaal op laag niveau. Het vertaalt de code die in de ene programmeertaal is geschreven naar een andere taal zonder de betekenis van de code te veranderen. De compiler maakt de eindcode ook efficiënt, wat is geoptimaliseerd voor uitvoeringstijd en geheugenruimte.
Het compileerproces omvat basisvertaalmechanismen en foutdetectie. Het compileerproces doorloopt lexicale, syntaxis- en semantische analyses aan de voorkant en het genereren en optimaliseren van code aan de achterkant.
Kenmerken van compilers
- Juistheid
- Snelheid van compilatie
- Behoud de juiste betekenis van de code
- De snelheid van de doelcode
- Herken legale en illegale programmaconstructies
- Goede foutrapportage/afhandeling
- Hulp bij het debuggen van code
Soorten compilers
Hieronder staan de verschillende typen compilers:
- Single Pass-compilers
- Twee Pass-compilers
- Multipass-compilers
Single Pass-compiler
In één keer wordt de broncode van de Compiler direct omgezet in machinecode. Bijvoorbeeld Pascal-taal.
Two Pass-compiler
De two pass compiler is verdeeld in twee secties, namelijk:
- Voorkant: Het brengt de juridische code in kaart in Intermediate Representation (IR).
- Achterkant: Het wijst IR toe aan de doelmachine
De Two Pass-compilermethode vereenvoudigt ook het retargetingproces. Het maakt ook meerdere front-ends mogelijk.
Multipass-compilers
De multipass-compiler verwerkt de broncode of syntaxisboom van een programma meerdere keren. Het verdeelde een groot programma in meerdere kleine programma's en verwerkte deze. Het ontwikkelt meerdere tussencodes. Al deze multipass nemen de uitvoer van de vorige fase als invoer. Er is dus minder geheugen nodig. Het wordt ook wel 'Wide Compiler' genoemd.
Taken van de compiler
De belangrijkste taken die door de compiler worden uitgevoerd, zijn:
- Verdeelt het bronprogramma in stukken en legt er een grammaticale structuur aan op
- Hiermee kunt u het gewenste doelprogramma samenstellen uit de tussenweergave en ook de symbooltabel maken
- Compileert de broncode en spoort fouten daarin op
- Beheer de opslag van alle variabelen en codes.
- Ondersteuning voor afzonderlijke compilatie
- Lees, analyseer het hele programma en vertaal het naar semantisch equivalent
- Het vertalen van de broncode naar objectcode, afhankelijk van het type machine
Geschiedenis van compiler
Een belangrijk monument in de geschiedenis van Compiler is als volgt:
- Het woord ‘compiler’ werd voor het eerst gebruikt in het begin van de jaren vijftig door Grace Murray Hopper.
- De eerste compiler werd tussen 1954 en 1957 door John Backum en zijn groep gebouwd IBM.
- COBOL was de eerste programmeertaal die in 1960 op meerdere platforms werd samengesteld
- Het onderzoek naar de problemen met scannen en parseren werd in de jaren zestig en zeventig voortgezet om een volledige oplossing te bieden.
Stappen voor taalverwerkingssystemen
Voordat u meer te weten komt over het concept van compilers, moet u eerst een aantal andere hulpmiddelen begrijpen die met compilers werken.
- preprocessor: De preprocessor wordt beschouwd als onderdeel van de compiler. Het is een tool die input produceert voor Compiler. Het gaat over macroverwerking, augmentatie, taaluitbreiding, enz.
- Tolk: Een tolk is als Compiler, die taal op hoog niveau vertaalt naar machinetaal op laag niveau. Het belangrijkste verschil tussen beide is dat de tolk code regel voor regel leest en transformeert. Compiler leest de volledige code in één keer en creëert de machinecode.
- Assembler: Het vertaalt assemblertaalcode naar machinebegrijpelijke taal. Het outputresultaat van assembler staat bekend als een objectbestand, wat een combinatie is van machine-instructies en de gegevens die nodig zijn om deze instructies in het geheugen op te slaan.
- Links: De linker helpt u bij het koppelen en samenvoegen van verschillende objectbestanden om een uitvoerbaar bestand te maken. Al deze bestanden zijn mogelijk met afzonderlijke assemblers samengesteld. De hoofdtaak van een linker is het zoeken naar opgeroepen modules in een programma en het achterhalen van de geheugenlocatie waar alle modules zijn opgeslagen.
- Lader: De lader is een onderdeel van het besturingssysteem, dat de taken uitvoert van het laden van uitvoerbare bestanden in het geheugen en het uitvoeren ervan. Het berekent ook de grootte van een programma, waardoor extra geheugenruimte ontstaat.
- Cross-compiler: Een Cross-compiler in compilerontwerp is een platform dat u helpt uitvoerbare code te genereren.
- Bron-naar-bron-compiler: Source to source-compiler is een term die wordt gebruikt wanneer de broncode van de ene programmeertaal wordt vertaald naar de broncode van een andere taal.
Compiler-constructietools
Compiler construction tools werden geïntroduceerd toen computergerelateerde technologieën zich over de hele wereld verspreidden. Ze staan ook bekend als compiler-compilers, compiler-generators of translator.
Deze tools gebruiken specifieke taal of algoritmen voor het specificeren en implementeren van het component van de compiler. Hieronder volgen voorbeelden van compilerconstructietools.
- Scannergeneratoren: Deze tool gebruikt reguliere expressies als invoer. Bijvoorbeeld LEX voor Unix Operasysteem.
- Syntaxisgerichte vertaalmachines: Deze software tools bied een tussencode aan met behulp van de ontleedboom. Het heeft tot doel een of meer vertalingen te associëren met elk knooppunt van de ontleedboom.
- Parser-generatoren: Een parsergenerator neemt een grammatica als invoer en genereert automatisch broncode die stromen van tekens kan parseren met behulp van een grammatica.
- Automatische codegeneratoren: Neemt tussencode en converteert deze naar machinetaal.
- Dataflow-motoren: Deze tool is handig voor code-optimalisatie. Hier wordt informatie door de gebruiker aangeleverd en wordt de tussencode vergeleken om eventuele relaties te analyseren. Het wordt ook wel datastroomanalyse genoemd. Het helpt u erachter te komen hoe waarden van het ene deel van het programma naar het andere deel worden overgedragen.
Waarom een compiler gebruiken?
- Compiler verifieert het hele programma, dus er zijn geen syntaxis- of semantische fouten.
- Het uitvoerbare bestand is geoptimaliseerd door de compiler, zodat het sneller wordt uitgevoerd.
- Hiermee kunt u interne structuur in het geheugen creëren.
- Het is niet nodig om het programma uit te voeren op dezelfde machine waarop het is gebouwd.
- Vertaal het hele programma in een andere taal.
- Genereer bestanden op schijf.
- Koppel de bestanden in een uitvoerbaar formaat.
- Controleer op syntaxisfouten en gegevenstypen.
- Helpt u uw begrip van taalsemantiek te vergroten.
- Helpt bij het omgaan met taalprestatieproblemen.
- Kans voor een niet-triviaal programmeerproject.
- De technieken die worden gebruikt voor het construeren van een compiler kunnen ook voor andere doeleinden nuttig zijn.
Toepassing van compilers
- Het compilerontwerp helpt bij de volledige implementatie van programmeertalen op hoog niveau.
- Ondersteuning van optimalisatie voor computer Architectuur Parallellisme.
- Ontwerp van nieuwe geheugenhiërarchieën van machines.
- Veel gebruikt voor vertaalprogramma's.
- Gebruikt met andere softwareproductiviteitstools.
Samenvatting
- Een compiler is een computerprogramma waarmee u broncode die in een taal op hoog niveau is geschreven, kunt omzetten in machinetaal op laag niveau.
- Correctheid, snelheid van compilatie, behoud van de juiste betekenis van de code zijn enkele belangrijke kenmerken van het compilerontwerp.
- Compilers zijn onderverdeeld in drie delen: 1) Single Pass-compilers, 2) Two Pass-compilers en 3) Multipass-compilers.
- Het woord 'compiler' werd voor het eerst gebruikt in het begin van de jaren vijftig door Grace Murray Hopper.
- De stappen voor het taalverwerkingssysteem zijn: Preprocessor, Interpreter, Assembler, Linker/Loader.
- Belangrijke compilerconstructiehulpmiddelen zijn: 1) scannergeneratoren, 2) syntaxis-3) gerichte vertaalmachines, 4) parsergeneratoren en 5) automatische codegeneratoren.
- De hoofdtaak van de compiler is om het hele programma te verifiëren, zodat er geen syntaxis- of semantische fouten zijn.