kääntäjä on ohjelmoida joka kääntää ihmisille luettavan lähdekoodi tietokoneella suoritettavaan konekoodiin. Jotta tämä voidaan suorittaa onnistuneesti, ihmisille luettavan koodin on oltava syntaksi sen ohjelmointikielen säännöt, johon se kirjoitetaan. Kääntäjä on vain ohjelma, eikä se voi korjata koodiasi sinulle. Jos teet virheen, sinun on korjattava syntaksi, tai se ei käänny.
Mitä tapahtuu, kun käännät koodia?
Kääntäjän monimutkaisuus riippuu kielen syntaksista ja siitä, kuinka paljon abstrakteja tuo ohjelmointikieli tarjoaa. C-kääntäjä on paljon yksinkertaisempi kuin C ++: n tai C #: n kääntäjä.
Leksinen analyysi
Kääntäessään kompilaattori lukee ensin merkkijonon lähdekooditiedostosta ja generoi leksisten tokenien virran. Esimerkiksi C ++ -koodi:
int C = (A * B) +10;
voidaan analysoida seuraavasti:
- kirjoita "int"
- muuttuja "C"
- equals
- leftbracket
- muuttuja "A"
- ajat
- muuttuja "B"
- rightbracket
- plus
- kirjaimellinen "10"
Syntaktinen analyysi
Leksinen lähtö menee kääntäjän syntaattiseen analysaattoriosaan, joka käyttää kielioppisääntöjä päättääkseen, onko syöte kelvollinen vai ei. Ellei
muuttujat A ja B on aiemmin ilmoitettu ja olivat soveltamisalalla, kääntäjä voi sanoa:- 'A': ilmoittamaton tunniste.
Jos ne ilmoitettiin, mutta niitä ei alustettu. kääntäjä antaa varoituksen:
- paikallista muuttujaa 'A' käytetään ilman alustamista.
Älä koskaan pidä sivuuttaa kääntäjän varoituksia. Ne voivat rikkoa koodisi outoilla ja odottamattomilla tavoilla. Korjaa aina kääntäjän varoitukset.
Yksi vai kaksi?
Jotkut ohjelmointikielet on kirjoitettu, joten kääntäjä voi lukea lähdekoodin vain kerran ja luoda konekoodin. Pascal on yksi sellainen kieli. monet kerääjiä vaaditaan vähintään kaksi kulkua. Joskus se johtuu seuraavista ilmoituksista: tehtävät tai luokat.
C ++: ssa luokka voidaan julistaa, mutta sitä ei voida määritellä vasta myöhemmin. Kääntäjä ei pysty selvittämään kuinka paljon muistia luokka tarvitsee, ennen kuin se kokoaa luokan rungon. Sen on luettava lähdekoodi uudelleen ennen oikean konekoodin luomista.
Konekoodin luominen
Jos oletetaan, että kääntäjä suorittaa onnistuneesti leksikaaliset ja syntaktiset analyysit, viimeinen vaihe tuottaa konekoodin. Tämä on monimutkainen prosessi, etenkin nykyaikaisissa suorittimissa.
Kokoonpanon nopeus suoritettavan Koodin tulisi olla mahdollisimman nopea ja se voi vaihdella huomattavasti luodun koodin laadun ja optimoinnin vaatimuksen mukaan.
Useimpien kääntäjien avulla voit määrittää optimoinnin määrän - tyypillisesti tunnettu nopeista virheenkorjauksista ja vapaan koodin täydellisestä optimoinnista.
Koodien luominen on haastavaa
Kääntäjä kirjoittajalla on haasteita kirjoitettaessa koodigeneraattoria. Monet prosessorit nopeuttavat käsittelyä käyttämällä
- Ohje putkisto
- sisäinen välimuistit.
Jos kaikki ohjeet koodin sisällä silmukka voidaan pitää prosessori välimuisti, silmukka toimii paljon nopeammin kuin silloin, kun suorittimen on haettava ohjeet päämuistilta. CPU-välimuisti on CPU-siruun sisäänrakennettu muistilohko, johon pääsee paljon nopeammin kuin pää RAM-muistissa.
Välimuistit ja jonot
Useimmissa CPU: issa on esihakujono, jossa CPU lukee ohjeet välimuistiin ennen niiden suorittamista. Jos ehdollista haaraa tapahtuu, suorittimen on ladattava jono uudelleen. Koodi tulisi luoda tämän minimoimiseksi.
Monilla suorittimilla on erilliset osat:
- Kokonaisluku aritmeettinen (kokonaisluvut)
- Liukulukuaritmeettinen (murto-luvut)
Nämä toiminnot voivat usein suorittaa samanaikaisesti nopeuden lisäämiseksi.
Kääntäjät luovat konekoodin tyypillisesti objektitiedostoiksi, jotka ovat sitten sidoksissa yhdessä linkker-ohjelman avulla.