38
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 utorok, 14:50, M-XII

Programovacie paradigmy

  • 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

Page 1: Programovacie paradigmy

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

Page 2: Programovacie paradigmy

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

Page 3: Programovacie paradigmy

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

Page 4: Programovacie paradigmy

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

Page 5: Programovacie paradigmy

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

Page 6: Programovacie paradigmy

Ako často ?

http://www.singularity.com/charts/page20.html

Page 7: Programovacie paradigmy

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

Page 8: Programovacie paradigmy

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

Page 9: Programovacie paradigmy

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

Page 10: Programovacie paradigmy

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

Page 11: Programovacie paradigmy

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

Page 12: Programovacie paradigmy

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

Page 13: Programovacie paradigmy

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

Page 14: Programovacie paradigmy

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

Page 15: Programovacie paradigmy

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)

Page 16: Programovacie paradigmy

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);

Page 17: Programovacie paradigmy

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 __________________________________________________________________

Page 18: Programovacie paradigmy

IBM punch card duplicator

Zaujímavý článok: Pýcha štátnej informatikyhttp://dispersus.blog.sme.sk/c/256151/Pycha-statnej-informatiky.html

Page 19: Programovacie paradigmy

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

Page 20: Programovacie paradigmy

CR-carriage returnLF-line

feed

http://dai.fmph.uniba.sk/courses/PARA/cvicenie/Hviezda/index.htm

6432

168 4 2 1

Page 21: Programovacie paradigmy

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#

Page 22: Programovacie paradigmy

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

Page 23: Programovacie paradigmy

Š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, ...

Page 24: Programovacie paradigmy

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.

Page 25: Programovacie paradigmy

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

Page 26: Programovacie paradigmy

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

Page 27: Programovacie paradigmy

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; }

Page 28: Programovacie paradigmy

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

Page 29: Programovacie paradigmy

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

Page 30: Programovacie paradigmy

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

Page 31: Programovacie paradigmy

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

Page 32: Programovacie paradigmy

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

Page 33: Programovacie paradigmy

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).“

Page 34: Programovacie paradigmy

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)

Page 35: Programovacie paradigmy

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/

Page 36: Programovacie paradigmy

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)

Page 37: Programovacie paradigmy

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.

Page 38: Programovacie paradigmy

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