Kommentarer
- For bred, i det mindste " Hvordan fungerer det " del. Der er hele bøger skrevet om dette emne.
- da.wikipedia.org/wiki/Compiler ville være Wikipedia-linket, der er trivielt med find, hvad specifikt undrer du dig over? Spørgsmålet er bredt nok til, at jeg ' fristes til at give det smarte alec-svar fra " Kompilatorer oversætter kode fra et sprog til et andet , " da det er den generelle idé, der har mange nuancer inden for det, når man først begynder at se på, hvad det egentlig indebærer.
- Ja og jeg tror det er blevet besvaret ret godt.
- Enhver forklaring på, hvordan en compiler fungerer, vil enten være for bred eller for kompliceret. Det ' er et kompliceret emne, og kompilatklasserne var de sværeste computerrelaterede kurser, jeg nogensinde har taget.
- @ David Selvfølgelig er kompilatorer komplicerede, og du kan ikke forklare alle detaljer om, hvordan de fungerer her. Jeg er dog sikker på, at du havde en grundlæggende forståelse på højt niveau af, hvad en compiler er, eller hvordan den fungerer, før du tog dit compiler-kursus.
Svar
En kompilator er et program, der oversætter kildekoden til et andet program fra et programmeringssprog til eksekverbar kode.
Kildekoden er typisk på et programmeringssprog på højt niveau (f.eks. Pascal, C, C ++, Java, Perl, C # osv.). Den eksekverbare kode kan være en sekvens af maskininstruktioner, der kan udføres direkte af CPUen, eller det kan være en mellemrepræsentation, der fortolkes af en virtuel maskine (f.eks. Java-byte-kode).
Kort sagt, en compiler konverterer et program fra et menneskeligt læsbart format til et maskinlæsbart format.
Hvad en compiler fungerer på, er det faktisk kompliceret. Der er bøger og universitetskurser om emnet. Jeg vil forsøge kort at skitsere de vigtigste faser i processen, men dette vil være en meget kort oversigt.
- Lexing – opdel programmets tekst i “tokens”. Tokenerne er “ordene” i programmeringssproget, såsom identifikatorer (nøgleord, variabelnavne, funktionsnavne osv.) Eller operatorer (=, *, & osv.) .
- Parsing – konverter rækkefølgen af tokens til et parse-træ, som er en datastruktur, der repræsenterer forskellige sprogkonstruktioner: typedeklarationer, variable erklæringer, funktionsdefinitioner, sløjfer, betingede, udtryk osv.
- Optimering – evaluer konstante udtryk, optimer ubrugte variabler eller utilgængelig kode, rul om muligt sløjfer osv.
- Oversæt parse-træet til maskininstruktioner (eller JVM-byte-kode).
Igen understreger jeg, at dette er en meget kort beskrivelse. Moderne compilere er meget smarte og følgelig meget komplicerede.
Kommentarer
- Faktisk forvandler det et sprog til et andet. Tidlig C ++ compiler kompilerede til C. Det samme gælder for Vala compiler. Java-kompilator kompileres til bytekode, der ikke er ' t eksekverbar uden en JVM ' s JIT-kompilator.
- @deadalnix IMHO , pointen er, at du går fra ikke-eksekverbar kode til eksekverbar kode. Jeg vil argumentere for, at C-front ikke var en compiler, men en front-end til C-compileren. Eller et trin i kompileringsprocessen, hvis du vil. Virtuelle maskiner slører grænsen mellem " eksekverbar " og " ikke-eksekverbar ", selvfølgelig. Her vil jeg blot betragte eksekverbar kode som det, der går ind i den virtuelle maskine, som byte-koden, og abstraherer det, der foregår inde i den virtuelle maskine, som JIT.
- @Dima, det gør det ikke ' t skal være fra ikke-eksekverbar kode til eksekverbar kode. For eksempel kan du ikke udføre JVM-bytekode direkte på Windows-maskiner.
- @Thorbj ø rn Ravn Andersen: men bytekoden kan køres af JVM. Er ikke ' t hele punktet i en " virtuel maskine " for at ligne en rigtig maskine til programmøren?
- Jeg vil hævde, at en compiler traditionelt konverterede et program fra et menneskeligt læsbart format til et maskinlæsbart format, ligesom Dima sagde. Variationer som Cfront konvertering af C ++ til C eller javac konvertering af Java til bytecode er mere avancerede emner, som sandsynligvis skal efterlades indtil efter at have forklaret det grundlæggende, traditionelle koncept til en person, der ikke er bekendt med det.
Svar
En compiler er et computerprogram (eller et sæt instruktioner), der omdanner kildekode skrevet på et programmeringssprog (kildesproget) til et andet computersprog ( målsprog, ofte med en binær form kendt som objektkode). Den mest almindelige årsag til, at man ønsker at omdanne kildekode, er at oprette et eksekverbart program.
Kompilatorer overbygger kildeprogrammer på sprog på højt niveau med den underliggende hardware. En kompilator kræver:
- Bestemmelse af korrektheden af programmernes syntaks
- Generering af korrekt og effektiv objektkode
- Kørselstidsorganisation
- Formatering af output i henhold til samler- og / eller linkerkonventioner.