automaadid, keeled, translaatoridkodu.ut.ee/~kalmera/pk16/loeng1.pdfadministratiivinfo uldinfo...
TRANSCRIPT
Programmeerimiskeeled
Varmo Vene
Kalmer Apinis Vesal Vojdani
Kristine Leetberg Hiie Vill
Anti Ingel Raul-Martin Rebane
Arvutiteaduse InstituutTartu �Ulikool
Administratiivinfo
�Uldinfo
MTAT.03.006 6 ainepunkti.
{ Loengud (32 tundi){ Praktikumid (32 tundi){ Iseseisev t�o�o (96 tundi)
Toimumised:
{ R 12.15{14.00, Liivi 2 - 111 (loeng){ T 10.15{12.00, Liivi 2 - 205, 224 (praktikum: inf1, inf2){ T 16.15{18.00, Liivi 2 - 205, 224 (praktikum: inf3, inf4){ K 10.15{12.00, Liivi 2 - 205, 224 (praktikum: inf5, inf6)
Kursuse veebileht: https://courses.cs.ut.ee/2016/PK/fall
Mitteavalikud materjalid Moodle 'i keskkonnas:
http://moodle.ut.ee/
2 / 17
Administratiivinfo
~Opiv�aljundid
Kursuse l�abinu:
omandab �ulevaatlikud teadmised erinevatestprogrammeerimise paradigmadest;
oskab lahendada lihtsaid programmeerimise �ulesandeidfunktsionaalse programmeerimise abil, sealhulgas saab aruja oskab kasutada k~orgemat j�arku pol�umorfseidfunktsioone;
oskab mitme-paradigma keeles kasutada koosfunktsionaalse, imperatiivse ja objekt-orienteeritudparadigma tehnikaid.
3 / 17
Administratiivinfo
Hinde kujunemine
Aine toimub kahes v~ordses osas: Haskell ja Scala
Loengutes ja praktikumides osalemine: kuni 20 punkti (=2*(5+5))
Kodut�o�od: kuni 70 punkti (= 2*5*7)
{ iga kodut�o�o annab kuni 7 punkti{ kummaski osas 6 kodut�o�od, millest arvesse l�aheb 5
Kontrollt�o�od: kuni 110 punkti (= 2*55)
{ m~olemas kontrollt�o�os tuleb saada v�ahemalt 20 punkti
Lisapunktid:
{ Projekt (Sokobani m�angu lahendaja Haskellis){ Boonus�ulesanded
4 / 17
Administratiivinfo
Hindeskaala
Hinne PunkteA suurep�arane � 181B v�aga hea 161� 180C hea 141� 160D rahuldav 121� 140E kasin 101� 120F puudulik 0� 100
5 / 17
Kirjandus
Haskell
Miran Lipova�ca: Learn You a Haskell for Great Good!(2011)
Bryan O'Sullivan, Don Stewart ja John Goerzen: RealWorld Haskell (2008)
H�armel Nestra: Sissejuhatus FunktsionaalsesseProgrammeerimisse (2010)
Scala
Cay S. Horstmann: SCALA for the Impatient (2012)
6 / 17
Programmeerimiskeelte paradigmad
Imperatiivsed keeled
Protseduursed
Fortran, Pascal, C,Ada, (Python)
Objektorienteeritud
Smalltalk, C++, Java,(Python), (Scala)
Deklaratiivsed keeled
Funktsionaalsed
Scheme, ML, Haskell,(Scala), (Python)
Loogilised
Prolog, G�odel, Mercury
7 / 17
Funktsionaalsed keeled
Funktsionaalsete keelte p~ohiomadused
Puudub programmi oleku m~oiste
{ Puuduvad k~orvalefektid, muutujad{ Ilmutatud viidatavus (referential transparency)
Rikkad abstraktsioonivahendid
{ Andmeabstraktsioon{ K~orgemat-j�arku funktsioonid{ Laisk v�a�artustamine
V~oimas t�u�ubis�usteem
{ Staatiline t�u�ubikontroll, t�u�upide tuletamine{ Pol�umor�sm (parameetriline, 'ad-hoc')
8 / 17
Funktsionaalsed keeled
P~ohjusi FP ~oppimiseks
Erinev l�ahenemine programmeerimisele
{ annab uue vaatenurga tuntud probleemide lahendamiseks
FP on "k~orgtaseme" paradigma
{ lubab probleeme lahendada v�aga abstarktsel tasemel{ kergendab vigade leidmist/v�altimist{ v~oit produktiivsuses tihti mitmekordne
M~oju teiste keelte arengule
{ automaatne m�aluhaldus (Java){ pol�umor�sm (C++, Ada)
Lihtne semantika
{ formaalne keele kirjeldamine{ programmide anal�u�us ja teisendamine
9 / 17
Funktsionaalsed keeled
Funktsionaalsete keelte puudusi
M~one �ulesande lahendamisel v~oib omistamine olla vajalik
M~onikord me tahame modellerida v�aliskeskonna olekut
Kasutajaliidese programmeerimine v~oib olla keerulisem
Programmide efektiivsus ei ole mitte alati piisav
Aja- ja m�alukeerukus v~oib olla raskesti ennustatav
10 / 17
Funktsionaalsed keeled
FP l�uhiajalugu
Kombinaatorloogika (M. Sch�on�nkel 1924, H. Curry 1927)
Lambda-arvutus (A. Church 1936)
Lisp (J. McCarthy 1958)
ISWIM (P. Landin 1965)
FP (J. Backus 1977)
ML ja pol�umorfne t�u�ubis�usteem (R. Milner 1978)
Hope, Sasl, Miranda, . . . (1980 { 85)
Haskell (1988)
11 / 17
Funktsionaalsed keeled
Funktsionaalne keel Haskell
L�uhiajalugu
1987 loodi Haskell'i komitee1988 esimene keelekirjeldus (v. 1.0)1999 Haskell982010 Haskell 2010
Kodulehek�ulg: http://www.haskell.org/
Realisatsioonid
ghc kompilaator; Glasgow, Cambridge
12 / 17
Variatsoone faktoriaalile
-- fact1 on defineeritud tingimusavaldise abil
fact1 n = if n == 0 then 1
else n * fact1 (n - 1)
13 / 17
Variatsoone faktoriaalile
-- fact1 on defineeritud tingimusavaldise abil
fact1 n = if n == 0 then 1
else n * fact1 (n - 1)
Avaldise v�a�artustamine (reduktsioon)
Leitakse funktsiooni de�neeriv v~ordus
Avaldis asendatakse v~orduse parema poolega
Formaalparameetrid asendatakse tegelike argumentidega
Kogu protsessi korratakse kuni rohkem ei saa
13 / 17
Variatsoone faktoriaalile
-- fact1 on defineeritud tingimusavaldise abil
fact1 n = if n == 0 then 1
else n * fact1 (n - 1)
N�aide avaldise v�a�artustamisestfact1 2
==> if 2 == 0 then 1 else 2 * fact1 (2-1)==> 2 * fact1 1
==> 2 * (if 1 == 0 then 1 else 1 * fact1 (1-1))==> 2 * (1 * fact1 0)
==> 2 * (1 * (if 0 == 0 then 1 else 0 * fact1 (0-1)))==> 2 * (1 * 1)
==> 2
13 / 17
Variatsoone faktoriaalile
{- fact2 on defineeritud naidistega sobitamise abil;
tootab ainult 32/64bitiste taisarvudega -}
fact2 :: Int -> Intfact2 0 = 1fact2 n = n * fact2 (n-1)
14 / 17
Variatsoone faktoriaalile
{- fact2 on defineeritud naidistega sobitamise abil;
tootab ainult 32/64bitiste taisarvudega -}
fact2 :: Int -> Intfact2 0 = 1fact2 n = n * fact2 (n-1)
-- fact3 on defineeritud "valvurite" abil
fact3 :: Integer -> Integerfact3 n | n == 0 = 1
| otherwise = n * fact3 (n-1)
14 / 17
Variatsoone faktoriaalile
{- fact2 on defineeritud naidistega sobitamise abil;
tootab ainult 32/64bitiste taisarvudega -}
fact2 :: Int -> Intfact2 0 = 1fact2 n = n * fact2 (n-1)
-- fact3 on defineeritud "valvurite" abil
fact3 :: Integer -> Integerfact3 n | n == 0 = 1
| otherwise = n * fact3 (n-1)
-- see ei lahe lopmatusse tsuklisse
fact4 :: Integer -> Integerfact4 n | n == 0 = 1
| n >= 1 = n * fact4 (n-1)
14 / 17
Variatsoone faktoriaalile
-- akumulaatorit kasutav faktoriaal
-- defineeritud where konstruktsiooni abil
fact6 :: Integer -> Integerfact6 n = fact6’ 1 n
where fact6’ a 0 = afact6’ a n = fact6’ (a*n) (n-1)
15 / 17
Variatsoone faktoriaalile
-- akumulaatorit kasutav faktoriaal
-- defineeritud where konstruktsiooni abil
fact6 :: Integer -> Integerfact6 n = fact6’ 1 n
where fact6’ a 0 = afact6’ a n = fact6’ (a*n) (n-1)
-- akumulaatorit kasutav faktoriaal
-- defineeritud let-avaldise, lambda-abstraktsiooni
-- ja case-avaldise abil
fact7 :: Integer -> Integerfact7 n = let fact7’ = \ a n -> case n of
0 -> a_ -> fact7’ (a*n) (n-1)
in fact7’ 1 n
15 / 17
Variatsoone faktoriaalile
-- standartne iteratiivne definitsioon kasutades
-- eeldefineeritud funktsiooni product
-- ja aritmeetilise jada konstruktsiooni
fact8 :: Integer -> Integerfact8 n = product [1..n]
16 / 17
Variatsoone faktoriaalile
-- standartne iteratiivne definitsioon kasutades
-- eeldefineeritud funktsiooni product
-- ja aritmeetilise jada konstruktsiooni
fact8 :: Integer -> Integerfact8 n = product [1..n]
-- pusipunkti kombinaatori abil defineeritud faktoriaal
fact9 :: Integer -> Integerfact9 = fixedPt f
where f g 0 = 1f g n = n * g (n-1)fixedPt f = g where g = f g
16 / 17
Suur t�anu osalemast
ja
kohtumiseni!