Download presentation
Presentation is loading. Please wait.
1
Programovacie paradigmy
Peter Borovanský, KAI, I-18, borovan(a)ii.fmph.uniba.sk alias: digmy(a)lists.dai.fmph.uniba.sk Pon, 12:20, M-XII
2
Paradigmy 2017 (úvodné slovo)
Keď sa povie programovacie paradigmy, väčšina klasikov si spomenie na funkcionálnu a logickú paradigmu a procedurálnu, s objektovou odchýlkou. V tomto roku som sa zámerne/cvične rozhodol vypustiť logickú paradigmu (Prolog), a dôvody (bez hlbších priorít) sú tieto : vždy to bolo koncom 5.semestra, študenti to nemali moc radi, pochopili z toho pomerne/veľmi málo, z čoho väčšina je zrejme moja chyba..., ste prvý ročník, ktorý mal pomerne silnú logickú prednášku, takže načo jatriť staré rany..., hlbšie rozumiete rôznym solverom, čoho logické prog. je príkladom procedurálnu paradigmu poznáte z jazykov, ktoré nevznikli za vášho života, napr. v roku 1985 (C++) a 1995 (Java, JavaScript, Python), čo sa nič odvtedy neudialo? aby ma ten predmet bavilo robiť, musí sa nejako vyvíjať...
3
Úvodná tretina kurzu prvú tretinu kurzu sa pozrieme na procedurálnu paradigmu z pohľadu novodobejších programovacích jazykov. úvodom preto nezažijete výrazný paradigm shift na druhej strane, každý z dnešných moderných programovacích jazykov v nejakej miere podporuje funkcionálnu paradigmu, takže hranice nie sú striktne dané. prvá tretina kurzu preto bude skôr o pojmoch a princípoch rôznych programovacích jazykov, ako o zatiaľ nevídanej paradigme. Korektnejší názov pre prvú tretinu kurzu by možno bol Princípy (modernejších) programovacích jazykov
4
Java 1.9 (official release 21.9.2017)
Java je zabetónovaná od Java 1.0, 1995, ale snaží sa implementovať novinky nespútaných nových jazykov, ktoré nepotrebujú byť spätne kompatibilné. V ktorom z dnešných programovacích jazykov sa dnes ešte píše povinne bodkočiarka ? Je to len dôsledok toho, že pred releasom Java 1.0 sa zdalo mnoho iných vážnejších problémov, ktoré riešiť, že sa J.Gosling neobťažoval domyslieť gramatiku jazyka (resp. syntaktický analyzátor), aby bodkočiarky neboli treba. a odvtedy povinne píšme ;<cr><lf> podľa vzoru jazyka Algol (1960)/C (1985). A vôbec to nie je o bodkočiarke… Cieľom je, aby ste pochopili, koľko rôznych ‘bodkočiarok’ v jazyku Java existuje najmä kvôli spätnej kompatibilite.
5
Java 9 Je Java mŕtva ? Asi nie, práve vyšla Java 9... (rýchla odpoveď...) Ale neumiera ? (... to už je iná otázka) Pozreli ste si novinky, ktoré Java 9 prináša ? Viete napísať program v Java 9, ktorý nie je v jazyku Java 8 ? V histórii Javy ako programovacieho jazyka nastali výraznejšie dve revolúcie: 2004 Java 5 prišla s generickými typmi, 2014 Java 8 prišla s lambdmi alias funkciami. Ale fakticky najväčší prínos Java 8 bol asi Stream API... (coming soon)
6
Paradigmy 2017 (úvodné slovo)
Motto: Java is dead, long live JVM ! Paradigmy 2017 (úvodné slovo) V rámci kurzu sa stretnete s: procedurálnymi/objektovými jazykmi, JavaScript, Scala, Kotlin, konkuretným jazykom GO, funkcionálnym jazykom Haskell. Prednáška dá intro, očakáva sa schopnosť dohľadať si detaily potrebné k DÚ. Očakáva to dnes každý z vašich potenciálnych zamestnávateľov... Ak vám tento prístup nevyhovuje, lepšie si zvoliť iný PV predmet...
7
O čom to bude ? (Paradigmy 2017)
Programming language features: static/dynamic typing type inference duck typing co-routines/goroutines tail recursion optimisation function as value lazy evaluation list comprehension pattern-matching backtracking and lots of recursion Horn clause, (SLD) resolution, choice point, unification
8
Konkrétnejšie ? Princípy programovacích jazykov
dynamic typing – Good&Bad parts of JavaScript Java Stream API príklady dvoch moderných jazykov na JVM (Scala, Kotlin) 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 backtracking and recursion pattern-matching Prolog – logická paradigma Horn clause resolution choice point unification
9
Dnešná prednáška prelet nad ~70 ročným vývojom HW a tomu zodpovedajúceho SW Uvidíte, ako radikálne sa menil HW, čomu sa prispôsoboval SW Zmena HW (výkonu/kapacity/ceny/rozmerov) je v rádoch milionov-miliard. Technik z roku 1950 by sotva niečo vedel s HW z roku 2010 a naopak. Ale programátor 2010 by vedel kódiť v Algole 60, a možno aj naopak. reklama s dávkou nadsázky hoc nedostanete prakticky použiteľnú informáciu, skúsime sa pár krát zamyslieť Potom: ~ 4 Java Stream API, JavaScript, Scala, Kotlin (under construction) ~ 4 prednášky Go ~ 5 prednášky Haskell
10
Č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
11
Ako často ?
13
Novinky sú cool... (či ide o novú paradigmu, ukáže až čas)
14
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 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.”
15
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.
16
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 ?
17
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, 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 (2.23 GHz, GB+3GB RAM) 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^(46/2) =~ milión = 8M 2kB * 8M = 16GB
18
PMD 85 Personal Microcomputer with Display
viac: PMD 85 Personal Microcomputer with Display PMD-2 (intel 8080): Žofka (Logo), Karel-3D (M.Vittek), Pascal (A.Blaho, P.Tomcsanyi).
19
Počítač SIEMENS 4004 v ÚVTVŠ v Mlynskej doline – H6
Dejiny v obrazoch Počítač SIEMENS 4004 v ÚVTVŠ v Mlynskej doline – H6
20
Ural 2 (1963, 12kFlops) iná doba, iné problémy, iné paradigmy…
2010 Intel Core i7, 109 Gflops GForce 1080, 8TFlops = 8 milón miliónov násobení reálov 2^(53/2) =~ 134 miliónov 12k * 134M =~ 1600 G ~ 1.6T
21
Paradoxy Kedysi stáli počítače: $ 1.000.000 mainframy – sálové
$ mini – “skriňové” $ workstations $ 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^ exponenciálna funkcia Takže: 10x dlhší program sa 32x horšie ladí, má viac chýb (10^1.5 = ) resp. program 10x kratší potrebuje len 3% času ladenia (0.1^1.5 = ) Preto: programujte krátko...
22
Jazyky rokov (1945-55-65-75-85-95-05-15)
1938 – binary code, The Bombe 1946 – Base 32, Ace #computers = O(1) #programmers = O(1) - Alan Turing We shall need a great number of mathematicians of ability because there will probably be a good deal of work of this kind to be done. One of our difficulties will be the maintenance of an appropriate (i.e. discipline), so that we do not lose track of what we are doing
23
Jazyky rokov (1945-55-65-75-85-95-05-15)
24
Jazyky rokov (1945-55-65-75-85-95-05-15)
1953 Fortran, Lisp – Functional Programming IBM #computers = O(10^2) #programmers = O(10^3) Inžinieri, Matematici, Fyzici, ... ľudia, ktorí majú: materskú profesiu, pracovné návyky, vedia komunikovať
25
Jazyky rokov (1945-55-65-75-85-95-05-15)
1960 Algol 1960 COBOL, PL/1 1967 Simula - OOP 1968 Pascal 1968 No-Goto – Structured Programming 1968 C IBM 1401, IBM 360 #computers = O(10^4) #programmers = O(10^5) Ukazuje sa prvý vážny nedostatok ľudí schopných ovládať počítače, tak vznikajú prvé univerzitne programy Computer Science...
26
Jazyky rokov (1945-55-65-75-85-95-05-15)
1972 Prolog – Logické programovanie 1972 SQL – Relačné programovanie 1973 C Počet programátorov sa zdvonásobí každých 5 rokov Takže každý druhý má <5 rokov programátorskej praxe !!! #computers = O(10^6) #programmers = O(10^7) Male domination
27
Jazyky rokov (1945-55-65-75-85-95-05-15)
1980 C++ 1983 Ada 1085 Eiffel 1986 Objective-C 1987 Perl
28
Jazyky rokov (1945-55-65-75-85-95-05-15)
Internet ! 1990 Haskell 1991 Python 1991 VB 1995 Java 1995 JavaScript
29
Jazyky rokov (1945-55-65-75-85-95-05-15)
2001 C# 2003 Scala 2007 Clojure 2009 Go
30
Jazyky rokov (1945-55-65-75-85-95-05-15)
2011 Dart 2011 Kotlin 2014 Swift
31
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);
32
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 ________________________________________________________________ ,%_>? 12 / O OOOOOOOOO OOOOOO 11| 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 __________________________________________________________________ viac na
33
IBM punch card duplicator
Zaujímavý článok: Pýcha štátnej informatiky
34
Dierna páska krok vpred
postupnosť riadkov programu je lepšie zabezpečená, kódovanie ASCII-6, -7, -8 paritný bit
35
64 16 32 8 4 2 1 CR-carriage return LF-line feed
CR-carriage return LF-line feed
36
Historia programovacích jazykov
ENIAC coding system Assembly Language FORTRAN (J.Backus,IBM) LISP (J.McCarthy) ALGOL (Backus-Naur) COBOL APL Simula (J.Dahl) BASIC PL/I Pascal (N.Wirth) C (D.Ritchie) Smalltalk (A.Kay,Xerox) Prolog (A.Colmenauer) ML SQL (T.Codd) Ada C++ (B.Stroustrup) Eiffel (B.Mayer) Perl Haskell Python Java (Sun) C# Scala Go 2014 – Swift Kotlin
37
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 result dw ; 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 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 .....
38
Š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, ...
39
Programovacie paradigmy
programovacia paradigma je štýl programovania, druh/spôsob rozmýšľania, logika, sémantika, ... kdežto metodoló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 ...
40
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.
41
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
42
Príklad C++ Programovací jazyk môže byť multiparadigmový:
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ť ?
43
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));
44
Obfucated code Veľa inšpriácie do života:
International Obfuscated C Code Contest ( #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:
45
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
46
50-60 -te roky 1954 - FORTRAN (J.Backus,IBM) 1958 - LISP (J.McCarthy)
Computer Science without FORTRAN and COBOL is like birthday cake without ketchup and mustard. FORTRAN (J.Backus,IBM) vedecko-technické výpočty, numerické výpočty LISP (J.McCarthy) ALGOL (Backus-Naur) algoritmický jazyk, štruktúrované programy, riadiace štrukt. COBOL (Pentagon) biznis, financie APL (Kenneth E. Iverson, Harvard) vektorovo orientovaný jazyk Algol vs. Fortran z pohľadu kontinentov
47
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
48
Fortran FORTRAN (IBM) FORTRAN II FORTRAN III FORTRAN IV FORTRAN 66
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 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 A good FORTRAN programmer can write FORTRAN code in any language
49
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
50
COME FROM DO 200 INDEX=1,10 10 X=1. 20 X=X*2. 30 X=X*3. 40 X=X*4.
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)
51
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ť
52
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 = 1 fac (n+1) = (n+1)*fac(n)
53
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.
54
Pre koho nie/je prednáška
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
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.