IB113 Radek Pelánek 2022 1/93 Dnešní témata mnoho témat, rychlý průchod, „pro predstavu" • vývoj programů, dokumentace, testování • dělení projektu do souborů • styl, PEP8 • vývojová prostředí, správa verzí • přehled programovacích jazyků Návrh a vývoj softwaru „softwarové inženýrství" vývoj rozsáhlého softwaru nejen o zvládnutí „programování" • specifikace, ujasnění požadavků • návrh • dokumentace • testování • integrace, údržba mnoho metodik celého procesu: vodopád, spirála, agilní přístupy, ... koho: pro sebe (pri vývoji i později) pro ostatní názvy (modulů, funkcí, proměnných) dokumentace funkcí, tříd, rozhraní komentáře v kódu Dokumentace: obecné postrehy • neaktuální dokumentace je často horší než žádná dokumentace • sebe-dokumentující se kód Nejlepší kód je takový, který se dokumentuje sám. názvy funkcí, parametrů, dodržování konvencí, ... • u rozsáhlých projektů dokumentace nezbytnost • psaní dobré dokumentace - trochu umění, nezbytnost empatie Dokumentace v Pythonu • dokumentační řetězec (docstring) a první řetězec funkce (třídy, metody, modulu) • konvenčně zapisován pomocí „trojitých uvozovek' (povolují víceřádkové řetězce) def add(a, b): """Add two numbers and return the resu return a + b Dokumentační řetězec víceřádkov' def complex(real=0.0, imag=0.0): 11 ""Form a complex number. Keyword arguments: real — the real part (default 0.0) imag — the imaginary part (default 0 n a a if imag ==0.0 and real == 0.0: return complex_zero Dokumentační řetězce: ukázky This string, being the first statement in the file, will become the module's docstring when the file is imported. class MyClass(object): """The class's docstring""" def my.method(self) : """The method's docstring""" def my_function(): """The function 's docstring""" it it n n n n 8/93 Dokumentace vs. komentáre • dokumentační řetězec • co kód dělá, jak se používá (volá), ... • brán v potaz při zpracování, dá se s ním dále pracovat __doc__ atribut, nástroje pro automatické zpracování, . • komentáře (#) • jak kód funguje, jak se udržuje, ... • při zpracování ignorovány Testování: obecné postřehy Východisko: lidé dělají chyby Přístupy k testování: • nevhodný: „přesvědčit se, že program je v pořádku" • vhodný: „najít chyby v kódu" obecný kontext: „konfirmační zkreslení" (confirmation bias rozsáhlé téma: • testování vs formální verifikace • různé úrovně testování: unit, integration, component, system, ... • různé styly testování: black box, white box, ... • různé typy testování: regression, functional, usability, ... • metodiky (test-driven development), automatizované nástroje unit testing (jednotkové testování) - testování samostatných „jednotek" (např. funkce, metoda, třída) Testování: dílčí tipy • cíleně testujte okrajové podmínky, netypické příklady • prázdný seznam (řetězec) • záporná čísla, desetinná čísla • pravoúhlý trojúhelník, rovnoběžné přímky • přechodný rok • „pokrytí kódu testem" (code coverage) • Jsou pomocí testu „vyzkoušeny" všechny části kódu (funkce, příkazy, podmínky)? assert expression • pokud expression není splněn, program „spadne" (přesněji: je vyvolána výjimka, kterou lze odchytit) • pomůcka pro ladění, testování • explicitní kontrola implicitních předpokladů 13/93 Assert: príklad def factorial(n): assert n == int(n) and n > f = 1 for i in ranged, n+1) : f = f * i return f print(factorial(-2)) Traceback (most recent call last): File "/home/xpelanek/temp/test.py", line 8, in print(factorial(-2)) File "/home/xpelanek/temp/test.py", line 2, in factorial assert n == int(n) and n >= 0 AssertionError Refaktorovánŕ • složitější kód nikdy nenapíšeme ideálně na poprvé • refaktorování (code refactoring) - úprava kódu bez změny funkčnosti • dobře napsané testy usnadňují refaktorování 15/93 Dělení projektu do souborů univerzální princip: velký projekt nechceme mít v jednom souboru důvody: jako dělení programu na funkce, o úroveň abstrakce výš 16/93 enŕ projektu do souborů • jazykově specifické o programovací jazyky se liší technickými požadavky i konvencemi • hlavičkové soubory v C • „hodně malých souborů" v Javě • terminologie: knihovny, moduly, balíčky, frameworky, rminologie v kontextu Pythonu pojmy s přesným významem: • modul (module): soubor s příponou .py, funkce/třídy s příbuznou funkcionalitou • balík (package): kolekce příbuzných modulů, společná inicializace, ... související pojmy používané volněji: • knihovna (library) • framework (framework) • modul poskytuje rozšiřující funkcionalitu • zdroje modulů: • standardní distribuce (např. math, turtle) • separátní instalace (např. numpy, Image) • vlastní implementace (základ: „.py soubor ve stejném d/V (1 \ resari ) • použití: • import module - následná volání module. f unctionO • import module as m • from module import function • from module import * (nedoporučeno) < [S? ► < i ► < ^ ► i •o^o 19/93 jmenný prostor (namespace) ^ mapování jmen na objekty • jmenné prostory umožňují použití stejného jména v různých kontextech bez toho, aby to způsobilo problémy o jmenné prostory mají funkce, moduly, třídy... • moduly - tečková notace (podobně jako objekty) • random.randint • math.log 20/93 Proč nepoužívat „import from X import * V malém programu nemusí vadit, ale ve větších projektech považováno za velmi špatnou praxi. • „nepořádek" v jmenném prostoru • kolize, přepis • překlepy se mohou chovat magicky o složitější interpretace chybových hlášek • Python Zen: Explicit is better than implicit, (import this) Moduly - praktický příklad želví grafika, tvorba obrázků do knihy oduly - praktický příklad želví grafika, vykreslování obrázků do SVG (pro následnou manipulaci) 9 mymath.py - trigonometrické funkce počítající ve stupních • svg.py - generování SVG kódu, funkce typu: • svgJieader (), svg_line(), svg_circle() • manipulace s celkovým obrázkem (posun, rámeček), uložení do souboru • turtle .py - třída reprezentující želvu, podpora pro více želv Moduly - praktický příklad run turtle.py trigonometry.py basic shapes.py fractals.py turtle.py další projekty mymath.py svg.py 24/93 PEP8 - stylistická doporučení pro Python https://www.python.org/dev/peps/pep-0008/ • výběr vybraných bodů • obecný „duch" doporučení celkem univerzální • částečně však specifické pro Python (pojmenování, bílá místa, ...) 25/93 PEP8: Styl a konzistence konzistence (rostoucí důležitost) • s doporučeními • v rámci projektu • v rámci modulu či funkce 26/93 PEP8: Odsazování a délka řádků o standardní odsazení: 4 mezery • nepoužívat tabulátor • maximální délka řádku 79 znaků • rady k zalomení dlouhých řádků oddělení funkcí a tříd: 2 prázdné řádky oddělení metod: 1 prázdný řádek uvnitř funkce: 1 prázdný řádek pro oddělení logických celků (výjimečně) PEP8: Bílé znaky ve výrazech • mezera za čárkou • mezera kolem přiřazení a binárních operátorů • zachování čitelnosti celkového výrazu • ne okolo = v definici defaultní hodnoty argumentu • nepoužívat přebytečné mezery uvnitř závorek 29/93 Ano: spam(ham[1], {eggs: 2}) Ne: spam( ham[ 1 ], { eggs: 2 } ) Ano: if x == 4: print(x, y); x, y = y, x Ne: if x == 4 : print( x,y);x,y=y,x Yes: spam(l) No: spam (1) Yes: dct['key'] = 1st [index] No: dct ['key'] = 1st [index] 30/93 Ano: x = 1 Y = 2 long_variable = 3 Ne: x = 1 Y = 2 long_variable = 3 31/93 PEP8: Bílé znaky - příklad Ano: i = i + 1 submitted += 1 x = x*2 - 1 hypot2 = x*x + y*y c = (a+b) * (a-b) Ne: i=i+l submitted +=1 x = x * 2 - 1 hypot2 =x*x+y*y c = (a + b) * (a - b) 32/93 PEP8: Pojmenování - přehled stylů lowercase lower_case_with_underscores (snake_case) UPPERCASE UPPER_CASE_WITH_UNDERSCORES CapitalizedWords (CapWords, CamelCase, StudlyCaps) mixedCase Capitalized_Words_With_Underscores _single_leading_underscore single_trailing_underscore_ __double_leading_underscore __double_leading_and_trailing_underscore__ PEP8: Pojmenování - základní doporučení • proměnné, funkce, moduly: lowercase, příp lower_case_with_underscores • konstanty: UPPERCASE • třídy: CapitalizedWords 34/93 Pojmenování: další rady jednopísmenné proměnné - jen lokální pomocné proměnné, nejlépe s konvenčním významem: • n - počet prvků (např. délka seznamu) • i, j - index v cyklu • x, y - souřadnice nepoužívat: 1, 0, I (snadná záměna s jinými znaky) angličtina, ASCII kompatibilita 35/93 PEP8: Komentáře Komentář, který protiřečí kódu, je horší než žádný komentář. • „inline" komentáře používat výjimečně, nekomentovat zřejmé věci • Ne: x = x + 1 # Increment x • doporučení ke stylu psaní komentářů (# následované jednou mezerou) Vývojová prostredí, editory IDLE dostatečný pro jednoduché příklady, do budoucna chcete něco lepšího... žádoucí vlastnosti editoru: • syntax highlighting • odsazování, párování závorek • autocomplete, suggest • PEP8 kontrola • podpora ladění • podpora refaktorizace • ... 37/93 Vývojová prostredí, editory příklady různých typů editorů: • IDLE základní editor používaný v tomto kurzu 9 emacs, vi (+příkazová řádka) obecné editory, příp. se specifickou konfigurací • pyCharm „silný" editor speciálně pro Python, vhodné obzvlášť pro velké projekty • ipython, jupyter interaktivní použití (prolínání program a výsledků), v prohlížeči In [14]: rnd.seed(33) dicethrow = rnd. randintd, 6 + 1, 190) side = np.zerDs(6, dtype='int') for i in range(6): side[i] = np.count_nonzero(dicethrow == i + 1) print('number of times', i + 1, 'is', side[i]) print('total number of throws ', sum(side)) number of times 1 is 17 number of times 2 is 17 number of times 3 is 15 number of times 4 is 24 number of times 5 is 19 number of times 6 is 6 total number of throws 199 Back to Exercise 1 Answers to Exercise 2 In [15]: N = lflOO tails = np.sum(rnd.randint(9, 1 + 1, (5, 1999)), axis=9) counttails = np.zeros(6) for i in range(6): counttails[i] = np.count_nonzero(tails == i) plt.plot(range(0, 6), counttails / N, 'bo') pit.xlabel('number of tails in five flips') pit.ylabel('probability'); ; 3; J 0.20 I 0.15 C 1C [■05 L 2 3 4 number of tails in five flips http://nbviewer.jupyter.org/github/mbakker7/exploratory_computing_with_python/blob/niaster/ notebook9_discrete_random_variables/py_exploratory_conip_9_sol.ipynb 39/93 xkcd: Real Programmers nano? REAL PROGRAMMERS USE emocs \ theyopen their hands »letthe KEY REAL USE v\m. WELL, REAL NO, KEAE PROGRWIEfcS PR0GRAnrt£ft6 USE ed- USE Cat. 1 i real programs use: a magnetized needle and a steady hand. / THE DISTURBANCE riple5 WHICH ACT a5 lenses THAT OUTWARD CHANGING THE ^LOU DEFECT JMCOMlNG COShC RAYS, FOCUSING THEn JO STRIKE THE DRIVE RATTER AND FLIP THET DESEED Rm OF THE" FPDV CURRENTS IN THE UPPER ATMOSPHERE > THESE CAU5E NQffiftm FttXETS of" higher-pressure airtocm, — 1 excuse me, but REAL PROGRAMMERS USE BUTTERFLIES. \ MICE 'COURSE, THERE5 AW EM ACS OQMNAND TO DO THAT. oh yeah! good a' https://xkcd.com/378/ 40/93 Správa verzí • naivní přístup: • myprogram.py, myprogram2.py, myprogram_oct_24. py • myprogram_zaloha.py, myprogram_pokus.py • myprogram_f inal. py, myprogram_really_f inal. py • sofistikovanější přístup - „version controľ' o automatizavaná správa verzí • podpora týmové práce • mnoho různých řešení: git, cvs, svn, ... 41/93 • současné populární řešení • distributed revision control • GitHub - repozitář, (primárně) veřejné projekty • gitlab.fi.muni.cz - repozitář na Fl, umožňuje snadno vytvářet soukromé projekty 42/93 Python další témata pro praktické použití: • funkcionální prvky: map, filter, lambda funkce, ... • obecnější předávání parametrů, využití objektů, práce se soubory, ... • iterátory, výjimky, ... • využívání modulů 3 *T) c\ (y 43/93 Python moduly užitečné moduly v základní distribuci • math: matematické funkce • random: náhodná čísla • sys: „systémové" funkce a proměnné • os: spolupráce s operačním systémem • re: regulární výrazy • datetime: práce s časem • json: práce se soubory ve formátu JSON Python knihovny, frameworky Příklady známých „externích" knihoven: • Django: webový framework • NumPy, SymPy, SciPy: efektivní numerické výpočty, symbolické výpočty, vědecké výpočty, statistika 9 Pandas: práce s daty (především „tabulkovými"), SQL-like operace • matplotlib: tvorba grafů, vizualizace • pygarne: vývoj her • scrapy: „scrapování" dat z webu • Tensorflow: strojové učení, deep learning Praktický príklad vývoje v Pythonu • vstup: data z výukového systému (CSV soubory) • výstup: analýzy obtížnosti, popularity (reporty složené z HTML tabulek a grafů) • nástroje: emacs, git • Python knihovny: • os, sys, argparse - práce se soubory a příkazovou řádkou • json, pandas - načítání, ukládání dat • math, re, datetime, numpy - výpočty, transformace dat • matplotlib, seaborn, plotly - vykreslování grafů 46/93 Programovací jazyky • přehled • klasifikace, vlastnosti • historie • způsoby užití • neseriózní postřehy 47/93 nterpretace, kompilace kompilovaný program zdrojový kód (program) překladač strojový kód vstupy bezici program výstupy interpretovaný program zdrojový kód (program) interpret výstupy vstupy 48/93 movacŕ jazyky: klasifikace I nízko-úrovňové • kompilované • nutnost řešit specifika konkrétního systému • explicitní práce s pamětí • náročnější vývoj (nízká efektivita práce) • vysoká efektivita programu vysoko-úrovňové • interpretované • nezávislé na konkrétním systému • využití abstraktních datových typů • snadnější vývoj (vysoká efektivita práce) • nižší efektivita programu nikoliv dvě kategorie, ale plynulý přechod; zjednodušeno movacŕ jazyky: klasifikace II zjednodušená klasifikace a použití nízko-úrovňové C, FORTRAN, ... vestavěné systémy, rychlé výpočty objektové C++, Java, C#, ... klasické aplikace, rozsáhlé systémy skriptovací Python, PHP, JavaScript, Perl, ... programování pro web, skriptování, prototypy deklarativní Prolog, LISP, Haskell, ... umělá inteligence Jazyky se liší v práci s typy V j * i J ■ J Do]> +2 ~> 12 [lfl> 2+2 = > DOME [|h]> RAN|GE(i,5) [13] > FLOOR(lO,5) = > i = > i = > i -> („JQ-5___ Kas ň feu Quiwa regakding type;: https://xkcd.com/1537/ => V kj> *t+n => w CO (2/0) M> (2/0)+2 ^ > "v" -y = > f^M.0CW00OOXX)ťX>13 Programming Language Family Tree H 1950 1955 I960 1965 19X1 1975 1980 1985 1990 1995 Assembler Pascal M o dula-2 Modula-3 -—-__ O be 2000 1 November 2000 APL -ego ML 1 ■■ 1 Has kell tan 90 (CJ Fachhochschule /Wgau fir Technic, Wirtschaft md Gesultung 1 Q Nondwestschweiz 52/93 A family tree of languages Some of the 2400 + programming languages Fortran LISP 53/93 Historie programovacích jazyků prapočátky: • 19. století: Charles Babbage, Ada Lovelace, děrné štítky, • 30. léta: teoretické základy programování, Turingův stroj, lambda kalkul (Alonzo Church) • 40. léta: první počítače, strojový kód, asembler 54/93 Historie programovacích jazyků 50. a 60. léta: první vysokourovňové jazyky (v některých aplikacích přežívají dodnes) • ALGOL • COBOL • FORTRAN - vědecko-technické výpočty (užíván stále) • BASIC • „jazyk pro začátečníky" • Beginner's All-purpose Symbolic Instruction Code • rozšířen v 70. a 80. letech na „mikropočítačích" • výborný jazyk pro vytvoření špatných programátorských návyků 56/93 INPUT "What is your name: "; U$ 20 PRINT "Hello "; U$ 30 INPUT "How many stars do you want: "; N 40 S$ = 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want more stars? "; A$ 100 IF LEN(A$) = 0 THEN GOTO 90 110 A$ ■ LEFT$(A$, 1) 120 IF A$ = "Y" OR AS = "y" THEN GOTO 30 130 PRINT "Goodbye "; U$ 140 END https://en.wikipedia.org/wiki/BASIC Historie programovacích jazyků • 70. léta • rozvoj základních paradigmat (imperativní, objektové, funkcionální, logické) • C, Pascal, Prolog • 80. a 90. léta • další rozvoj jazyků, specializace, nové prvky související např. s nástupem internetu • C++, Perl, Haskell, Ruby, R, Java, JavaScript, PHP • současnost • nové verze jazyků o vznik nových jazyků: Go, Dart, Kotlin, Julia Rosseta Code • rosettacode.org o stejné problémy řešené v mnoha programovacích jazycích If programming languages were ... • weapons https://9gag.com/gag/anXEbeO • religions http://blog.aegisub.org/2008/12/if-programming-languages-were-religions.html • boats http: //compsci . ca/blog/if-a-programming-language-was-a-boat/ • vehicles http://crashworks.org/if_programming_languages_were_vehicles/ 60/93 důležitý aspekt přehledu: různé jazyky mají různé rysy, (ne)výhody a aplikační domény nedůležitý aspekt přehledu: volba citátů a přirovnání (značně subjektivní, pro zpestření, ...) 3 *T) c\ (y 61/93 C would be Judaism - it's old and restrictive, but most of the world is familiar with its laws and respects them. The catch is, you can't convert into it - you're either into it from the start, or you will think that it's insanity Also, when things go wrong, many people are willing to blame the problems of the world on it. C is a nuclear submarine. The instructions are probably in a foreign language, but all of the hardware itself is optimized for performance. 62/93 9 nízko úrovňové programování • „blízko hardwaru" 9 optimalizace rychlosti výpočtu 63/93 mnoho jazyků staví na syntaxi C základní rozdíly oproti Pythonu: • vyznačování bloků kódu, (ne)významnost bílých znaků • explicitně typovaný jazyk 64/93 C syntax: ukázka ciferný součet #include int SumDigits(unsigned long long n, const int base) { int sum = 0; for (; n; n /= base) sum += n °/0 base; return sum; } int main() { printf (,,0/0d °/0d °/0d\nM, SumDigits(1, 10), SumDigits(12345, 10), SumDigits(123045, 10)); return 0; } 65/93 Objektové jazyky odvozené od C Ch—h, C^, Java, ... • kompilované (Java - bytecode) • (většinou) explicitně typované • typicky „silně objektové" • vhodné pro „velké projekty" C++ is a set of nunchuks, powerful and impressive when wielded but takes many years of pain to master and often you probably wish you were using something else. 67/93 Java is a cargo ship. It's very bulky It's very enterprise^y Though it can also carry a lot of weight. Will carry a project, but not very fun to drive. 68/93 Java: Hello World public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } 69/93 interpretované, „skriptovací" jazyky • JavaScript • Python o Perl • PHP • Ruby typické užití: vývoj webu (front-end, back-end), zpracování dat, skriptování, prototypová ní, ... 70/93 interpretované jazyky flexibilnější než kompilované typická ukázka: příkaz eval • „vyhodnocení výrazu v řetězci" • může usnadnit práci • ale nebezpečné (zejména nad uživatelským vstupem) 71/93 JavaScript is a sword without a hilt. 72/93 9 i přes podobnost názvu nemá s Javou mnoho společného • interpretovaný jazyk • „jazyk webového front-endu" 73/93 PHP is a bamboo raft. A series of hacks held together by string. Still keeps afloat though. 74/93 Ruby is difficult to describe. It's sleek, sexy, and very fun drive. Here's a picture. Very trendy. Perl would be Voodoo - An incomprehensible series of arcane incantations that involve the blood of goats and permanently corrupt your soul. Often used when your boss requires you to do an urgent task at 21:00 on friday night. Perl used to serve the same purpose as Python, but now only bearded ex-hippies use it. •<□► 4 ^ t < *■ 4 S ► 76/93 Deklarativní jazyky • imperativní programování: program je posloupnost instrukcí („jak" má počítač počítat) • deklarativní programování: program je popis toho, co se má udělat 77/93 Deklarativní jazyky • logické programování: Prolog • funkcionální programování: Lisp, Haskell typické užití: umělá inteligence, výpočty, „výuka principů, které využijete jinde" (funkcionální prvky dnes v mnoha dalších jazycích) Prolog is an Al weapon, you tell it what to do, which it does but then it also builds some terminators to go back in time and kill your mom. 79/93 mother_child(trude, sally). father_child(tom, sally). father_child(tom, erica). father_child(mike, torn). sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y). parent_child(X, Y) :- father_child(X, Y). parent_child(X, Y) :- mother_child(X, Y). < □ ► 4 ^ t < -z ► 4 S ► 80/93 Lisp is a shiv which comes in many forms. Anyone who uses this is probably crazy and dangerous. 81/93 Lisp: ideální jazyk pro milovníky závorek. (defun factorial (n) (if (= n 0) 1 (* n (factorial (- n 1))))) 82/93 GODE URiTTOJ IN HflßKBU. IS GÜARPMTEED Tb HfWE NO SIDE BTE05. https://xkcd.com/1312/ 83/93 bsort :: Ord a => [a] -> [a] bsort s = case _bsort s of t I t == s -> t I otherwise -> bsort t where _bsort (x:x2:xs) I x > x2 = x2:(_bsort (x:xs)) I otherwise = x:(_bsort (x2:xs)) bsort s = s 84/93 nástroje vyvinuté primárně jako „matematický software", ale obsahují obecný programovací jazyk • Mathematica o MATLAB • R 85/93 Mathematica is a low earth orbit projectile cannon, it could probably do amazing things if only anyone could actually afford one. 86/93 Esoterické programovací jazyky „karikatury" programovacích jazyků - dobrá karikatura umožňuje uvědomit si důležité aspekty originálu • Brainfuck • AsciiDots • Whitespace • LOLCODE • OSTRAJava ++++++++++i «+++++++++++++++. >. +++, /#$<. *-w \#i/ HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE :-] >++.>+ banik pyco tryda Ostrava{ rynek(){ Konzola.pravit("Toz vitaj") pyco fajront pyco Jaký programovací jazyk je nejlepší? 88/93 Jaký programovací jazyk je nejlepší? • Jaký přirozený jazyk je nejlepší? (čeština? angličtina? portugalština? ...) • Jaký typ mapy je nejlepší? (automapa? turistická mapa? mapa města?) Nesmyslné otázky, záleží na účelu a situaci. •<□► 4 ^ t < -ž ► < -š ► 88/93 programovací jazyk je nejlepší? • neexistuje „univerzální" jazyk, každý má své (ne)výhody • lepší otázka: „Jaký jazyk je nejlepší pro danou situaci?" • problém, který řešíme • tým, který problém řeší • „legacy code" • vyplatí se umět různé jazyky 89/93 Popularita jazyků neexistuje nejlepší jazyk, ale také nejsou všechny jazyky stejně užitečné a rozšírené... popularita těžko měřitelná, existuje řada pokusů různými metrikami: • vyhledávání na webu • počty knížek o jazyku • výskyty v inzerátech • dotazy na StackOverflow (a podobných stránkách) • projekty na GitHubu (a podobných repozitářích) 90/93 Popularita jazyků na vršku se vesměs vyskytují (abecedně): C, C++, Java, JavaScript, Python konkrétní příklad indexu popularity: TIOBE Programming Community Index Source: wwwtiobe.com 25 1 r 2002 200- 2006 2003 2010 2012 2014 2016 201? Python Java « C±* ™ C# ^ Visual Basic JavaScript — Assembly language i r 2020 2022 PHP 91/93 Co dál? navazující předměty na Fl: • IB114 Uvod do programovania algoritmizace II • algoritmy, datové struktury (Python): IB002 • objektově orientované programování (Java, C++): PB161, PB162 • nízko úrovňové programování (C): PB071 • principy prog. jazyků: PB006 • softwarové inženýrství: PB007 92/93 vás programování baví! 93/93