Kompiliatoriaus apibrėžimas ir paskirtis
ANDRZEJ WOJCICKI / Getty Images
A kompiliatorius yra programa tai reiškia, kad tai suprantama žmogui pirminis kodas į kompiuterio vykdomą mašinos kodą. Kad tai būtų atlikta sėkmingai, žmogaus skaitomas kodas turi atitikti sintaksė Programavimo kalbos taisyklės, kuria jis parašytas. Kompiliatorius yra tik programa ir negali pataisyti kodo už jus. Jei padarote klaidą, turite taisyti sintaksę, kitaip ji nebus kompiliuojama.
Kas atsitinka, kai sudarote kodą?
Kompiliatoriaus sudėtingumas priklauso nuo kalbos sintaksės ir abstrakcijos ta programavimo kalba numato. C kompiliatorius yra daug paprastesnis nei C++ arba C# kompiliatorius.
Leksinė analizė
Kompiliuodamas kompiliatorius pirmiausia nuskaito simbolių srautą iš šaltinio kodo failo ir generuoja leksinių žetonų srautą. Pavyzdžiui, C++ kodas:
|_+_||_+_|gali būti analizuojami kaip šie žetonai:
- įveskite 'int'
- kintamasis 'C'
- lygus
- kairysis skliaustas
- kintamasis 'A'
- laikai
- kintamasis 'B'
- dešinysis skliaustas
- pliusas
- pažodinis '10'
Sintaksinė analizė
Leksinė išvestis patenka į kompiliatoriaus sintaksinio analizatoriaus dalį, kuri naudojasi gramatikos taisyklėmis, kad nuspręstų, ar įvestis tinkama, ar ne. Nebent kintamieji A ir B buvo anksčiau deklaruoti ir buvo taikomi, sudarytojas gali pasakyti:
- 'A': nedeklaruotas identifikatorius.
Jei jie buvo deklaruoti, bet nebuvo inicijuoti. Kompiliatorius pateikia įspėjimą:
- vietinis kintamasis „A“ naudojamas be inicijavimo.
Niekada neturėtumėte ignoruoti kompiliatoriaus įspėjimų. Jie gali sugadinti jūsų kodą keistais ir netikėtais būdais. Visada pataisykite kompiliatoriaus įspėjimus.
Vienas leidimas ar du?
Kai kurios programavimo kalbos parašytos taip, kad kompiliatorius gali tik vieną kartą nuskaityti šaltinio kodą ir sugeneruoti mašinos kodą. Paskalis yra viena iš tokių kalbų. Daug kompiliatoriai reikia bent dviejų leidimų. Kartais taip yra dėl išankstinių deklaracijų funkcijas arba klases.
C++ kalboje klasę galima deklaruoti, bet apibrėžti tik vėliau. Kompiliatorius negali nustatyti, kiek atminties reikia klasei, kol nesukompiliuoja klasės turinio. Prieš generuodamas tinkamą mašinos kodą, jis turi perskaityti šaltinio kodą.
Mašinos kodo generavimas
Darant prielaidą, kad kompiliatorius sėkmingai užbaigia leksinę ir sintaksinę analizę, paskutinis etapas yra mašininio kodo generavimas. Tai sudėtingas procesas, ypač naudojant šiuolaikinius procesorius.
Sudarymo greitis vykdomasis kodas turi būti kuo greitesnis ir gali labai skirtis priklausomai nuo sugeneruoto kodo kokybės ir optimizavimo.
Dauguma kompiliatorių leidžia nurodyti optimizavimo apimtį – paprastai žinoma dėl greito derinimo kompiliacijų ir visiško išleisto kodo optimizavimo.
Kodo generavimas yra sudėtingas
Rašydamas kodo generatorių, kompiliatoriaus rašytojas susiduria su iššūkiais. Daugelis procesorių pagreitina apdorojimą naudodami
- Instrukcijų vamzdynas
- Vidinis talpyklos .
Jei visos instrukcijos kode kilpa galima laikyti CPU talpyklą, tada ši kilpa veikia daug greičiau nei tada, kai procesorius turi gauti instrukcijas iš pagrindinės RAM. CPU talpykla yra atminties blokas, integruotas į procesoriaus lustą, kuris pasiekiamas daug greičiau nei duomenys pagrindinėje RAM.
Talpyklos ir eilės
Dauguma procesorių turi išankstinio gavimo eilę, kurioje CPU nuskaito instrukcijas į talpyklą prieš jas vykdydamas. Jei įvyksta sąlyginė šaka, centrinis procesorius turi iš naujo įkelti eilę. Kodas turi būti sugeneruotas, kad tai būtų sumažinta.
Daugelis procesorių turi atskiras dalis:
- Sveikųjų skaičių aritmetika (sveiki skaičiai)
- Slankaus kablelio aritmetika (trupmeniniai skaičiai)
Šios operacijos dažnai gali būti vykdomos lygiagrečiai, kad padidėtų greitis.
Kompiliatoriai paprastai generuoja mašininį kodą į objektų failus, kurie tada yra susieta kartu su linkerio programa.