четвртак, 06. август 2015.

Kako radi kompajler C programskog jezika?


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 )