52
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 Uto, 13:10, F1 alias Koštofka programovacích jazykov

uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Programovacie paradigmy

Peter Borovanský, KAI, I-18, borovan(a)ii.fmph.uniba.skhttp://dai.fmph.uniba.sk/courses/PARA/alias: digmy(a)lists.dai.fmph.uniba.sk

Uto, 13:10, F1

alias Koštofka programovacích jazykov

Page 2: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Paradigmy 2018(úvodné slovo)

Keď sa povie programovacie paradigmy, väčšina klasikov si spomenie nafunkcionálnu a logickú paradigmu a procedurálnu, s objektovou odchýlkou.

n 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?

n prvú časť kurzu sa pozrieme na procedurálnu paradigmu z pohľadu novších / novodobejších programovacích jazykov a v skratke si priblížime princípy (procedurálnych) jazykov dneška z triedy Scala, Kotlin, Swift, …

n v úvode preto nezažijete výrazný paradigm shift L

n 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ú striktné ...

Page 3: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Java 10 -release 3.2018príklad čo poznáte

n Java je zabetónovaná od Java 1.0, 1995, ale snaží sa implementovať novinkynespútaných nových jazykov, ktoré nepotrebujú byť spätne kompatibilné.@Deprecated

n v ktorom z dnešných programovacích jazykov sa dnes ešte píše povinne bodkočiarka (za príkazom) ?

n je to len dôsledok toho, že pred releasom Java 1.0 sa zdalo mnoho inýchváž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).

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

Page 4: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Java 11release 9.2018

n Je Java mŕtva ? Asi nie, na jar vyšla Java 10 a včera 11. (rýchla odpoveď...)

n Ale neumiera ? (... to už je iná otázka)

n Pozreli ste si novinky, ktoré Java 10/11 prináša ?

n Viete napísať program v Java 11, ktorý nie je v jazyku Java 10, Java 9 ?

n V histórii Javy ako programovacieho jazyka nastali výraznejšie dve revolúcie:n 2004 Java 5 prišla s generickými typmi,n 2014 Java 8 prišla s lambdami resp. s funkciami.

n ale fakticky najväčší prínos Java 8 bol asi Stream API... (ste videli v Prog4)

http://www.java-countdown.xyz/

Page 5: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Paradigmy 2018(úvodné slovo)

V rámci kurzu sa stretnete s:n procedurálnym/objektovým jazykom Scala (Kotlin/Swift – presunuté do VMA)n konkuretným jazykom GO,n funkcionálnym jazykom Haskell,n logickým programovacím jazykom Prolog.

Prednáška preto dáva intro (ochutnávku) rôznych paradigiemnadvazujúce magisterské predmety idú hlbšie do princípov tej-ktorej paradigmy

očakáva sa schopnosť dohľadať si detaily potrebné k DÚ.a 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...

Motto:Java is dead, long live JVM !

Page 6: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

O čom to bude ?(Paradigmy 2018)

Programming language features:n static/dynamic typing n type inference n duck typing n co-routines/goroutinesn block chain (?)n tail recursion optimisationn function as value n lazy evaluation n list comprehension n pattern-matching n backtracking and lots of recursionn Horn clause, (SLD) resolution, choice point, unificationn constraint logic programming

Page 7: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Hlavné paradigmy

n objektovo-orientovaná paradigman procedurálna paradigman funkcionálna paradigman logická (relačná) paradigman konkurentná paradigma

Paradigmy nie sú disjunktné množinypočas prednášky sa pozrieme na tri z nich v najčistejšej forme:CP – Go,FP – Haskell,LP – Prolog.

Page 8: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Konkrétnejšie ?(toto je plán)

n Princípy programovacích jazykov, 1xn príklady moderných jazykov na JVM (Scala, Kotlin)

n Go – procedurálna/konkurentná paradigma, 4x - októbern konkurentné programovanie – go-routines n static typing n duck typing

n Haskell – funkcionálna paradigma, 4x - novembern type inference n function as value n lazy evaluation n list comprehension n backtracking and recursionn pattern-matching

n Prolog – logická paradigma, 3x - decembern Horn clause n resolution n choice point n unification

Page 9: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Jazyky rokov (1945-55-65-75-85-95-05-15)

