uvodne napomenedasdasdasdas

25
1 Uvodne napomene O programskim jezicima Funkcionalni stil programiranja Evolucija funkcionalnih programskih jezika  Autor prezentacije: Miloš Radovanović Sadr žaj O programskim jez icima Funkcionalni stil progr amira nja  Nepostojanje eksplicitnog zadavanja redosleda izvr šavanja  Nepostojanje naredbi  Nepostojanj e sporednih efekata  Funkcije kao ravnopravni objekti  Ne-striktna semantika  Stati čko vezivanje  O funkcionalnim jezicima Evolu cija funkc ionaln ih pr ogra mski h jez ika  Osnove Lambda računa  LISP  Iswim  FP  ML  SASL, KRC, Miranda  Haskell

Upload: srdan-brkic

Post on 18-Oct-2015

26 views

Category:

Documents


0 download

DESCRIPTION

SchemeDr Racket

TRANSCRIPT

  • 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