Kommentarer
- For bredt, i det minste " Hvordan fungerer det " del. Det er hele bøker skrevet om dette emnet.
- no.wikipedia.org/wiki/Compiler ville være Wikipedia-lenken som er triviell for finn, hva lurer du spesifikt på? Spørsmålet er bredt nok til at jeg ' fristet til å gi den smarte alec-responsen til, " Kompilatorer oversetter kode fra ett språk til et annet , " da det er den generelle ideen som har mange nyanser innen at når en begynner å se på hva det egentlig innebærer.
- Ja, og jeg tror det har blitt besvart ganske bra.
- Enhver forklaring på hvordan en kompilator fungerer, vil enten være for bred eller for komplisert. Det ' er et komplisert emne, og kompilatorkursene var de vanskeligste datarelaterte kursene jeg noensinne har tatt.
- @ David Selvfølgelig er kompilatorer kompliserte, og du kan ikke forklare alle detaljene om hvordan de fungerer her. Jeg er imidlertid sikker på at du hadde en grunnleggende forståelse på høyt nivå av hva en kompilator er eller hvordan den fungerer før du tok kompilatorkurset.
Svar
En kompilator er et program som oversetter kildekoden for et annet program fra et programmeringsspråk til kjørbar kode.
Kildekoden er vanligvis på et høyt nivå programmeringsspråk (f.eks. Pascal, C, C ++, Java, Perl, C #, etc.). Den kjørbare koden kan være en sekvens av maskininstruksjoner som kan utføres av CPUen direkte, eller det kan være en mellomrepresentasjon som tolkes av en virtuell maskin (f.eks. Java-byte-kode).
Kort sagt, en kompilator konverterer et program fra et lesbart format til et maskinlesbart format.
Når det gjelder hvordan en kompilator fungerer, er det virkelig komplisert. Det er bøker og universitetskurs om emnet. Jeg vil prøve å kort skissere hovedfasene i prosessen, men dette vil være en veldig kort oversikt.
- Lexing – del opp teksten i programmet i «tokens». Tokene er «ordene» til programmeringsspråket, for eksempel identifikatorer (nøkkelord, variabelnavn, funksjonsnavn osv.) Eller operatorer (=, *, & osv.) .
- Parsing – konverter sekvensen av tokens til et parse-tre, som er en datastruktur som representerer forskjellige språkkonstruksjoner: typedeklarasjoner, variabeldeklarasjoner, funksjonsdefinisjoner, sløyfer, betingelser, uttrykk osv. >
- Optimalisering – evaluer konstante uttrykk, optimaliser ubrukte variabler eller utilgjengelig kode, rull ut løkker hvis mulig osv.
- Oversett analysetreet til maskininstruksjoner (eller JVM-byte-kode).
Igjen understreker jeg at dette er en veldig kort beskrivelse. Moderne kompilatorer er veldig smarte, og følgelig veldig kompliserte.
Kommentarer
- Egentlig forvandler det et språk til et annet. Tidlig C ++ kompilator kompilerte til C. Det samme gjelder Vala kompilator. Java-kompilator kompileres til bytekode som ikke ' t kjørbar uten JVM ' s JIT-kompilator.
- @deadalnix IMHO , poenget er at du går fra ikke-kjørbar kode til kjørbar kode. Jeg vil hevde at C-front ikke var en kompilator, men en front-end til C-kompilatoren. Eller et stadium i kompileringsprosessen, hvis du vil. Virtuelle maskiner slører grensen mellom " kjørbar " og " ikke-kjørbar ", selvfølgelig. Her vil jeg bare betrakte kjørbar kode for å være det som går inn i den virtuelle maskinen, som byte-koden, og abstrakte bort det som skjer inne i den virtuelle maskinen, som JIT.
- @Dima, det gjør det ikke ' t må være fra ikke-kjørbar kode til kjørbar kode. For eksempel kan du ikke utføre JVM-byte-kode direkte på Windows-maskiner.
- @Thorbj ø rn Ravn Andersen: men byte-koden kan kjøres av JVM. Er ikke ' t hele poenget med en " virtuell maskin " for å se ut som en ekte maskin til programmereren?
- Jeg vil hevde at en kompilator tradisjonelt konverterte et program fra et menneskelig lesbart format til et maskinlesbart format, akkurat som Dima sa. Variasjoner som Cfront konvertering av C ++ til C eller javac konvertering av Java til bytecode er mer avanserte emner som sannsynligvis bør være igjen etter at de har forklart det grunnleggende, tradisjonelle konseptet til noen som ikke er kjent med det.
Svar
En kompilator er et dataprogram (eller et sett med instruksjoner) som forvandler kildekoden skrevet i et programmeringsspråk (kildespråket) til et annet dataspråk ( målspråk, ofte med en binær form kjent som objektkode). Den vanligste årsaken til at du ønsker å transformere kildekoden er å lage et kjørbart program.
Kompilatorer bygger bro på kildeprogrammer på høyt nivå språk med den underliggende maskinvaren. En kompilator krever:
- Bestemme riktigheten av syntaksen til programmer
- Generere riktig og effektiv objektkode
- Kjøretidsorganisasjon
- Formatering av utdata i henhold til samler- og / eller koblingskonvensjoner.