n 1938 – binary code, The Bomben 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.

https://www.google.sk/search?q=the+bombe&client=ubuntu&hs=glP&channel=fs&dcr=0&source=lnms&tbm=isch&sa=X&ved=0ahUKEwi8zO267rHWAhUiOJoKHcBdBcIQ_AUICigB&biw=1534&bih=698#imgrc=69VPwpySJaMcJM:

One of our difficulties will be themaintenance of an appropriate(i.e. discipline),so that we do not lose track of what we are doing

Page 10: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Jazyky rokov (1945-55-65-75-85-95-05-15)

n 1953 Fortran, Lisp – Functional Programmingn IBM

#computers = O(10^2) #programmers = O(10^3)

n Inžinieri,n Matematici,n Fyzici,...ľudia, ktorí majú:n materskú profesiu,n pracovné návyky,n vedia komunikovať

https://www.google.sk/search?q=IBM+140&client=ubuntu&hs=jT5&channel=fs&dcr=0&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiDyevv87HWAhUGP5oKHcmhByAQ_AUICigB&biw=1534&bih=698&dpr=1.25#imgrc=He9yBcEbhHwrjM:

Page 11: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Jazyky rokov (1945-55-65-75-85-95-05-15)

n 1960 Algoln 1960 COBOL, PL/1n 1967 Simula - OOPn 1968 Pascaln 1968 No-Goto – Structured Programmingn 1968 C

n IBM 1401, IBM 360

#computers = O(10^4) #programmers = O(10^5)Ukazuje sa prvý vážny nedostatok ľudí schopnýchovládať počítače, tak vznikajú prvé univerzitne programy Computer Science...

https://www.google.sk/search?client=ubuntu&hs=A9P&channel=fs&dcr=0&biw=1534&bih=766&tbm=isch&sa=1&q=IBM+1401&oq=IBM+1401&gs_l=psy-ab.3..0i19k1l4.432501.432501.0.433562.1.1.0.0.0.0.154.154.0j1.1.0....0...1..64.psy-ab..0.1.154....0.mdqNbpXxMK4#imgrc=FKZsQnEBUv1aGM:

Page 12: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Počítač SIEMENS 4004 v ÚVTVŠ v Mlynskej doline

Page 13: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Apollo 11

n 1969, 2kB+32kB ROM, 1MHzn 1981, prvé IBM XT 16kB, 4MHz

n OS: multitasking pre 8 taskovn I/O: signály, senzory, snímače vo frekvencii Hz (raz z sekundu ;-)n Interface: skôr ako blikajúci switchn Errors: 1201, 1202 - príliš veľa dát – radšej pristal N.Amstrong bez počítačan Updates: treba prekódovať EPROM-ku

Dnes: n používame QuadCore (2.23 GHz, 32..256GB+3GB RAM) na telefonovanie, ...n často nevieme naprogramovať komunikáciu s odozvou, napr. cez BlueTooth,n každé ráno nájdeme v mobile niekoľko updatov našich appsn 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 14: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Jazyky rokov (1945-55-65-75-85-95-05-15)

n 1972 Prolog – Logické programovanien 1972 SQL – Relačné programovanien 1973 C

Počet programátorovsa 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

Page 15: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Jazyky rokov (1945-55-65-75-85-95-05-15)

n 1980 C++n 1983 Adan 1985 Eiffeln 1986 Objective-Cn 1987 Perl

https://en.wikipedia.org/wiki/History_of_programming_languages

Page 16: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Jazyky rokov (1945-55-65-75-85-95-05-15)

Internet !

n 1990 Haskelln 1991 Pythonn 1991 VBn 1995 Javan 1995 JavaScript

https://en.wikipedia.org/wiki/History_of_programming_languages

Page 17: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Jazyky rokov (1945-55-65-75-85-95-05-15)

n 2001 C#n 2003 Scalan 2007 Clojuren 2009 Go

https://en.wikipedia.org/wiki/History_of_programming_languages

Page 18: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Jazyky rokov (1945-55-65-75-85-95-05-15)

n 2011 Dartn 2011 Kotlinn 2014 Swift

https://en.wikipedia.org/wiki/History_of_programming_languages

Page 19: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Historia programovacích jazykov

