Reacties
- Te breed, tenminste de " Hoe werkt het " deel. Er zijn hele boeken over dat onderwerp geschreven.
- en.wikipedia.org/wiki/Compiler zou de Wikipedia-link zijn die triviaal is voor vind, wat vraag je je specifiek af? De vraag is zo breed dat ik ' in de verleiding zou komen om het slimme alec-antwoord te geven van: " Compilers vertalen code van de ene taal naar de andere , " aangezien dat het algemene idee is dat veel nuances bevat, zodra men begint te kijken naar wat dat werkelijk inhoudt.
- Ja en ik denk het is redelijk goed beantwoord.
- Elke uitleg over hoe een compiler werkt, zal ofwel te breed of te ingewikkeld zijn. Het ' is een ingewikkeld onderwerp, en de compilersklassen waren de moeilijkste computergerelateerde cursussen die ik ooit heb gevolgd.
- @David Natuurlijk zijn compilers gecompliceerd, en dat kun je niet leg alle details uit van hoe ze hier werken. Ik ben er echter zeker van dat je een basiskennis op hoog niveau had van wat een compiler is of hoe het werkt voordat je je compilercursus volgde.
Antwoord
Een compiler is een programma dat de broncode voor een ander programma vertaalt van een programmeertaal naar uitvoerbare code.
De broncode is typisch in een programmeertaal op hoog niveau (bijv. Pascal, C, C ++, Java, Perl, C #, etc.). De uitvoerbare code kan een reeks machine-instructies zijn die rechtstreeks door de CPU kunnen worden uitgevoerd, of het kan een tussenliggende weergave zijn die wordt geïnterpreteerd door een virtuele machine (bijv. Java-bytecode).
Kortom, een compiler converteert een programma van een door mensen leesbaar formaat naar een machinaal leesbaar formaat.
Wat betreft hoe een compiler werkt, dat is inderdaad ingewikkeld. Er zijn boeken en universitaire cursussen over het onderwerp. Ik zal proberen de belangrijkste fasen van het proces kort te schetsen, maar dit zal een zeer vluchtig overzicht zijn.
- Lexing – verdeel de tekst van het programma in “tokens”. De tokens zijn de “woorden” van de programmeertaal, zoals IDs (trefwoorden, namen van variabelen, functienamen, enz.) Of operatoren (=, *, &, enz.) .
- Parsing – zet de reeks tokens om in een ontleedboom, een datastructuur die verschillende taalconstructies vertegenwoordigt: typedeclaraties, variabeledeclaraties, functiedefinities, loops, conditionals, expressies, enz.
- Optimalisatie – evalueer constante expressies, optimaliseer ongebruikte variabelen of onbereikbare code, rol loops uit indien mogelijk, etc.
- Vertaal de ontleedboom in machine-instructies (of JVM-bytecode).
Nogmaals, ik benadruk dat dit een zeer korte beschrijving is. Moderne compilers zijn erg slim, en bijgevolg erg gecompliceerd.
Reacties
- Eigenlijk transformeert het een taal in een andere. De vroege C ++ -compiler compileerde naar C. Hetzelfde geldt voor de Vala-compiler. Java-compiler compileert in bytecode die niet ' t uitvoerbaar is zonder een JVM ' s JIT-compiler.
- @deadalnix IMHO , het punt is dat je van niet-uitvoerbare code naar uitvoerbare code gaat. Ik zou zeggen dat C-front geen compiler was, maar een front-end voor de C-compiler. Of een fase in het compilatieproces, zo u wilt. Virtuele machines vervagen de grens tussen " uitvoerbaar " en " niet-uitvoerbaar ", natuurlijk. Hier zou ik gewoon uitvoerbare code beschouwen als alles wat in de virtuele machine komt, zoals de bytecode, en alles wat er binnen de VM gebeurt, zoals JIT, abstraheren.
- @Dima, het doet niet ' t moet van niet-uitvoerbare code naar uitvoerbare code zijn. U kunt bijvoorbeeld JVM-bytecode niet rechtstreeks op Windows-machines uitvoeren.
- @Thorbj ø rn Ravn Andersen: maar de bytecode kan worden uitgevoerd door de JVM. Is niet ' t het hele punt van een " virtuele machine " om eruit te zien als een echte machine naar de programmeur?
- Ik zou zeggen dat een compiler traditioneel een programma converteerde van een door mensen leesbaar formaat naar een machinaal leesbaar formaat, precies zoals Dima zei. Variaties zoals Cfront die C ++ naar C converteert of javac die Java naar bytecode converteert, zijn meer geavanceerde onderwerpen die waarschijnlijk moeten worden overgelaten tot na het uitleggen van het traditionele basisconcept aan iemand die er niet bekend mee is.
Answer
Een compiler is een computerprogramma (of set instructies) dat broncode, geschreven in een programmeertaal (de brontaal), omzet in een andere computertaal (de doeltaal, vaak met een binaire vorm die bekend staat als objectcode). De meest voorkomende reden om broncode te willen transformeren, is om een uitvoerbaar programma te maken.
Compilers overbruggen bronprogrammas in hogere talen met de onderliggende hardware. Een compiler vereist:
- Bepaling van de juistheid van de syntaxis van programmas
- Genereren van correcte en efficiënte objectcode
- Run-time organisatie
- Uitvoer opmaken volgens assembler- en / of linkerconventies.