-
1Uvodne napomene
O programskim jezicimaFunkcionalni stil programiranja
Evolucija funkcionalnih programskih jezika
Autor prezentacije: Milo Radovanovi
Sadraj O programskim jezicima Funkcionalni stil
programiranja
Nepostojanje eksplicitnog zadavanja redosleda izvravanja
Nepostojanje naredbi Nepostojanje sporednih efekata Funkcije kao
ravnopravni objekti Ne-striktna semantika Statiko vezivanje O
funkcionalnim jezicima
Evolucija funkcionalnih programskih jezika Osnove Lambda rauna
LISP Iswim FP ML SASL, KRC, Miranda Haskell
-
2O programskim jezicima Proces izraunavanja je niz (skup) radnji
koje
raunar treba da izvri reavajui dati zadatak Programski jezici su
jedan od naina da se
raunaru saopti ta i kako da izvri Proces reavanja zadatka na
raunarima:
Ralaniti sloeni zadatak na niz jednostavnijih Jednostavni zadaci
= koraci u reenju koje raunar
moe neposredno da rei (izvri) Ralanjivanje vri ovek Ralanjivanje
= programiranje Dobijeni niz koraka se saoptava raunaru pomou
programskog jezika
O programskim jezicima
Programski jezici su vetaki jezici dizajniranitako da
ispunjavaju odreene zahteve Jednoznanost, prihvatljivost za raunar,
razumljivost
za oveka... Postoje hiljade programskih jezika Optu sliku moemo
stei posmatranjem
razliitih klasifikacija programskih jezika Svaka klasifikacija
naglaava jedan kriterijum Ni jedna klasifikacija nije idelana
-
3Klasifikacija po vremenu nastanka(I) Kriterijum: Vreme
nastanka
1. 19541958. jezici prve generacije Ustanovili osnove jezika i
koncepte implementacije: FORTRAN, ALGOL
58, Flowmatic...2. 19591969. jezici druge generacije Proirili,
dogradili, uobliili koncepte jezika prve generacije, neki se jo
uvek koriste: FORTRAN II, ALGOL 60, COBOL 61, LISP3. 19621991.
jezici tree generacije PL/I, ALGOL 68, Pascal, Simula: ne toliko
uspeni (sem Pascala) Generacijski jaz 197079: CLU, CSP, Ada,
Smalltalk pomak ka
strukturama podataka i softverskom inenjerstvu Od 1980. naovamo
razvijaju se stilovi programiranja i odgovarajui
jezici: objektno-orijentisani, distribuirani, funkcionalni,
relacioni, i dr.4. Od 1991. jezici etvrte generacije Jezici u
sistemima za upravljanje bazama podataka, spreadsheet
programima, i uopte script jezici: SQL, jezik Lotusa, dBASE
IV
Klasifikacija po zavisnosti od raunara
(II) Kriterijum: Stepen zavisnosti od raunara Mainski zavisni
jezici
Mainski, simboliki (asemblerski), makro jezici Mainski nezavisni
(vii) jezici
Jezici koji se mogu koristiti na razliitim tipovimaraunara:
FORTRAN, BASIC, Pascal, LISP,PROLOG, Ada...
Ovi jezici danas najznaajniji, potrebna
preciznijasistematizacija
-
4Klasifikacija po oblasti primene(III) Kriterijum: Oblast najee
primene
1. Matematika i tehnika FORTRAN, ALGOL...
2. Poslovna primena COBOL, RPG...
3. Edukativne svrhe Pascal, BASIC...
4. Vetaka inteligencija LISP, PROLOG
5. Univerzalni jezici PL/I, Ada...
6. ... Mogue je dodati mnogo drugih klasa Neki jezici imaju
obeleja vie klasa Teko je biti precizan
Klasifikacija po nainu reavanja problema
(IV) Kriterijum: Nain reavanja problema Proceduralni
(imperativni)
Jezici zasnovani na naredbama Opisuje se KAKO se problem reava
Pascal, C, FORTRAN, COBOL, Ada...
Deklarativni (deskriptivni) Tei se opisu problema, ne nainu
reavanja Opisuje se TA se reava Dve potklase:
Funkcionalni: LISP, APL, Miranda, Haskell... Logiki: PROLOG,
KLO, Mandala...
-
5Funkcionalni stil programiranja
Kod funkcionalnog stila programiranja,izraunavanje, odnosno
izvravanje programazasnovano na pojmu funkcije
Kod logikog stila osnovni pojam je relacija Funkcionalni stil
karakteriu samo tri aktivnosti:
Definisanje funkcije Primena funkcije na argumente Kompozicija
funkcija
Funkcionalni stil programiranja Program funkcionalnog stila je
niz definicija i
poziva funkcija Izvravanje programa je proces izraunavanja
vrednosti funkcije (funkcija) Program poinje da se izvrava
primenom jedne
od definisanih funkcija na stvarne argumente Primer Program:
f(x) = x2 + 1
g(x, y) = f(x) + 2yz(x) = g(x, 2) 1
Izvravanje programa:z(1) = g(1, 2) 1 = (f(1) + 4) 1 = ((1+1) +
4) 1 = 5
-
6Funkcionalni stil programiranja Da bi pristup funkcionisao, u
definiciji funkcije mogu se
koristiti Uslovni izrazi Pozivi iste funkcije (rekurzija)
Izraajne mogunosti funkcionalnog stila nisuograniene
tavie, mali broj aktivnosti i koncepata dovodi doprograma koji
su: Jasni i koncizni esto krai od proceduralnih ekvivalenata Kod
kojih je tee napraviti greku (i lake otkriti postojeu) Koji se lako
mogu realizovati na paralelnim raunarima iju je ispravnost mogue (u
nekim sluajevima) formalno
dokazati
Karakteristike funkcionalnog stila
Nepostojanje eksplicitnog zadavanjaredosleda izvravanja
Nepostojanje naredbi Nepostojanje sporednih efekata Funkcije kao
ravnopravni objekti Ne-striktna semantika Statiko vezivanje
-
7Nepostojanje redosleda izvravanja
Funkcionalni stil ne poznaje eksplicitno zadavanjeredosleda
izraunavanja vrednosti funkcija
Program imperativnog stila: spisak naredbi Program funkcionalnog
stila: izraz
Primer Program za gradnju kolibe
Imperativni Funkcionalni- postaviti temelje - zidovi se
oslanjaju na pod- sazidati zidove - pod se oslanja na temelje-
postaviti pod - krov se oslanja na zidove- postaviti krov
Nepostojanje redosleda izvravanja Primer Program za raunanje
faktorijela
fac(n)if n = 0 then 1else n*fac(n-1)
rez := 1;while n>0 do begin
rez := rez*n;n := n-1
end;
FunkcionalniImperativni
Odsustvo ekspliticnog redosleda izvravanja: Poveava deklarativna
svojstva programa Smanjuje mogunost greaka (zadavanje pogrenog
redosleda naredbi)
Funkcionalni programi: statiki Opisuju odnose, izraavaju
definiciju problema
Imperativni programi: dinamiki Zasnovani na promenama stanja
koje se izvode u datom redosledu
-
8Nepostojanje naredbi
Imperativni stil zasnovan na postojanju stanja Stanje je sadrano
u memorijskim lokacijama Na stanje se utie konstrukcijama jezika,
tj.
naredbama dodele, koje se izravaju uodreenom redosledu
Kod odreivanja redosleda koriste se petlje(while, repeat,
for...) i uslovne naredbe (if, case)
Rezultat izraunavanja se smeta na odreenulokaciju u memoriji
(npr. promenljiva rez)
Nepostojanje naredbi U funkcionalnom stilu nema stanja, ni
naredbi Umesto naredbi: izrazi Petlje se ostvaruju rekurzijom
Analogon uslovnim naredbama su uslovni izrazi Rezultat izraunavanja
se ne stavlja eksplicitno
na neku memorijsku lokaciju, ve ceo programpredstavlja izraz
koji oznaava vrednost
Ako ipak elimo da definiemo i menjamo nekostanje, to se postie
eksplicitnim prenoenjemstanja u sve izraze
-
9Nepostojanje naredbi Primerfac(n) f(n,1)f(n,a) if n>0 then
f(n-1,a*n)else a Odsustvo naredbi i eksplicitno prenoenje
stanja: Poveavaju deklarativnost i jasnou programa Smanjuju
mogunost greke jer onemoguuju
sporedne efekte Mogu dovesti do problema pri podeli sloenog
zadatka na jednostavnije, zbog gomilanja parametarakojim se
prenose stanja
Nepostojanje sporednih efekata U funkcionalnom stilu ne postoje
sporedni efekti:
Isti izraz u istoj okolini uvek oznaava istu vrednost Funkcija
pozvana sa istim argumentima uvek daje isti rezultat
Primer Izraz x2 + 1 za x = 3 uvek ima vrednost 10 ln(e) uvek ima
vrednost 1
Nepostojanje sporednih efekata omoguava da se sviizrazi koji
oznaavaju istu vrednost mogu zameniti jednidrugima Osobina poznata
u matematikoj logici kao ekvivalentnost
pominjanja (referential transparency) Primer Ako je y = x2 + 1,
tada se izraz y + y moe
pisati i kao x2 + 1 + y, y + x2 + 1 ili x2 + 1 + x2 + 1
-
10
Nepostojanje sporednih efekata U procedurnom stilu sporedni
efekti se postiu naredbom dodele Moe dovesti do greaka koje se teko
otkrivaju Primer
...VAR a, x: INTEGER;...FUNCTION Fun(i: INTEGER): BOOLEAN;BEGINa
:= a + 1;
Fun := i = aEND;...a := 0; x := 1;IF Fun(x) = Fun(x)
THENWrite(Jednako)ELSEWrite(Nejednako)...
Funkcije kao ravnopravni objekti Funkcije su ravnopravni objekti
sa svim drugim
tipovima podataka Mogu se prosleivati drugim funkcijama kao
argumenti Mogu se smetati u strukture podataka Mogu biti
vrednosti (rezultati izvravanja) drugih
funkcija Funkcije koje rukuju drugim funkcijama kao
podacima nazivaju se funkcije vieg reda (higherorder
functions)
Uporedivi pojmovi u matematici: izvod,neodreeni integral
-
11
Ne-striktna semantika Semantika jezika (stila programiranja) je
striktna ako je
svaki izraz striktan (uklj. pozive funkcija) Izraz je striktan
akko nema vrednost kada bar jedan od
njegovih operanada nema vrednost Izraz nije striktan ako moe da
ima vrednost ak i ako
neki od operanada nemaju vrednost Primer
a = true, b je nedefinisan, koja je vrednost izraza a b?A koja
je vrednost izraza car(a . b)?
Ne-striktna semantika U imperativnom stilu samo su logiki izrazi
ne-striktni U funkcionalnom stilu svi izrazi mogu biti ne-striktni
Realizacija striktne semantike:
Prvo se izraunaju svi operandi izraza (odnosno
argumentifunkcije), pa tek onda vrednost samog izraza
Prenoenje argumenata po vrednosti (call by value)
Realizacija ne-struktne semantike: Izraunavanje operanada izraza
(argumenata funkcije) se odlae
dok njihove vrednosti ne budu potrebne Zadrano (lenjo)
izraunavanje (lazy evaluation), ili princip
odlaganja Prenoenje argumenata po potrebi (call by need)
-
12
Ne-striktna semantika
Prednosti ne-striktne semantike Vea brzina izvravanja Oslobaa
programera brige o redosledu
izraunavanja i moguim grekama u tokuizraunavanja
Primer x = 0 1 / x = 10 Omoguava kreiranje beskonanih
struktura
Primer Neka je a = (1 . a)Koja je vrednost izraza car(a)?
Statiko vezivanje
Dinamiko vezivanje: Promenljive se zavrednost vezuju u toku
izvravanja programa
Statiko vezivanje: Promenljive se za svojuvrednost vezuju u toku
definisanja
Primer neka_je n = 1 ineka_je f(z) = z+n i
neka_je n = 2u_izrazu f(3)
Koja je vrednost izraza f(3)?
-
13
O funkcionalnim jezicima Pomenute karakteristike odreuju
funkcionalni stil
programiranja Funkcionalni stil je nekad mogue imitirati u
jezicima koji
preteno pripadaju nekom drugom stilu Matematika osnova: Lambda
raun Snaan razvoj funkcionalnih jezika od 1960-ih Tek noviji jezici
poseduju sve karakteristike Funkcionalni jezici mogu imati elemente
proceduralnih
(LISP), ili dozvoliti kontrolisanu upotrebu sporednihefekata
(ML)
isto funkcionalni jezici (purely functional languages):jezici
gde sporedni efekti nisu mogui
Evolucija funkcionalnihprogramskih jezika
Osnove Lambda rauna LISP Iswim ML SASL, KRC, Miranda Haskell
-
14
Osnove Lambda rauna 1930-ih i 40-ih matematiar Alonzo Church
radio na
Lambda raunu Lambda raun prvi funkcionalni (ne i programski)
jezik Motiv: formalizovati definiciju i primenu funkcije u
obliku
rauna Razliito od definisanja funkcija preko parova argumenata
i
vrednosti Lambda raun omoguio izraavanje osobine
izraunljivosti funkcije i definisanje funkcije u
najoptijemobliku (mogua primena na samu sebe)
Prikazaemo osnove Lambda rauna na intuitivan nain
Osnove Lambda rauna
Osnovni simboli: Imena identifikatora (jedno slovo) Znaci . (
)
Izraz Lambda rauna je jedan od sledeih: x (vrednost
identifikatora x) e1e2 (primena funkcije e1 na argument e2) x.e
(definicija funkcije, argument x, telo e)
Pri tome su e1, e2 i e izrazi Lambda rauna Zagradama se spreava
vieznanost
-
15
Osnove Lambda rauna Primer
x.x se moe posmatrati kao funkcija identiteta f(x) = x Funkcije
od vie argumenata se mogu definisati
ugneavanjem izraza Konvencija:
x1.(x2.( ... .(xn.e) ... ) = x1x2...xn.e Primer x.(y.xy) = xy.xy
Identifikatori izmeu i . su vezani identifikatori Kod primene
funkcije, ako ima vie od jedne primene
funkcije se primenjuju s leva na desno Primer e1e2e3 = (e1e2)e3
, a ne e1(e2e3)
Osnove Lambda rauna
Lambda izrazi se mogu transformisatipravilima za konverziju
Najei cilj uproavanje izraza idovoenje do tzv. normalne
forme
Pravila za konverziju: konverzija konverzija konverzija
-
16
Osnove Lambda rauna konverzija ili preimenovanje: svi vezani
identifikatori
u izrazu mogu se zameniti drugim identifikatorom Primer x.x
z.z
konverzija ili primena: izraz oblika (x.e1)e2 se moekonvertovati
u e1 gde su sve pojave identifikatora xzamenjene sa e2 Primer
(z.zx)w wx
(xy.xy)(z.z)w (y.(z.z)y)w (z.z)w
konverzija: izraz oblika x.ex se moe konvertovati ue ako x nije
vezani identifikator u e Primer (x.((y.yy)x)) (y.yy)
Osnove Lambda rauna Normalna forma je oblik izraza koji se ne
moe
dalje uproavati ili konverzijom Veina lambda izraza ima normalnu
formu Church i Rosser su pokazali da ako:
Ako izraz ima normalnu formu, ona je jedinstvena Nije bitan nain
na koji se do nje dolazi, to pogoduje
realizaciji na paralelnim raunarima Ako izraz ima normalnu
formu, tada postoji postupak
redukovanja s leva na desno koji sigurno dovodi donormalne
forme
Postupak je ekvivalentan zadranom (lenjom) izraunavanju
-
17
Osnove Lambda rauna Lambda izrazima se mogu izraziti:
Prirodni brojevi Funkcije i operacije nad prirodnim brojevima
Logike vrednosti Uslovni izraz (if-then-else) Rekurzija ...
Lambda izrazima se mogu predstaviti pravi
funkcionalniprogrami
Izraunavanje vrednosti izraza se svodi na primenu ili konverzije
dok se ne doe do normalne forme, kojapredstavlja rezultat
Principi funkcionalnog stila programiranja vidljivi ve uLambda
raunu
LISP LISP = LISt Processing Prvi funkcionalni programski jezik
Tvorac John McCarthy 1950-ih Namenjen simbolikom manupulisanju
podacima, za razliku od FORTRAN-a ija jenamena numerika
manipulacija
Primena u vetakoj inteligenciji Lambda raun nije uticao na
pojavu i
mogunosti prvog LISP-a LISP je zajedno sa Lambda raunom uticao
na
kasnije jezike
-
18
LISP
Osnovni doprinosi LISP-a: Uslovni izraz (if-then-else) Lista
(s-izraz) kao osnovna stuktura podataka Funkcije kao ravnopravni
objekti Automatsko dodeljivanje memorijskog
prostora u toku izvravanja programa iskupljanje otpadaka
(garbage collection)
LISP
Sami LISP programi imaju oblik s-izraza,tako da je jednostavno
programu damanipulie drugim programima
Osobine prvih verzija LISP-a: Sadravali i procedurne elemente
(naredba
dodele, redosled izvravanja) Striktna semantika Dinamiko
vezivanje
Operatori jezika zadaju se prefiksno
-
19
LISP Primer Faktorijel u LISP-u(define fac (n)(if (= n 0)1(* n
(fac (- n 1))))) LISP se razvio u mnogo verzija i nije
standardizovan Unapreenja uglavnom ila u smeru uvoenja
proceduralnih elemenata u LISP ak su i funkcije izgubile
ravnopravni status LispKit LISP i Scheme vratili istou jeziku
Uglavnom poseduju navedenih 6 karakteristika
Iswim Iswim = If you see what I mean Skup isto funkcionalnih
jezika sa zajednikom
osnovom Tvorac Peter Landin 1966. Nezavisan od LISP-a i snano
zasnovan na
Lambda raunu Doneo drugaiju sintaksu:
Program nije u obliku s-izraza, svaka konstrukcija unovom redu,
obavezno uvlaenje
Zamena izraza oznakama pomou LET i WHEREizraza
Infiksni operatori
-
20
Iswim
Iswim je bio prvi jezik sa atributomdeklarativan, i krivac je za
frazu TA seizraunava, a ne KAKO
Posedovao sve karakteristike funkcionalnog stilasem ne-striktne
semantike (iz tehnikih razloga)
Prvi jezik realizovan pomou apstraktnog SECDraunara
Nikad nije efikasno realizovan, koristio se samou istraivake
svrhe
FP FP = Functional Programming Prvi funkcionalni jezik koji je
privukao panju ire javnosti Tvorac John Backus 1977. (takoe jedan
od dizajnera
FORTRAN-a i ALGOL-a) Backus 1977. promovisao jezik u govoru na
dodeli
Turing-ove nagrade koju je dobio zbog doprinosaproceduralnim
jezicima Okarakterisao procedurni stil kao lo i kao odraz
arhitekture
raunara, i podrao funkcionalni stil Utvrdio da jezici zasnovani
na Lambda raunu nemaju
budunost i predloio pristup zasnovan na malom broju
tzv.kombinujuih oblika, to se nekad granii sa nerazumljivou
-
21
FP Primerexp = (2& eq() -> !1;
[1, 2& iota] & dist/ & @1 & /*)
Striktna semantika Na FP uticao APL (A Programming Language)
K. Iverson-a Kasniji razvoj funkcionalnih jezika je otiao u
drugom pravcu, kom se Backus prilagodio unovom jeziku FL
ML
ML = MetaLanguage Realizovan priblino kad je FP promovisan
Najprofesionalniji i najkompletniji funkcionalni
jezik u datom trenutku Tvorac J. M. Gordon (na eli tima
istraivaa) Nuzproizvod rada na dokazivau teorema Na njega uticao
jezik Hope (R. M. Burstall) Striktna semantika, ulaz/izlaz,
programski moduli
-
22
ML
Doprinosi ML-a: Tipovi podataka
Polimorfizam (mogunost da funkcije i strukture podatakarade sa
proizvoljnim tipovima)
Definicija novih tipova podataka (preuzeto iz Hope-a) Zadavanje
izraza pomou tzv. prepoznavanja oblika
(pattern recognition, takoe iz Hope-a) Dijalekti:
SML (Standard ML) LML (Lazy ML ne-striktna semantika)
SASL, KRC, Miranda SASL = St. Andrews Static Language Prvi jezik
D. A. Turner-a Trei pravac razvoja funkcionalnih jezika
pravac modernih jezika koji poseduju svih 6karakteristika
SASL zasnovan na Iswim-u i radovima J.Darlingtona
Ne-striktna semantika (prvi put) Realizacija jezika preko tzv.
kombinatora
Programi podseaju na matematiku notaciju
-
23
SASL, KRC, Miranda
Primer
fac n = 1, n = 0= n * fac(n-1), n > 0
Svaka funkcija u SASL-u je tzv. Curry-jevafunkcija, tj. funkcija
nastala ugnedavanjem viefunkcija od jednog argumenta
SASL, KRC, Miranda Prepoznavanje oblika u zadavanju izraza:
Sluajevi se ne moraju zadavati uslovnim izrazima i
ugraenimfunkcijama, ve karakteristinim oblikom
Primer Dva programa za izraunavanje duine liste
Prepoznavanjem oblika:len [] = 0,
(x:l) = 1 + len lKlasino pomou uslovnog izraza:
if l = [] then 0else 1 + len(cdr(l))
-
24
SASL, KRC, Miranda KRC = Kent Recursive Calculator Naredni
funkcionalni jezik D. A. Turner-a Na sve osobine SASL-a dodaje
ZF-izraze, pogodan
nain za definisanje sadraja listi Primer Lista kvadrata svih
neparnih brojeva od 1 do 100:
[x*x | x
-
25
Haskell Nastao 1990. kao posledica:
Postojanja velikog broja funkcionalnih jezika Potrebe za
saimanjem dobrih osobina u jedan jezik
Ime u ast Haskell B. Curry-ja, tvorca kombinatornelogike
Rezultat napora desetine istraivaa Nastavlja niz Iswim, SASL,
KRC, Miranda Polako se namee kao standard u oblasti
funkcionalnog
programiranja Uvodi isto funkcionalno manipulisanje nizovima,
ulazno-
izlaznim operacijama, i neke nove koncepte Od 2009. dostupan u
formi Haskell Platform, koja
objedinjuje prevodilac, iroko koriene alate i bilioteke