n 1943 - ENIAC coding system n 1951 - Assembly Language n 1954 - FORTRAN (J.Backus,IBM)n 1958 - LISP (J.McCarthy)n 1958 - ALGOL (Backus-Naur)n 1959 - COBOL n 1962 - APL n 1962 - Simula (J.Dahl)n 1964 - BASIC n 1964 - PL/I n 1970 - Pascal (N.Wirth)n 1972 - C (D.Ritchie)

n 1972 - Smalltalk (A.Kay,Xerox)n 1972 - Prolog (A.Colmenauer)n 1973 - ML n 1978 - SQL (T.Codd)n 1983 - Ada n 1983 - C++ (B.Stroustrup)n 1985 - Eiffel (B.Mayer)n 1987 - Perl n 1990 - Haskelln 1990 - Pythonn 1991 - Java (Sun)n 2000 - C#n 2006 - Scala (Martin Odersky)n 2007 - Gon 2014 - Swiftn 2016 - Kotlin

Page 20: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

50-60 -te rokyn 1954 - FORTRAN (J.Backus,IBM)

n vedecko-technické výpočty, numerické výpočtyn 1958 - LISP (J.McCarthy)n 1958 - ALGOL (Backus-Naur)

n algoritmický jazyk, štruktúrované programy, riadiace štrukt.n 1959 - COBOL (Pentagon)

n biznis, financien 1962 - APL (Kenneth E. Iverson, Harvard)

n 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 21: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

FortranTechnické 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! )

STOPEND WRITE(*,17) A, B, C

17 FORMAT(F6.3, F6.3, F10.5)

printf(“%f6.3%f6.3%f10.5”, A, B, C);

Page 22: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

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,2sum=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 23: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Fortran

n FORTRAN (IBM)n polia, priradenie, 3-IF, GOTO, DO

n FORTRAN IIn SUBROUTINE, CALL

n FORTRAN IIIn inline assembler, strojovo závislý na IBM

n FORTRAN IVn strojovo nezávislý, boolean, logický IF

n FORTRAN 66n INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICALn external, 6-písmenové identifikátory

n FORTRAN 77n CHARACTER typ, DO WHILE-END DO, bitové operácie

n Fortran 90n case-sensitive, moduly, rekurzívne procedúry, overloadingn pointre, allocate a deallocate, dynamické dát.štruktúryn exit, inline comments

n Fortran 2003n objektovo-orientovaný, dedenie, polymorfizmus,n procedúry ako pointre

n 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 J

A good FORTRAN programmer can write FORTRAN code in any language

Page 24: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

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 = nn = rgo to 20

30 print *, 'gcd = ', mgo to 10end

! Hello World in Fortran 90 and 95PROGRAM HelloWorld

WRITE(*,*) "Hello World!"END PROGRAM

FUNCTION NGCD(NA, NB)IA = NAIB = NB

1 IF (IB.NE.0) THENITEMP = IAIA = IBIB = MOD(ITEMP, IB)GOTO 1END IFNGCD = IARETURN

END

http://en.wikibooks.org/wiki/Fortran/Fortran_examples

"GOD is REAL (unless declared INTEGER).“

Page 25: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

COME FROM10 J=111 COME FROM 2012 WRITE (6,40) J STOP13 COME FROM 1020 J=J+240 FORMAT (14)

I = 1IF (I .LT. 10) COME FROM 50I = I+1

50 WRITE (6,60) ISTOP

60 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 26: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Je toto koniec bizardností v programovacích jazykoch ?

Pokus váš presvečiť, že ich je mnoho aj v dnešných jazykoch.

Motivované knihou Douglas Crockford, 2008

Page 27: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

JavaScript: The Good Parts(Douglas Crockford)

If a feature is sometimes useful and sometimes dangerous, and if there is abetter option, then always use the better option.

We are not paid to use every feature of the language.We are paid to write programs that work well and are free of errors.

A good programming language should teach you.

It took a generation to agree that:n high level languages were a good idea,n goto statement was a bad idea,n objects were a good idea,n lambdas (functions) were a good idea.

Page 28: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

JSn Či chcete, alebo nie, Javascript je assembler internetu,

n pri písaní aplikácií sa mu nedá vyhnúť, viete ho len zakryť frameworkom/ iným (napr. typovaným) jazykom, ktorý vám nakoniec JS vygeneruje,

