1 / 43

Programovacie paradigmy

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

rory
Download Presentation

Programovacie paradigmy

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. Takže, čo konkrétnejšie ? • Smalltalk(2010), Python (2011), Yon (2012), Karel, Logo, … • Go– procedurálna paradigma • static typing • duck typing • goroutines • 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

  4. 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ášok Prolog

  5. Č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/

  6. Často prechádzame mílnikom ? http://www.singularity.com/charts/page20.html

  7. http://www.singularity.com/charts/page19.html

  8. 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.”

  9. 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

  10. 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

  11. 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 2^(40/2) =~ milión = 1M 2kB * 1M = 2GB http://downloadsquad.switched.com/2009/07/20/how-powerful-was-the-apollo-11-computer/

  12. viac: http://www.root.cz/clanky/ceskoslovenske-osmibitove-pocitace-aplikace-a-emulatory-pmd-85/ 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/

  13. Paradoxy Kedysi 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é klienty Kedysi programovali nadšenci, fyzici, matematici a inžinieri, často skoro zadarmo Dnes, 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 funkcia Takž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

  14. Programovacie paradigmy programovacia paradigma je štýl programovania, druh/spôsob rozmýšľania, logika, sémantika, ... kdežto metodológia je produkt (kuchárka) softwarového inžinierstva, odporúčané postupy návrhu software, recepty a doporučenia vývoj paradigiemsúvisí: • s programovacími jazykmi, ktoré súvisia s • s vývojom hardwaru, ktorý súvisí • riešenými problémami v danej dobe ...

  15. Ural 2 (1963, 12kFlops) iná doba, iné problémy, iné paradigmy… 2010 Intel Core i7, 109 GFlops Nvidia Tesla, 515 GFlops GForce 590, 2.5TFlops = 2.5 milón miliónov 2^(50/2) =~ 33 miliónov 12k * 33M =~ 400 G http://www.youtube.com/watch?v=2IRN4nZrDwk

  16. Výstava dejín počítania http://www.vs.sav.sk/?lng=sk&charset=&doc=mini

  17. Babbage engine http://en.wikipedia.org/wiki/Difference_engine

  18. Fortran Technické možnosti hardware ovplyvňujú programovacie jazyky a tým aj paradigmu C It was the first programming language C 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);

  19. Dierne štítky • č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 OOOOOO 11| O OOOOOOOOO OOOOOO 0| O OOOOOOOOO OOOOOO 1| O O OO 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 OO O __________________________________________________________________ viac na http://www.columbia.edu/acis/history/fisk.pdf

  20. IBM punch card duplicator Zaujímavý článok: Pýcha štátnej informatiky http://dispersus.blog.sme.sk/c/256151/Pycha-statnej-informatiky.html

  21. Dierna páskakrok vpred • postupnosť riadkov programu je lepšie zabezpečená, • kódovanie ASCII-7, -8 • paritný bit http://www.cnctechnet.com/upload/fanuc%20rs232%20communications_files/isocode.gif

  22. 64 16 32 8 4 2 1 http://dai.fmph.uniba.sk/courses/PARA/cvicenie/Hviezda/index.htm CR-carriage return LF-line feed

  23. Historia programovacích jazykov • 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# • 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)

  24. You can never understand one language until you understand at least two. – Ronald Searle, artist (1920- ) Programovacie jazyky

  25. Assembler • (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 resultdw 0; int result mov cx, 5 ; cx = 5 mov ax, 1 ; ax = 1 cmp cx, 0 ; test cx == 0 ? je print ; if true, goto print mov bx, cx ; bx = cx mov ax, 1 ; ax = 1 mov bx, 1 ; bx = 1 cyklus: ; navestie cyklu mul bx ; (dx,ax) = ax*bx cmp dx, 0 ; test dx == 0 ? jne overflow ; if false, goto overflow inc bx ; bx++ loop cyklus ; while(--cx>0)goto cyklus mov result, ax ; result = ax print: ; podprogram pre tlac .....

  26. Štruktúrovaný assembler (SaS) • priamočiary preklad do stroj.kódu, • bežné štruktúrované príkazy, if, while, ... 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 .....

  27. Hlavné paradigmy • objektovo-orientovaná paradigma • procedurálna paradigma • funkcionálna paradigma • logická (relačná) paradigma • konkurentná paradigma Paradigmy nie sú disjunktné množiny počas prednášky sa pozrieme na dve z nich v najčistejšej forme: FP – Haskell, LP – Prolog.

  28. 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

  29. Príklad C++ 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  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ť ?

  30. 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));??> 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; } printf("%d\n",mymax((int(*)(int(*)(int(*)()),int(*)(int(*)(int**))))3,(int(*)(int(*)(int(*)()),int*,int(*)(int(*)())))52));

  31. Obfucated code International 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

  32. Programovací jazyk programovací 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

  33. Programovací jazyk, v ktorom maturujete, a ten, za ktorým umriete, nebudú mať spoločné ani bodkočiarku– Borovanský, 2008  A čo jazyk, čo vie všetko ... Dr. Robert B.K. Dewar a Dr. Edmond Schonberg O Jave ako prvom (univerzitnom) programovacom jazyku • package programming (“google”-programming), • programátor necíti hardware, • programátor netuší, čo je pointer, • pokus-omyl programovanie, • bubble-sort programátori (neúcta k algoritmom, a ADŠ) http://www.itnews.sk/buxus_dev/generate_page.php?page_id=52067

  34. 50-60 -te roky Computer Science without FORTRAN and COBOL is like birthday cake without ketchup and mustard. • 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 Algol vs. Fortran z pohľadu kontinentov http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5396281&isnumber=5255174&tag=1

  35. Fortran "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 Cyklus, ktorý sčíta nepárne čísla integer i, n, sum sum = 0 do 10 i = 1, n, 2 sum = sum + i 10 continue IF (X - Y) 100, 200, 300 if (x - y) < 0 then goto 100 if (x - y) = 0 then goto 200 if (x - y) > 0 then goto 300 do10i=1,n,2 sum=sum+i 10 continue if (x .lt. y) then goto 100 if (x .eq. y) then goto 200 if (x .gt. y) then goto 300 do10i=1100 do10i=1,100

  36. 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  Fortran • FORTRAN(IBM) • polia, priradenie, 3-IF, GOTO, DO • FORTRANII • SUBROUTINE, CALL • FORTRANIII • inline assembler, strojovo závislý na IBM • FORTRANIV • 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 A good FORTRAN programmer can write FORTRAN code in any language

  37. Fortran "GOD is REAL (unless declared INTEGER).“ program GCD integer m, n, r 10 print *, 'Please give values for m and n' read *, m, n 20 if (n .eq. 0) go to 30 r = mod(m,n) m = n n = r go to 20 30 print *, 'gcd = ', m go to 10 end 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 ! Hello World in Fortran 90 and 95 PROGRAM HelloWorld WRITE(*,*) "Hello World!" END PROGRAM http://en.wikibooks.org/wiki/Fortran/Fortran_examples

  38. 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. COME FROM DO 200 INDEX=1,10 10 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,X 200 CONTINUE STOP 500 FORMAT (14,2X,F12.0) 10 J=1 11 COME FROM 20 12 WRITE (6,40) J STOP 13 COME FROM 10 20 J=J+2 40 FORMAT (14) I = 1 IF (I .LT. 10) COME FROM 50 I = I+1 50 WRITE (6,60) I STOP 60 FORMAT (14) http://www.fortranlib.com/gotoless.htm

  39. 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/

  40. 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 = 1 fac (n+1) = (n+1)*fac(n)

  41. 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áty fact(0,1). fact(N,F) <= fact(N-1,G) & G*N = F.

  42. Pocta Euklidovi • Smalltalk(18 nsd 12) nsd: anInteger | u v | u := self max: (v := anInteger). v := self min: v. u == v ifTrue: [^ u]. u * v == 0 ifTrue: [^ u + v]. [^ v nsd: u - v]. • Haskell (nsd 18 12) nsd 0 0 = error "nsd 0 0 nie je definovany" nsd x 0 = x nsd x y = nsd y (x `rem` y) • Prolog ( nsd(18,12,X) ) nsd(X,Y,G) :- Y>0, mod(X,Y,Z), nsd(Y,Z,G). nsd(X,0,X) :- 0<X.

  43. Pre koho (nie) je prednáška 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 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

More Related