Programski jezik C organizacija izvornog programa
Prevođenje Pisanje programa izvorni program Prevođenje programa izvršni program Izvršavanje programa rezultat Faze prevođenja Pretprocesiranje Kompilacija Povezivanje Greške 2
Pretprocesiranje Pripremna faza kompilacije Omogućava da se izvorni kod pogodno organizuje u više ulaznih datoteka Pretprocesor formira i prosleđuje kompilatoru jedinice prevođenja Na primer, u program.c uključuje se datoteka zaglavlja stdio.h Rezultat pretprocesora, na primer: gcc E program.c 3
Pretprocesiranje Pretprocesor ne koristi znanje o C jeziku Analizira samo pretprocesorske direktive Najčešće korišćene direktive su #include i #define #include uključuje sadržaj druge datoteke #define zamenjuje neki tekst, makro, drugim tekstom Makro može da sadrži i argumente Direktiva uslovnog prevođenja Određeni deo programa se prevodi samo ako su ispunjeni određeni uslovi 4
include U datoteku koja se prevodi uključuje sadržaj druge datoteke: #include ime_datoteke ili #include <ime_datoteke> U prvom slučaju, datoteka koja se uključuje traži se u okviru direktorijuma u kojem se nalazi datoteka u koju se vrši uključivanje (kao i u posebnom skupu direktorijuma include path) U drugom slučaju, datoteka se traži u sistemskom include direktorijumu u kojem se nalaze standardne datoteke zaglavlja Njegova lokacija zavisi od sistema i od C prevodioca koji se koristi 5
define Omogućava zamenu jednog teksta (niza karaktera, makroa) drugim tekstom (nizom karaktera), pre samog prevođenja #define originalni_tekst novi_tekst Originalni_tekst se zove i simboličko ime U najjednostavnijem obliku, ova direktiva koristi se za zadavanje vrednosti nekom simboličkom imenu, na primer: #define MAX_LEN 80 6
define Simboličko ime se lako menja Razlikuje se od konstantne promenljive (const) Ne rezerviše se prostor tokom izvršavanja programa već se svako pojavljivanje zamenjuje zadatim novim tekstom (vrednošću) PRE prevođenja 7
define Zamene se ne vrše u konstantnim stringovima niti u okviru drugih simboličkih imena Na primer, #define MAX_LEN 80 ne utiče na naredbu printf( "MAX_LEN is 80"); niti na simboličko ime MAX_LEN_VAL 8
define Moguće je definisati i pravila zamene sa argumentima od kojih zavisi tekst zamene Na primer, sledeća definicija #define max(a,b) ((A)>(B)? (A) : (B)) definiše tekst zamene za max(a, B) koji zavisi od argumenata Tekst max(x+2, 3*y) biće zamenjen tekstom ((x+2)>(3*y)? (x+2) : (3*y)) 9
define Tekst max(2, 3) ne predstavlja poziv funkcije i nema nikakvog prenosa argumenata kao kod pozivanja funkcija Šta se dešava za max(a++, b++)? 10
define Tekst max(2, 3) ne predstavlja poziv funkcije i nema nikakvog prenosa argumenata kao kod pozivanja funkcija Šta se dešava za max(a++, b++)? ((a++)>(b++)? (a++) : (b++)) 11
define Zagrađivanje je veoma važno zbog prioriteta operacija Na primer, makro #define kvadrat(x) x*x kvadrat(a+2) #define kvadrat(x) (x)*(x) a/kvadrat(b) #define kvadrat(x) ((x)*(x)) 12
Kompilacija leksička analiza: izdvajanje leksema, osnovnih jezičkih elemenata; sintaksička analiza: kreiranje sintaksnog stabla; semantička analiza: provera semantike ili kontekst-osetljiva analiza (npr. provera tipova, deklarisanje pre korišćenja); generisanje međukoda: generisanje koda na jeziku interne reprezentacije; optimizacija međukoda: optimizovanje generisanog koda; generisanje koda na mašinskom jeziku: prevođenje optimizovanog koda u objektne module 13
Kompilacija Kompilacijom se od svake jedinice prevođenja gradi zasebni objektni modul (engl. object module) Objektni moduli sadrže programe na mašinskom jeziku i podatke (memorijski prostor rezervisan za promenljive) Objektni moduli još ne mogu da se izvršavaju (iako su u mašinskom obliku) 14
Povezivanje Povezivanje je proces kreiranja jedinstvene izvršne datoteke od jednog ili više objektnih modula Moduli su nastali kompilacijom izvornog koda programa ili sadrže mašinski kod i podatke standardne biblioteke ili neke nestandardne biblioteke Statičko povezivanje: posle kompilacije Dinamičko povezivanje: tokom izvršavanja programa (u stvari na početku) Opcijama kompilatora moguće je izvršiti samo kompilaciju (-C) ili sačuvati rezultat svih faza prevođenja: $ gcc -save-temps main.c $ ls a.out main.c main.i main.o main.s 15
Punilac Posle uspešnog prevođenja program može da se izvršava Izvršni programi smešteni su u datotekama na disku i pre pokretanja učitavaju se u glavnu memoriju Za ovo je zadužen program koji se naziva punilac (engl. loader) koji je obično integrisan u operativni sistem Proverava da li korisnik ima pravo da izvrši program, prenese program u glavnu memoriju, prekopira argumente komandne linije u odgovarajući deo memorije inicijalizuje određene registre u procesoru i na kraju da pozove početnu funkciju programa 16
Greške u fazi pretprocesiranja #Include<stdio.h> int main() { int a = 9; if (a == 9) printf("9"); return 0; } primer.c:1:2: error: invalid preprocessing directive #Include 17
Greške kompilacija leksička analiza #include<stdio.h> int main() { int a = 09; if (a == 9) printf("9"); return 0; } error: invalid digit "9" in octal constant 18
Greške kompilacija sintaksna analiza #include<stdio.h> int main() { int a = 9; if a == 9 printf("9"); return 0; } error: expected ( before a 19
Greške kompilacija semantička analiza #include<stdio.h> int main() { int a = 9; if ("a" * 9) printf("9"); return 0; } error: invalid operands to binary * (have char * and int ) 20
Greške kompilacija semantička analiza #include<stdio.h> int main() { int a = 9; if ("a" * 9) printf("9"); return 0; } error: invalid operands to binary * (have char * and int ) 21
Greške povezivanje #include<stdio.h> int main() { int a = 9; if (a == 9) print("9"); return 0; } undefined reference to print collect2: ld returned 1 exit status 22
Upozorenja - primer #include<stdio.h> int main() { } int a = 9; if (a = 9) return 0; printf("9"); warning: suggest parentheses around assignment used as truth value 23
Upozorenja - primer #include<stdio.h> int main() { int a = 9; if (a / 0) printf("9"); return 0; } warning: division by zero 24
Upozorenja - primer #include<stdio.h> int main() { int a = 9; if (9 == 9) printf("9"); return 0; } warning: unused variable a 25
Greške pri izvršavanju programa Prekid izvršavanja programa Nesmetano izvršavanje programa Korektnost Dokazivanje Testiranje Alati za testiranje Debageri 26