n chýbajú typy,

n môžete v ňom začať písať aj bez príručky, je natoľko intuitívny,

n má špecifikáciu (EmacsScript ES6 =ES 2015, 16, 17)

n a o to viac zradný (najmä pre C++/Java programátora),

n môžete ho milovať alebo nenávidieť, nič medzi J

Page 29: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Ako to začalo(dnes je to JavaScript ES6)

n interactive language for Netscapen LiveScript: 10 dní na prototyp vychádzajúci z:

n Java - syntax, aj kus názvu jazykan Scheme/Lisp – lambdas – funkcie a functionálny pohľad, n Self/Smalltalk – Smalltalk bez tried.

n 1995, zároveň sa úspešne rozvíja Goslingova Javan Silná spoločná motivácia pre JS a Java: byť nezávislý od platformy Microsoft

ten si vyvýja Jscript(Active Script), J++

n Súboj Java Appletov a JavaScript vyhráva JS na plnej čiare

n Na úvodné programovanie v JS nepotrebujete čítať žiadnu obsiahlu dokumentáciu

n Stačí si otvoriť konzolu od browsera (alebo repl.it) a “programujete”

Brendan Eich

Page 30: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

JS má rôzne implementácie(ES6)

http://kangax.github.io/compat-table/es6/

Page 31: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Slabé typovanien no typing - assemblern weak static typing (C, C++, Objective C)

char z = “hello”; // núti definovať typy všetkých objektov, ale interne… // si pamätá, koľko bajtov zaberáprintf(“%i”,z); // keď ju chceme formátovať, treba pripomenúť typ

viac a viac typových obmedzení počas času kompilácie (C->C++)

Čo je 749711097 ?n 749711097 = 249903699 * 3 n 74 97 110 97 = “Jana” n 74 9711097 = GMT: Monday 4. October 1993 5:04:57

http://coding.smashingmagazine.com/2013/04/18/introduction-to-programming-type-systems/

char z = 'A'; printf("%d, %c", z, z);65, A

Page 32: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Silné statické typovanien strong static typing (Java)

informácia o type je prístupná v čase behu, a VM teda môže kontrolovať typak chceme pretypovať objekt na iný typ, Java v čase behu realizuje kontroluvýsledok: menej hackov ako C, C++, jazyk je viac rigidnejší

public class Person {public String getName() {

return "zack";}

} // mimo classy nemôžeme definovať žiaden kódpublic class Main {

public static void main (String args[]) {Person person = new Person();System.out.println("The name is " + person.getName());

}} zdroj:http://coding.smashingmagazine.com/2013/04/18/introduction-to-programming-type-systems/

Page 33: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Silné dynamické typovanien strong dynamic typing (JS, Python, Ruby)

var person = {getName: function() {

return 'zack';}

};if (new Date().getMinutes() > 29) {

person = 5;}alert('The name is ' + person.getName());

zdroj:http://coding.smashingmagazine.com/2013/04/18/introduction-to-programming-type-systems/

Page 34: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Silné dynamické typovanien strong dynamic typing (JS, Python, Ruby)

if (new Date().getMinutes() > 29): z = “aaa”

else: z = 5

print zz = z+z // typ z sa zisťuje až v čase behu programu

// - pol hodinu je to String + String// - a pol hodinu int + int

zdroj:http://coding.smashingmagazine.com/2013/04/18/introduction-to-programming-type-systems/

Page 35: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Duck typingn duck typing (JS, Python, Ruby)

var person = {getName: function() { return 'zack'; }

};person['getBirthday'] = function() { return 'July 18th'; };

person['getName'] = 5; // person.getName is not a functionperson['getName'] = null; // person.getName is not a functionperson['getName'] = undefined; // person.getName is not a function

console.log('The name is ' + person.getName() + ' ' +'and the birthday is ' + person.getBirthday());

http://coding.smashingmagazine.com/2013/04/18/introduction-to-programming-type-systems/

if it walks like a duck and quacks like a duck, then it must be a duck.

Objekt patrí do tej triedy ako kváka...

Page 36: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

0.1 + 0.2 == 0.3if (0.1 + 0.2 == 0.3) {console.log(":-)");

} else {console.log(":-(");

}

