Upload
rory
View
40
Download
0
Embed Size (px)
DESCRIPTION
Programovacie paradigmy. Peter Borovansk ý, KAI, I-18 , borovan (a)ii.fmph.uniba.sk http://dai.fmph.uniba.sk/courses/PARA/ alias: digmy (a) lists.dai.fmph.uniba.sk pondelok, 10:40, F1 328. O čom to bude ?. Programming language features : static typing type inference duck typing - PowerPoint PPT Presentation
Citation preview
Programovacie paradigmyPeter Borovanský, KAI, I-18, borovan(a)ii.fmph.uniba.sk
http://dai.fmph.uniba.sk/courses/PARA/alias: digmy(a)lists.dai.fmph.uniba.sk
utorok, 14:50, M-XII
O čom to bude ?Programming language features: static typing type inference duck typing co-routines/goroutines function as value lazy evaluation list comprehension pattern-matching Horn clause (SLD) resolution backtracking and recursion choice point unification
Konkrétnejšie ? Go – procedurálna/konkurentná paradigma
konkurentné programovanie – go-routines static typing duck typing
Haskell – funkcionálna paradigma type inference function as value lazy evaluation list comprehension pattern-matching
Prolog – logická paradigma Horn clause resolution backtracking and recursion choice point unification
Dnešná prednáška
prelet nad ~50 ročným vývojom HW a tomu zodpovedajúceho SW
reklama s dávkou nadsázky
hoc nedostanete prakticky použiteľnú informáciu, skúsime sa pár krát zamyslieť
Potom: ~ 3 prednášky Go ~ 4 prednášky Haskell ~ 5 prednášky Prolog
Čo sú paradigmy ? Mílniky ?
Take my grandparents: when they were born the only 'modern' technologies they knew were trains and photography.
No hot water, no gas or electricity, no flushing toilets.
And think of the changes that they saw in their lifetimes: cars, electricity, radio, movies, talkies, TV, computers, credit cards, cash machines, ...
In fact it seems that paradigm shifts are happening more and more frequently, and have been for a very long time
http://www.w3.org/2011/Talks/03-28-steven-internet/
Ako často ?
http://www.singularity.com/charts/page20.html
http://www.singularity.com/charts/page19.html
Počítačové mílniky Najprv trochu humorne, predpoveď “home computing” z roku
1954
Scientists from the RAND Corporation have created this model to illustrate how a ‘home computer’ could look like in the year 2004. However the needed technology will not be economically feasible for the average home. With teletype interface and the Fortran language, the computer will be easy to use.”
Lukket’s hoax
Washington, D.C., Apr. 10, 2000 — A full-scale mock-up of a typical nuclear-powered submarine's maneuvering room in which the ship's engineers control the power plant and electrical and steam systems. U.S. Navy photo by Photographer's Mate 2nd Class Tim Altevogt. http://www.hoax-slayer.com/1954-computer.html
Moore’s Law v 1965 G.Moore
predpovedal, že integrované obvody budú 2x výkonnejšie (počet tranzistorov/cm2) každý rok, za tú istú cenu, a to najmenej 10 rokov,
v 1975 sa opravil, že každé dva roky…
analógie nájdete v pamätiach, diskoch, pixloch, rýchlosti prenosu...
kedy sa to zastaví ? a rozumieme tomu ?
http://en.wikipedia.org/wiki/Moore%27s_law
Apollo 11
1969, 2kB+32kB ROM, 1MHz 1981, prvé IBM XT 16kB, 4MHz
OS: multitasking pre 8 taskov I/O: signály, senzory, snímače vo frekvencii Hz (raz z sekundu ;-) Interface: skôr ako blikajúci switch Errors: 1201, 1202 - príliš veľa dát – radšej pristal N.Amstrong bez
počítača Updates: treba prekódovať EPROM-ku
Dnes: používame QuadCore (1.5 GHz, 1GB+32GB) na telefonovanie, ... často nevieme naprogramovať komunikáciu s odozvou, napr. cez
BlueTooth, každé ráno nájdeme v mobile niekoľko updatov našich apps málo kto (už dnes) vie napísať aplikáciu do 16kB
http://downloadsquad.switched.com/2009/07/20/how-powerful-was-the-apollo-11-computer/
2^(46/2) =~ milión = 8M2kB * 8M = 16GB
PMD 85Personal Microcomputer with Display
PMD-2 (intel 8080): Žofka (Logo), Karel-3D (M.Vittek), Pascal (A.Blaho, P.Tomcsanyi).
http://www.ksp.sk/sustredenia/1985hradok/
viac: http://www.root.cz/clanky/ceskoslovenske-osmibitove-pocitace-aplikace-a-emulatory-pmd-85/https://www.youtube.com/watch?v=UQsD0ck38kQ
ParadoxyKedysi stáli počítače: $ 1.000.000 mainframy – sálové $ 100.000 mini – “skriňové” $ 10.000 workstations $ 1.000 PC $ 100 tablety, netbooky, tenké klientyKedysi programovali nadšenci, fyzici, matematici a inžinieri, často skoro
zadarmoDnes, keď sú počítače skoro zadarmo, programátori sú zďaleka nie
zadarmo..
90% ceny/času vývoja SW je ladenie/debug počet chýb v kóde je (F.Brookes:The Mythical Man Month):
konštanta*dĺžka kódu^1.5 - exponenciálna funkciaTakže: 10x dlhší program sa 32x horšie ladí, má viac chýb (10^1.5 = 31.622)resp. program 10x kratší potrebuje len 3% času ladenia (0.1^1.5 = 0.031622)Preto:
programujte krátko... http://javatroopers.com/Mythical_Man_Month.html#Chapter_8
Programovacie paradigmyprogramovacia paradigma
je štýl programovania, druh/spôsob rozmýšľania, logika, sémantika, ...
kdežtometodológia /techniky
je produkt (kuchárka) softwarového inžinierstva, odporúčané postupy návrhu, vývoja, testovania, nasadenia a údržby software, recepty a doporučenia
vývoj paradigiem súvisí: s programovacími jazykmi, ktoré súvisia s
s vývojom hardwaru, ktorý súvisí riešenými problémami v danej dobe ...
Ural 2
http://www.youtube.com/watch?v=2IRN4nZrDwk
iná doba,iné problémy, iné paradigmy…
2010 Intel Core i7, 109 GFlopsNvidia Tesla, 515 GFlopsGForce 590, 2.5TFlops = 2.5 milón miliónov
2^(50/2) =~ 33 miliónov12k * 33M =~ 400 G
(1963, 12kFlops)
Fortran
Technické možnosti hardware ovplyvňujú programovacie jazyky a tým aj paradigmu
C It was the first programming languageC with the comments support! WRITE (6,7) 7 FORMAT(15H Hello, world! ) STOP END WRITE(*,17) A, B, C
17 FORMAT(F6.3, F6.3, F10.5)
printf(“%f6.3%f6.3%f10.5”, A, B, C);
Dierne štítky
viac na http://www.columbia.edu/acis/history/fisk.pdf
•čo výrobca HW, to iné kódovanie,•len IBM málo >5 EBCDIC kódovaní,•kód J nenasleduje za I, resp. S za R
DEC9 &-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ:#@'="[.<(+^!$*);\],%_>? ________________________________________________________________ /&-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ:#@'="ó.<(+|!$*);È ,%_>?12 / O OOOOOOOOO OOOOOO11| O OOOOOOOOO OOOOOO 0| O OOOOOOOOO OOOOOO 1| O O O O 2| O O O O O O O O 3| O O O O O O O O 4| O O O O O O O O 5| O O O O O O O O 6| O O O O O O O O 7| O O O O O O O O 8| O O O O OOOOOOOOOOOOOOOOOOOOOOOO 9| O O O O __________________________________________________________________
IBM punch card duplicator
Zaujímavý článok: Pýcha štátnej informatikyhttp://dispersus.blog.sme.sk/c/256151/Pycha-statnej-informatiky.html
Dierna páskakrok vpred
http://www.cnctechnet.com/upload/fanuc%20rs232%20communications_files/isocode.gif
•postupnosť riadkov programu je lepšie zabezpečená,•kódovanie ASCII-7, -8•paritný bit
CR-carriage returnLF-line
feed
http://dai.fmph.uniba.sk/courses/PARA/cvicenie/Hviezda/index.htm
6432
168 4 2 1
Historia programovacích jazykov
1943 - ENIAC coding system 1951 - Assembly Language 1954 - FORTRAN
(J.Backus,IBM) 1958 - LISP (J.McCarthy) 1958 - ALGOL (Backus-Naur) 1959 - COBOL 1962 - APL 1962 - Simula (J.Dahl) 1964 - BASIC 1964 - PL/I 1970 - Pascal (N.Wirth) 1972 - C (D.Ritchie)
1972 - Smalltalk (A.Kay,Xerox)
1972 - Prolog (A.Colmenauer)
1973 - ML 1978 - SQL (T.Codd) 1983 - Ada 1983 - C++ (B.Stroustrup) 1985 - Eiffel (B.Mayer) 1987 - Perl 1990 - Haskell 1990 - Python 1991 - Java (Sun) 2000 - C#
Assemblerresult dw 0 ; int result
mov cx, 5 ; cx = 5mov ax, 1 ; ax = 1cmp cx, 0 ; test cx == 0 ?je print ; if true, goto printmov bx, cx ; bx = cxmov ax, 1 ; ax = 1mov bx, 1 ; bx = 1
cyklus: ; navestie cyklumul bx ; (dx,ax) = ax*bxcmp dx, 0 ; test dx == 0 ?jne overflow ; if false, goto overflowinc bx ; bx++loop cyklus ; while(--cx>0)goto
cyklusmov result, ax ; result = ax
print: ; podprogram pre tlac.....
• (strojovo) závislý na architektúre• zaviedol pojem návestia (6-8 znakov)• (prakticky) nemá štruktúrované príkazy• má podprogramy ako prototyp procedúr
Štruktúrovaný assembler (SaS)
cx = 5;ax = 1;bx = 1;do { (dx,ax) = ax*bx; if (dx != 0) goto overflow; bx++;} while(--cx>0);result = ax;
print: ; podprogram pre tlac
.....
• priamočiary preklad do stroj.kódu,• bežné štruktúrované príkazy, if, while, ...
Hlavné paradigmy
objektovo-orientovaná paradigma procedurálna paradigma funkcionálna paradigma logická (relačná) paradigma konkurentná paradigma
Paradigmy nie sú disjunktné množinypočas prednášky sa pozrieme na dve z nich v najčistejšej forme:FP – Haskell,LP – Prolog.
Procedurálne programovanie
koncept volania procedúry: rutiny-subrutiny-podprogramy, procedúry a funkcie, metódy
spôsob predávania argumentov hodnotou, referenciou, menom
rekurzia (nebola vždy samozrejmosťou) modularita a viditeľnosť (encapsulation) premenných, metód
(scope) štruktúrované programovanie, programovanie vo veľkom
(gotoless) globálne premenné, side-efect
Príklad C++Programovací jazyk môže byť multiparadigmový: procedurálne programovanie objektovo-orientované programovanie (triedy) konkurentné programovanie (vlákna) generické programovanie (templates)
konkrétny programovací jazyk konštrukciami podporuje danú paradigmu
programovací jazyk núti dodržiavanie istej programovacej paradigmy, štýlu či disciplíny
položme si otázku: je dobré niekoho niečo nútiť ?
Q: How many C++ programmers does it take to change a light-bulb? A: Only one, but it takes him all night, and when he's done, the refrigerator and toilet don't work
Je dobré niekoho niečo nútiť ?
int mymax (int(*a)(int(*)(int(*)()),int(*)(int(*)(int**))), int(*b)(int(*) (int(*)()),int*,int(*)(int(*)()))){return (int)((((int(*)(int(*)(int(*)()),int( *)(int(*)())))a)> ((int(*)(int(*)(int(*)()),int(*)(int(*)())))b))?((int(*)( int(*)(int(*)()),int(*)(int(*)())))a):((int(*)(int(*)(int(*)()),int(*)(int(*)( ))))b));??>
printf("%d\n",mymax((int(*)(int(*)(int(*)()),int(*)(int(*)(int**))))3,(int(*)(int(*)(int(*)()),int*,int(*)(int(*)())))52));
int max(int a,int b) { a-=b; if(!a) goto d; if(a<(a-a)) goto e; b+=a; goto f; d: if(a!=b) goto e; f: a=~b; goto d; e: return b; }
Obfucated codeInternational Obfuscated C Code Contest (http://www.ioccc.org/)
#define _ -F<00||--F-OO--;int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO(){ _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_
}
Veľa inšpriácie do života:http://en.wikipedia.org/wiki/Obfuscated_code
Programovací jazykprogramovací jazyk je stelesnením paradigmy:
jednoduchý a akceptovateľný spustiteľný na rôznych počítačoch jednoduchý na učenie, implementáciu podobný existujúcim jazykom primerane zaťažujúci práve existujúci HW dáva programátorovi možnosť písať efektívny kód oplýva matematickou jednoduchosťou
50-60 -te roky 1954 - FORTRAN (J.Backus,IBM)
vedecko-technické výpočty, numerické výpočty 1958 - LISP (J.McCarthy) 1958 - ALGOL (Backus-Naur)
algoritmický jazyk, štruktúrované programy, riadiace štrukt.
1959 - COBOL (Pentagon) biznis, financie
1962 - APL (Kenneth E. Iverson, Harvard) vektorovo orientovaný jazyk
Computer Science without FORTRAN and COBOL is like birthday cake without ketchup and mustard.
Algol vs. Fortran z pohľadu kontinentovhttp://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5396281&isnumber=5255174&tag=1
Fortran
integer i, n, sum
sum = 0
do 10 i = 1, n, 2
sum = sum + i 10 continue
"Consistently separating words by spaces became a general custom about the tenth century A.D., and lasted until about 1957, when FORTRAN abandoned the practice." —Sun FORTRAN Reference Manual
do10i=1,n,2 sum=sum+i 10 continue
do10i=1100
Cyklus, ktorý sčíta nepárne čísla
do10i=1,100
IF (X - Y) 100, 200, 300
if (x - y) < 0 then goto 100if (x - y) = 0 then goto 200if (x - y) > 0 then goto 300 if (x .lt. y) then goto 100if (x .eq. y) then goto 200if (x .gt. y) then goto 300
Fortran
FORTRAN (IBM) polia, priradenie, 3-IF, GOTO, DO
FORTRAN II SUBROUTINE, CALL
FORTRAN III inline assembler, strojovo závislý na IBM
FORTRAN IV strojovo nezávislý, boolean, logický IF
FORTRAN 66 INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL external, 6-písmenové identifikátory
FORTRAN 77 CHARACTER typ, DO WHILE-END DO, bitové operácie
Fortran 90 case-sensitive, moduly, rekurzívne procedúry, overloading pointre, allocate a deallocate, dynamické dát.štruktúry exit, inline comments
Fortran 2003 objektovo-orientovaný, dedenie, polymorfizmus, procedúry ako pointre
Fortran 2008
Fortran IV,Fortran 77, Fortran 95, Fortran 2003, ... What will the language of the year 2000 look like? ... Nobody knows but it will be called FORTRAN
A good FORTRAN programmer can write FORTRAN code in any language
Fortranprogram GCD integer m, n, r10 print *, 'Please give values for m and n' read *, m, n20 if (n .eq. 0) go to 30 r = mod(m,n) m = n n = r go to 2030 print *, 'gcd = ', m go to 10 end
! Hello World in Fortran 90 and 95PROGRAM HelloWorld WRITE(*,*) "Hello World!"END PROGRAM
FUNCTION NGCD(NA, NB) IA = NA IB = NB 1 IF (IB.NE.0) THEN ITEMP = IA IA = IB IB = MOD(ITEMP, IB) GOTO 1 END IF NGCD = IA RETURN END
http://en.wikibooks.org/wiki/Fortran/Fortran_examples
"GOD is REAL (unless declared INTEGER).“
COME FROM
10 J=111 COME FROM 2012 WRITE (6,40) J STOP13 COME FROM 10 20 J=J+240 FORMAT (14)
I = 1 IF (I .LT. 10) COME FROM 50 I = I+150 WRITE (6,60) I STOP60 FORMAT (14)
http://www.fortranlib.com/gotoless.htm
The author feels that the COME FROM will prove an invaluable contribution to the field of computer science. It is confidently predicted that this solution will be implemented in all future programming languages, and will be retrofitted into existing languages.
DO 200 INDEX=1,1010 X=1.20 X=X*2.30 X=X*3.40 X=X*4.50 X=X*5.60 X=X*6.70 X=X*7.80 X=X*8.90 X=X*9.100 X=X*10. COME FROM (10,20,30,40,50,60,70,80,90,100),INDEX WRITE (6,500) INDEX,X200 CONTINUE STOP500 FORMAT (14,2X,F12.0)
Objektové programovanie
všetko je objekt
•každý objekt je inštanciou nejakej triedy•každá trieda má nadtriedu•všetko je posielaním si správ <receiver> <message>•správa spúšťa metódu•každý objekt má svoj kus pamäte•hľadanie správnej metódy rešpektuje dedičnosť
http://oldcomputers.net/
Funkcionálne programovanie
základom je abstraktná teória lambda-calcul, my skúsime Haskell (Hugs98)
Haskell je najpopulárnejší lenivý funkcionálny jazyk nepozná objekty ani triedy nepozná priradenie do premennej nepozná globálne premenné nepozná cyklus
ale má iné prednosti... funkcia je hodnotou
fac 0 = 1fac (n+1) = (n+1)*fac(n)
Logické programovanie používa predikátovú logiku 1.rádu my skúsime Prolog (swi-prolog)
nehovorí o tom ako riešenie nájsť, ale len aké má vlastnosti, a hľadá ho automatický dokazovač
definujeme relácie nad objektami (podobne ako SQL)
riešenie sa hľadá pomocou backtrackingu vždy miesto funkcií definujeme predikátyfact(0,1).
fact(N,F) <= fact(N-1,G) & G*N = F.
Pre koho nie/je prednáška
nie je: neznáša, resp. nevidí
dôvod naučiť sa, rekurziu učí sa len to, čo môže
zajtra použiť v robote verí, že s javou, c++, php
prežije do dôchodku... nerád pracuje cez
semester
je: uznáva tzv.
programovanie so zamyslením, ako analógiu čítania s porozumením rád hľadá a rieši malé
„triky“ programíky a rébusy