Programski jezici I

Download Report

Transcript Programski jezici I

Programski jezici I
Uvod
Miloš Stojanović
Definicija programskih jezika



PJ nastaju sa razvojem računara, iz
potrebe da se pojednostavi pisanje
programa za njih
Zato kažemo da su PJ sredstvo
komunikacije između ljudi i računara
Def: Veštački jezik za izradu programa,
sastavljen od simbola koje računar može
da prevede u direktne radnje.
Mašinski jezici



Prvi programi pisani su na mašinskom
jeziku (binarni kod)
Naredbe i podaci se predstavljaju binarno,
nizovima jedinica i nula
Primer:
0001 1101 1000 0000
0000 0000 1111 1111
0001 1100 0000 0000
Mašinski jezici
0000 0000 1111 1100
0001 1110 0000 0000
0000 0000 0111 0010


U okviru mašinske naredbe svaka binarna cifra
na određenom mestu ima unapred definisano
značenje i odgovara upravljačkom signalu kojim
se inicira određena aktivnost procesora
Sprega između mašinskog koda i procesora je
direktna i neposredna
Mašinski jezici


Programiranje u mašinskom kodu zahteva
detaljno poznavanje strukture procesora i
potpunu kontrolu nad smeštanjem koda
programa i podataka u operativnoj
memoriji računara
Sve to postaje previše komplikovano, tako
da je u praksi neprimenjljivo
Mašinski jezici

U cilju pojednostavljivanja upotrebe
računara, počinju da se razvijaju simbolički
jezici, slični jezicima kojima komuniciraju
ljudi
Klasifikacija PJ po stepenu
zavisnosti od računara




Po stepenu zavisnosti od računara razlikuju se
mašinski zavisni i mašinski nezavisni PJ
U mašinski zavisne jezike svrstavaju se jezici koji
su u direktnoj zavisnosti sa procesorom na kome
se program izvršava
To su mašinski jezik i asemblerski i makro
asemblerski jezici
Oni čine grupu jezika niskog nivoa
Klasifikacija PJ po stepenu
zavisnosti od računara

Grupu maš. nezavisnih jezika cine PJ
visokog nivoa ili proceduri orjentisani PJ i
PJ veoma visokog nivoa ili problemu
orjentisani PJ (aplikativni)
Klasifikacija PJ po stepenu
zavisnosti od računara
Razvoj PJ




Prvi korak ka pojednostavljivanju maš. jezika
napravljen je korišćenjem heksadecimalnog koda
za skraćeno zapisivanje binarnih nizova
Time se dobija samo to da su zapisi binarnih
nizova četiri puta kraći, tj. ne dobija se na
razumljivosti koda za ljude
Za konverziju hex. koda u binarni dovoljan je
samo konvertor koda koji se lako realizuje kao
prekidačka mreža
Napr: bin naredba 0000 1111 1010 0011 bi u
hex kodu bila zapisana kao 0FA3
Razvoj PJ




Sledeći korak u razvoju PJ su asemblerski jezici
Asemblerske naredbe su u suštini skraćeno
zapisane mašinske naredbe
Umesto binarnih nizova koriste se simbolička
imena za predstavljanje pojedinih delova naredbi
Simbolička imena se koriste i umesto apsolutnih
adresa naredbi i podataka
Razvoj PJ

Primer:
LD $R1, <A
ADD $R1, <B
STO $R1, <C
A DS 5
B DS 7
C DS
Razvoj PJ


Prvom naredbom broj 5 koji je smešten u
mem. lokaciju koja je u programu
simbolički označena sa A se prenosi u
registar procesora R1
Drugom naredbom se sadržaj registra R1
sabira sa sadržajem memorijske lokacije
imenovane sa B (broj 7). Rezultat
sabiranja ostaje u registru R1 procesora.
Razvoj PJ


Trećom naredbom se zbir iz registra R1
prenosi u mem. lokaciju imenovanu sa C
koja je rezervisana za smeštanje rezultata
Mašinski kod iz prethodnog primera je
ekvivalentan ovom asemblerskom kodu i u
njemu se umesto simboličkih kodova
operacije i simboličkih adresa mem.
lokacija i registara koriste binarni kodovi i
apsolutne adrese
Razvoj PJ

Za prevođenje asemblerskih jezika u
mašinske koriste se programski moduli
koji se nazivaju asembleri po čemu su i
asemblerski jezici dobili naziv
kod na
asemblerskom
jeziku
asembler
mašinski kod
programa
računar
podaci
rezultati
Razvoj PJ



Kod naprednijih asemblerskih jezika
postoji mogućnost za definisanje makro
naredbi, koje predstavljaju sekvence više
asemblerskih naredbi
Jednom definisane makro naredbe mogu
se višestruko koristiti u programu u kome
su definisane
PJ sa ovom mogućnošću se nazivaju
makroasemblerski jezici
Razvoj PJ
kod na makro
asemblerskom
jeziku
makroprocesor
kod na
asemblerskom
jeziku
asembler
mašinski kod
programa
računar
podaci
rezultati
Razvoj PJ