if (0.1 + 0.2 == 0.3): print(":-)");

else: print(":-(");

#include <iostream>int main() { if (0.1 + 0.2 == 0.3) { std::cout << ":-)";

} else { std::cout << ":-(";

}}

main = do if (0.1 + 0.2 == 0.3) then

putStrLn ":-)" else

putStrLn ":-("

(1 ÷ 10)+(2 ÷ 10)-(3 ÷ 10)

Page 37: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

var vs. letfunction varTest() {var x = 1;if (true) {var x = 2; // rovnaká premenná, var ignoruje block-scopeconsole.log(x); // 2

}console.log(x); // 2 – tvrdá rana pre programátora vyškoleného

} v C, C++, Java, ...function letTest() {let x = 1;if (true) {let x = 2; // rôzne premennéx = x+1; // premenná definovaná let je modifikovateľnáconsole.log(x); // 3

}console.log(x); // 1

}https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

Page 38: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

const vs. letfunction constTest() {const x = 1;if (true) {const x = 2; // rôzne premenné// x = x+1;console.log(x); // 2

}console.log(x); // 1

}

Množstvo konštánt, ktoré používame v programoch, definujeme ako premenné s inicializáciou a nikdy nezmeníme.

Pritom const je konštrukcia deklarujúca, že niečo sa nebude meniť.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

Page 39: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

null vs. undefined(javascript unikát)

n JS má dve hodnoty pre nedefinovanú hodnotun null a undefined

n typeof 12 'number'n typeof 'wow' 'string'n typeof null 'object'???n typeof undefined 'undefined'

NULL (okrem iných vecí ako QuickSort, CSP, ...) objavil/zaviedol Tony Hoarepre nedokonalosť typového systému vtedy Algolu.Dnešné jazyky (Swift, Kotlin) to riešia typmi String (never null), String?

2009, he apologised for inventing the null reference:[20]

I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type systemfor references in an object oriented language (ALGOLW). My goal was to ensure that all use of references should beabsolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put ina null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities,and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.

Tony Hoare

Page 40: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

= vs. == vs. ===(jediný jazyk, kde == nie je tranzitívne)

n 0 == '' // true, platí aj opačnen 0 == '0' // true, platí aj opačnen '' == '0' // false

n false == 'false' // falsen false == '0' // truen " \t \r \n \t " == 0 // true

n 0 === '' // falsen 0 === '0' // false n '' === '0' // false n false === 'false' // falsen false === '0' // falsen " \t \r \n \t " === 0 // false

false:n falsen 0 (zero)n '' or “”n nulln undefinedn NaN (napr. 1/0)Všetko ostatné je true:n '0’n 'false’n [] (an empty array)n {} (an empty object)n function(){} (an “empty” f)

Page 41: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Vždy === miesto ==

https://dorey.github.io/JavaScript-Equality-Table/

Page 42: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Viacriadkové reťazce(indentácia je dôležitá)

Po Fortrane, ktorý zrušil medzery, lebo zaberali drahocenné miesto v 80-stĺpcovom riadku, prišiel Algol/Pascal/C/C+/Java, ktorý ignoroval layoutprogramu. Akýkoľvek počet medzier bol ekvivalentný jednej a konce riadkovsa ignorovali (resp. stáli za medzeru). A každý preferoval iný formát. Viacforemnosť zabíja. Vznikla potreba formátovať programy.Prišiel Python, ktorý za cenu ušetrenia blokových zátvoriek predpísallayout/indentáciu programu.Ale to nie je všetko, prečo je druhý program (JS) zlý ?

var long_line_1 = "This is a \long line"; // ok

var long_line_2 = "This is a \long line"; // syntax error

Page 43: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Priradenie v testen let a = 5, b = 7

n if (a = b) { ... } // a je 7

čo je vlastne explicitne zapísané toto:n a = bn if (a) { ... }

avšak programátor možno myslel niečo inén if (a == b) { ... }n if (a === b) { ... }

Page 44: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Scope(deklarujte všetky premenné na začiatku funkcie)

n JavaScript prevzal syntax blokov z C/Java, ale ignoruje block-scope, t.j. že premenná deklarovaná v bloku nie je inde viditeľná

