Kad god napišete kod u C programskom jeziku bez grešaka u bilo kojem tekstualnom editoru i napravite tekstualni fajl, vi možete pozvati C kompajler da isti fajl prevede u mašinski kod i vaš program će da radi. Jednostavno, kompajler pokreće „Translation Unit“ , jedinicu koju nazivamo „prevodilac“ ili „jedinica za prevođenje“ koji se sastoji od izvorne datoteke i datoteka zaglavlja koje se navode pomoću direktiva #include. Ukoliko vaš kod nema grešaka, prevodilac pravi „Object File“ – objektnu datoteku koju će te prepoznati po sufiksu .o ili .obj i upravo te objektne datoteke zovemo i moduli. Biblioteka poput standardne biblioteke programskog jezika C sadrži prevedene objektne datoteke na mašinski jezik i na taj način brže pristupa standardnim funkcijama iz objektnih datoteka koje pozivamo u našim programima. Da ne bi bilo zabune, kad kažem da se datoteka prevodi na mašinski jezik kod C programskog jezika; onda mislim da se prvo datoteka prevodi na „Assembly“ – asemblerski programski jezik u privremenu datoteku koja se onda prevodi na mašinski jezik i posle se ista briše. Takvu datoteku će te prepoznati po sufiksu .s prilikom kompajliranja programa. Kod .Net tehnologije i C# programskog jezika, stvari su drugačije.
( Proces C kompajliranja od izvršnih datoteka do izvršnog fajla )
Prevodilac
prevodi zasebno svaku izvornu datoteku sa svim datotekama zaglavlja koje sadrži
u razdvojene objektne datoteke tj. module. Prevodilac onda poziva „Linker“ –
pokazivač, koji kombinuje sve objektne datoteke i sve korišćene funkcije iz
biblioteke u „Executable File“- izvršnu datoteku.
Kroz
koje sve faze prolazi proces prevođenja C programskog jezika?
Proces
prevođenja se izvodi u 8 logičkih koraka, stime da prevodilac može da kombinuje
nekoliko faza sve dok to ne utiče na rezultat.
1. Faza
Iz izvorne tekstualne datoteke čitaju se
znakovi i tamo gde je potrebno se prevode u znakove iz skupa izvornih datoteka.
Svi trigrafi se pretvaraju u znak koji predstavljaju. Trigrafi su troznakovne
leksičke jedinice:
·
??( - ekvivalent [
·
??) - ekvivalent ]
·
??< - ekvivalent {
·
??> - ekvivalent }
·
??= - ekvivalent #
·
??/ - ekvivalent \
·
??! - ekvivalent |
·
??’ - ekvivalent ^
·
??- - ekvivalent ~
Digrafi se ne zamenjuju odgovarajućim
znakom. Digrafi su dvoznakovne leksičke jedinice:
·
<: - ekvivalent [
·
:> - ekvivalent ]
·
<% - ekvivalent {
·
%> - ekvivalent }
·
%: - ekvivalent #
·
%:%: - ekvivalent ##
Indikatori kraja reda biće zamenjeni
izuzev znaka za novi red. Svaka izvorna datoteka mora da se završi znakom za
novi red ukoliko nije prazna.
2. Faza
Ako se iza znaka za novi red nalazi „\“ –
obrnuta kosa crta, pretprocesor briše oba znaka. Pošto se pretprocesorska
direktiva završava znakom za kraj reda, ovo brisanje omogućava da stavite
obrnutu kosu crtu na kraj reda kako bi ste naredbu nastavili u sledećem redu.
3. Faza
Izvorna datoteka se razlaže na
pretprocesorske tokene i na sekvence razmaka. Tokeni su vam npr:
·
Printf
·
(
·
„Hello World. \n“
·
)
·
;
…
Svaki komentar tumači se kao jedan razmak.
4. Faza
Izvršavaju se pretprocesorske direktive i
proširuju pozivi makroa. Makro vam je u stvari naredba, prečica, automatizovana
procedura ili radnja. Postoje tasterski i programerski makroi. Tasterski makroi
beleže i reprodukuju akcije pritiska na taster ili kretanje miša, dok
programerski makroi su u suštini programirana rutina.
Sve 4 faze, primenjuju se za sve datoteke
umetnute direktivom #include. Kad prevodilac izvrši pretprocesorske direktive,
uklanja ih iz svoje radne kopije izvornog koda.
5. Faza
Svi znakovi i izlazne sekvence u znakovnim
konstantama i literalima znakovnih nizova, pretvaraju se u odgovarajuće znakove
iz izvršnog skupa znakova.
6. Faza
Susedni literali se međusobno nadovezuju i
spajaju u jedan znakovni niz.
7. Faza
Odvija se prevođenje, prevodilac analizira
sekvencu tokena i generiše odgovarajući mašinski kod.
8. Faza
Povezivač izdvaja reference na spoljne
objekte i funkcije i generiše izvornu datoteku. Ako se u modulu poziva spoljni
objekat ili funkcija koji nisu definisani ni u jednoj jedinici za prevođenje,
povezivač ih uzima iz standardne biblioteke. Spoljni objekti i funkcije smeju
se definisati samo u jednom programu.
Na
kraju bi dodao da pretprocesor je zaseban program i on može da obavlja samo
faze pretprocesiranje tj. faze od 1 do 4. U novijim programskim jezicima
procesi su drugačiji jer pored leksičkih analiza, pretprocesiranja, parsiranja,
semantički analiza, generišu i optimizuju kod.
( Proces kompajliranja kod novijih programskih jezika )
Nema komentara:
Objavi komentar