Sledeći korak u razvoju PJ su viši PJ kod
kojih se program definiše prema proceduri
opisanoj algoritmom i u okviru kojih
obično postoje koncepti za predstavljanje
standardnih algoritamskih koraka
To su algoritamski ili proceduralni jezici
Pojavili su se krajem pedesetih i početkom
seždesetih godina dvadesetog veka
Razvoj PJ


Njihov razvoj traje do danas, ma da su
osnovni koncepti ostali isti
Program se piše kao sekvenca naredbi sa
unapred
definisanom
sintaksom,
sastavljenih od reči engleskog jezika, a
prevodi se u asemblerski odnosno
mašinski
kod
pomoću
programskih
prevodilaca (kompajlera)
Kompilatori i interpretatori



Za prevođenje sa viših PJ u mašinski kod
se koriste kompilatori i interpretatori
Kompilatori prevode kod u celini i
formiraju izvršnu datoteku sa mašinskim
kodom programa, koji se zatim smešta u
memoriju računara i izvršava
Kod interpretatora faza prevođenja se
prepliće sa fazom izvršenja
Kompilatori i interpretatori
Kompilatori i interpretatori

U fazi leksičke analize, leksički analizator
(lekser) čita izvorni program karakter po
karakter, i u njemu pokušava da
identifikuje leksičke jedinice (lekseme) od
kojih je sačinjen izvorni jezik. Lekseme se
grupišu u apstraktne klase, tokene, kao
što su: celi brojevi, realni brojevi, nizovi
karaktera, rezervisane reči, identifikatori i
slično. Ovi tokeni se zatim proslećuju
sintaksičkom analizatoru.
Kompilatori i interpretatori

Zadatak sintaksičke analize je da se utvrdi
da li je program u skladu sa gramatičkim
pravilima programskog jezika u kome je
pisan. U fazi sintaksičke analize se od niza
tokena koje je prosledio leksički analizator
generiše stablo sintaksne analize, koje
predstavlja apstraktnu predstavu strukture
programa.
Kompilatori i interpretatori


Interpretatori
prevode
naredbu
za
naredbom i čim se dobije celina koja može
da se izvrši ona se izvršava
Postoji i hibridni sistem koji kombinuje
prethodna dva pristupa, tj prvo se vrši
prevođenje programa do nivoa nekog
međukoda, zatim se naredba po naredba
interpretira (JAVA)
Kompilatori i interpretatori
Kompilatori i interpretatori



Svi nabrojani pristupi imaju svoje
prednosti
Komandni jezici i jezici koji se koriste za
interaktivnu komunikaciju sa računarom se
obično realizuju kao interpretatorski
Za pisanje programa koji treba da se
izražavaju u realnom vremenu koriste se
kompilatorski jezici (PASAL, C, C++, ...)
Kompilatori i interpretatori



U mrežnim okruženjima gde je od značaja
da se programi pisani na jednoj mašini
mogu izvršavati na različitim mašimama u
mreži koristi se hibridni sistem prevođenja
Tipiačan pretstavnik PJ-a koji koristi ovu
tehniku je JAVA.
Prevođenje JAVA programa se vrši u dva
koraka:
Kompilatori i interpretatori


U prvom koraku izvorni (source) kod se
pomoću kompilatora prevodi u međukod
(bytecode) koji je nezavisan od mašine na
kojoj će se program izvršavati
U drugoja fazi se ovaj međukod
interpretira pomoću java interpretatora
(java virtual machine). Naredba po
naredba se prevodi na mašinski jezik i
odmah izvršava
Kompilatori i interpretatori

Time je omogućena nezavisnost od
hardvera na kome sa java program
izvršava, uz ograničenje da na tom
hardveru postoji java virtual macine
Loaderi


Nakon procesa kompilacije programa
potrebno je program smestiti u operativnu
memoriju računara (rezervisati adresni
prostor potreban za njegovo izvršenje)
smeštanje programa u OM obavlja
program "punilac" - loader koji može biti
zasebna celina, ma da je uglavnom
integrisan u "povezivač" - linker
Linkeri



Zadatak linkera je da kodu doda bibliotečki
kod (bibliotečke funkcije) i kod za početno
povezivanje sa operativnim sistemom
linker i loader su uglavnom integrisani u
jednu celinu, koja ide uz kompajler
Operacije
kompajliranja,
povezivanja,
smeštanja programa u OM su "prikrivene"
od aplikativnog programera i on o njima
ne mora voditi računa, tj njegov posao je
"samo" da unese ispravan izvorni kod
programa