n ak deklarujete (a príp. inicializujete) premennú v strede funkcie, viditeľná je aj pred definíciou, ale nemá hodnotu...

function foo() {console.log(a); // je definovaná, ale má hodnotu undefinedvar a = 0;console.log(a); // 0

}

for(var i = 1; i <= 10; i++) { } // ...console.log(i); // 11 // ... takto to bolo v Basicu...

Používajte let lebo akceptuje block-scope !

Page 45: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Functional scopen JavaScript síce používa blokovú syntax, nerešpektuje block-scope, ale

pozná funkcie ako hodnoty, a rešpektuje functional-scope...

var x = 1, y = 2;function f() {

var y = 4, z = 6;// x = 1, y = 4, z = 6x += y+z;// x = 11, y = 4, z = 6

};// x = 1, y = 2, z = undefinedf();// x = 11, y = 2, z = undefined

Page 46: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

with(pravdepodobne pochádza z Pascalu/Pythonu)

with (obj) {a = b;

}a znamená (???):n a = b;n a = obj.b;n obj.a = b;n obj.a = obj.b;

V skutočnosti znamená toto (takže všetky štyri možnosti):if (obj.a === undefined) {

a = obj.b === undefined ? b : obj.b;} else {

obj.a = obj.b === undefined ? b : obj.b;}

Page 47: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Dobrovoľné zátvorky blokuRovnaké v mnohých iných jazykochif (ok)

t = true;zmeníte na:if (ok)

t = true;foo( );

a myslíte tým toto:if (ok) {

t = true;foo( );

}ale v skutočnosti ste napísali toto:if (ok) {

t = true;}foo( );

Page 48: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Security update for iOS/OSXOriginány Apple kód na verifikovanie certifikatu (2014, update iOS 7.0.6):Vidíte chybu v tomto kóde ? … nevadí, ani Apple ju nenašiel...

if ((err = SSLFreeBuffer(hashCtx)) != 0)fail();

if ((err = ReadyHash(SSLHashSHA1, hashCtx)) != 0)fail();

if ((err = SSLHashSHA1.update(hashCtx, clientRandom)) != 0)fail();

if ((err = SSLHashSHA1.update(hashCtx, serverRandom)) != 0)fail();

if ((err = SSLHashSHA1.update(hashCtx, signedParams)) != 0)fail();fail();

if ((err = SSLHashSHA1.final(hashCtx, hashOut)) != 0)fail();

http://www.tidev.io/2014/03/04/how-you-can-learn-from-apples-mistake/

Page 49: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Vsúvanie bodkočiarky

function goo() {...return {errorCode : 0

};}

function goo() {...return {errorCode : 0

};}

;

JS za príkazom vyžaduje bodkočiarkuale svojou benevoletnosťou ju dovolí programátorovi nepísať a dopĺňa ju zaňAký je rozdiel, výsledok oboch kódov ?

Page 50: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Globálne premennén sú zlé, najmä ak projekt presiahne rozumnú veľkosť

n deklarácia globálnej premennej var foo = 5

n cez globálny objektwindow.foo = 5

n implicitná deklaráciafoo = 5

n Našťastie JS ES 6 prichádza s modulmi

Page 51: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

GOTO story

Edsger Dijkstra (1968). "Go To Statement Considered Harmful", Communications of the ACMFrank Rubin (1987). ""GOTO Considered Harmful" Considered Harmful“ , Communications of the ACMDonald Moore; ...(1987). "" 'GOTO Considered Harmful' Considered Harmful" Considered Harmful?„Dijkstra, Edsger On a Somewhat Disappointing Correspondence (EWD-1009)

Page 52: uvod.ppt [Re im kompatibility]dai.fmph.uniba.sk/courses/PARA/Prednasky/uvod.pdfn 1968 No-Goto – Structured Programming n 1968 C n IBM 1401, IBM 360 #computers = O(10^4) #programmers

Pre koho nie/je prednáška

nie je:n neznáša, resp. nevidí dôvod

naučiť sa, rekurziun učí sa len to, čo môže zajtra

použiť v roboten verí, že s javou, c++, php

prežije do dôchodku...n nerád pracuje cez semester

je:n uznáva tzv. programovanie so zamyslením, ako analógiu čítania s porozumenímn rád hľadá a rieši malé „triky“

programíky a rébusy