Praktické tipy, programovací jazyky
IB111 Základy programováníRadek Pelánek
2017
1 / 76
Dnešní přednáška
shrnutí základůvývojová prostředí, editoryspráva verzíknihovny, praktický vývoj v Pythonuregulární výrazypřehled programovacích jazykůnávaznostiKahootová anketa
2 / 76
IB111 shrnutí
shrnutí základních tématco je potřeba hladce umět pro další studiumupozornění na problematické body
3 / 76
Řízení toku výpočtu
podmíněný příkazcykly: for, whilefunkce, return
4 / 76
Datové typy
čísla (int, float)řetězceseznamy, n-ticeslovníky
5 / 76
Indexování
indexování od nulyrozlišování mezi:
indexem ihodnotou na příslušné pozici a[i]
rozdíl mezi indexováním seznamu a slovníkuvnořené struktury, indexování
data[x][y] vs. data[x,y]interpretace indexování „zlevaÿ
6 / 76
Řazení
základní řadící algoritmy: bubble sort, select sort, insertsortpoužití vestavěného řazení
sorted(alist) vs. alist.sort()řazení podle kritéria: key
7 / 76
Funkce
dekompozice problému na funkcečistá funkce, vedlejší efektpředávání parametrů, změna parametrůrozlišování, vhodné použití:
funkce, která mění parametryfunkce, která vrací nový objekt
8 / 76
Proměnné
globální, lokálnívytvoření aliasu vs. kopie (mělká, hluboká)měnitelné vs. neměnitelné typy
indexování slovníkupředávání parametrů funkcím
9 / 76
Rekurze
základní princip sebe-referencečtení, interpretace rekurzivního kódujednoduchá rekurze s návratovou hodnotou
10 / 76
Objekty
rozlišení „třídaÿ vs. „objektÿmetody, datové atributyvestavěné typy jsou objekty, použití objektové notacevlastní definice jednoduchých tříd, použití objektů
init
metody, význam selfdatové atributy
11 / 76
Čtení komplexních výrazů
výrazy podle priorit operátorůvolání funkcí „zevnitřÿindexování, tečková notace „zlevaÿ
len(alice.mother.daughters[0].daughters)
data[x][get_value(a, b[3])]
putpixel(get_coordinates(n),change_color(getpixel((x,y))))
12 / 76
Vývojová prostředí, editory
IDLE dostatečný pro jednoduché příklady, do budoucna chceteněco lepšího. . .
žádoucí vlastnosti editoru:syntax highlightingodsazování, párování závorekautocomplete, suggestPEP8 kontrolapodpora laděnípodpora refaktorizace. . .
13 / 76
Vývojová prostředí, editory
příklady různých typů editorů:
IDLE základní editor používaný v tomto kurzuemacs, vi (+příkazová řádka) obecné editory, příp. sespecifickou konfiguracípyCharm „silnýÿ editor speciálně pro Python, vhodnéobzvlášť pro velké projektyipython, jupyter interaktivní použití (prolínání programua výsledků), v prohlížeči
14 / 76
http://nbviewer.jupyter.org/github/mbakker7/exploratory_computing_with_python/blob/master/notebook9_discrete_random_variables/py_exploratory_comp_9_sol.ipynb
15 / 76
Správa verzí
naivní přístup:myprogram.py, myprogram2.py,myprogram oct 24.py
myprogram zaloha.py, myprogram pokus.pymyprogram final.py, myprogram really final.py
sofistikovanější přístup – „version controlÿautomatizavaná správa verzípodpora týmové prácemnoho různých řešení: git, cvs, svn, . . .
17 / 76
Git
současné populární řešenídistributed revision controlGitHub – repozitář, (primárně) veřejné projektygitlab.fi.muni.cz – repozitář na FI, umožňuje snadnovytvářet soukromé projekty
18 / 76
Python moduly
užitečné moduly v základní distribuci
math: matematické funkcerandom: náhodná číslasys: „systémovéÿ funkce a proměnnéos: spolupráce s operačním systémemre: regulární výrazydatetime: práce s časemjson: práce se soubory ve formátu JSON
19 / 76
Python knihovny, frameworky
Příklady známých „externíchÿ knihoven:Django: webový frameworkNumPy, SymPy, SciPy: efektivní numerické výpočty,symbolické výpočty, vědecké výpočty, statistikaPandas: práce s daty (především „tabulkovýmiÿ),SQL-like operacematplotlib: tvorba grafů, vizualizacepygame: vývoj herscrapy: „scrapováníÿ dat z webuTensorflow: strojové učení, deep learning
20 / 76
Regulární výrazy
nástroj pro hledání „vzorůÿ v textu
programovánítextové editorypříkazová řádka: např. grepteorie: formální jazyky, konečné automaty
21 / 76
Regulární výrazy
obecně používaný nástrojsyntax velmi podobná ve většině jazyků, prostředíbohatá syntaxnásleduje „ochutnávkaÿ, ukázky základního využití vPythonu
22 / 76
Znaky a speciální znaky
základní znak „vyhovíÿ právě sám soběspeciální znaky: . ^ $ * + ? { } [ ] \ | ( )
umožňují konstrukci složitějších výrazůchceme, aby odpovídaly příslušnému symbolu ⇒ prefix \
24 / 76
Skupiny znaků
[abc] – jeden ze znaků a, b, c[^abc] cokoliv jiného než a, b, c
\d Čísla: [0-9]\D Cokoliv kromě čísel: [^0-9]
\s Bílé znaky: [ \t\n\r\f\v]\S Cokoliv kromě bílých znaků: [^ \t\n\r\f\v]
\w Alfanumerické znaky: [a-zA-Z0-9_]\W Nealfanumerické znaky: [^a-zA-Z0-9_]
25 / 76
Speciální symboly
. libovolný znak^ začátek řetězce$ konec řetězce| alternativa – výběr jedné ze dvou možností
26 / 76
Opakování
* nula a více opakování+ jedno a více opakování? nula nebo jeden výskyt{m,n} m až n opakování
Pozn. *, + jsou „hladovéÿ, pro co nejmenší počet opakování *?, +?
27 / 76
Příklady
Jaký je význam následujících výrazů?
\d[A-Z]\d \d\d\d\d
\d{3}\s?\d{3}\s?\d{3}
[a-z]+@[a-z]+\.cz
^To:\s*(fi|kit)(-int)?@fi\.muni\.cz
28 / 76
Regulární výrazy v Pythonu
knihovna re (import re)re.match – hledá shodu na začátku řetězcere.search – hledá shodu kdekoliv v řetězci(re.compile – pro větší efektivitu)„raw stringÿ – r’vyraz’ – nedochází k interpretacispeciálních znaků jako u běžných řetězců v Pythonu
29 / 76
Regulární výrazy v Pythonu: práce s výsledkem
match/search vrací „MatchObjectÿ pomocí kteréhomůžeme s výsledkem pracovatpomocí kulatých závorek () označíme, co nás zajímá
30 / 76
Regulární výrazy v Pythonu: práce s výsledkem
>>> m = re.match(r"(\w+) (\w+)", \"Isaac Newton, fyzik")
>>> m.group(0)’Isaac Newton’>>> m.group(1)’Isaac’>>> m.group(2)’Newton’
31 / 76
Regulární výrazy: xkcd
http://xkcd.com/1313/http://www.explainxkcd.com/wiki/index.php/1313:_Regex_Golf
https://regex.alf.nu/
32 / 76
Programovací jazyky
přehledklasifikace, vlastnostihistoriezpůsoby užitíneseriózní postřehy
33 / 76
Interpretace, kompilace
zdrojový kód(program) překladač
strojovýkód
vstupy výstupyběžící
program
zdrojový kód(program)
vstupy
výstupyinterpret
kompilovaný program
interpretovaný program
34 / 76
Programovací jazyky: klasifikace I
nízko-úrovňové
kompilovanénutnost řešit specifika konkrétního systémuexplicitní 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émuvyuž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šeno35 / 76
Programovací 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
36 / 76
37 / 76
38 / 76
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
39 / 76
Historie programovacích jazyků
50. a 60. léta: první vysokoúrovňové jazyky (v některýchaplikacích přežívají dodnes)
ALGOLCOBOLFORTRAN – vědecko-technické výpočty (užíván stále)BASIC
40 / 76
BASIC
„jazyk pro začátečníkyÿrozšířen v 70. a 80. letech na „mikropočítačíchÿvýborný jazyk pro vytvoření špatných programátorskýchnávyků
41 / 76
Historie programovacích jazyků
70. létarozvoj základních paradigmat (imperativní, objektové,funkcionální, logické)C, Pascal, Prolog
80. a 90. létadalší rozvoj jazyků, specializace, nové prvky souvisejícínapř. s nástupem internetuC++, Perl, Haskell, Ruby, R, Java, JavaScript, PHP
současnostnové verze jazykůvznik nových jazyků: Go, Dart, Kotlin, Julia
42 / 76
Rosseta Code
rosettacode.org
stejné problémy řešené v mnoha programovacích jazycích
43 / 76
If programming languages were . . .
weaponshttps://9gag.com/gag/anXEbe0/if-programming-languages-were-weapons
religionshttp://blog.aegisub.org/2008/12/if-programming-languages-were-religions.html
boatshttp://compsci.ca/blog/if-a-programming-language-was-a-boat/
vehicleshttp://crashworks.org/if_programming_languages_were_vehicles/
killing a dragon:https://blogs.oracle.com/roumen/how-to-kill-a-dragon-with-various-programming-languages
44 / 76
Přehled programovacích jazyků
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í, . . .)
45 / 76
C
C would be Judaism – it’s old and restrictive, but most of theworld 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 onit.
—
C is a nuclear submarine. The instructions are probably in aforeign language, but all of the hardware itself is optimized forperformance.
46 / 76
C: užití
nízkoúrovňové programování„blízko hardwaruÿoptimalizace rychlosti výpočtu
47 / 76
C syntax
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
48 / 76
C syntax: ukázka ciferný součet
#include <stdio.h>int SumDigits(unsigned long long n,
const int base) {int sum = 0;for (; n; n /= base)
sum += n % base;return sum;
}int main() {
printf("%d %d %d\n",SumDigits(1, 10),SumDigits(12345, 10),SumDigits(123045, 10));
return 0;}
49 / 76
Objektové jazyky odvozené od C
C++, C#, Java, . . .
kompilované (Java – bytecode)(většinou) explicitně typovanétypicky „silně objektovéÿvhodné pro „velké projektyÿ
50 / 76
C++C++ is a set of nunchuks, powerful and impressive whenwielded but takes many years of pain to master and often youprobably wish you were using something else.
51 / 76
Java
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.
52 / 76
Java: Hello World
public class HelloWorld{public static void main(String[] args){System.out.println("Hello world!");}}
53 / 76
Interpretované, „skriptovacíÿ jazyky
JavaScriptPythonPerlPHPRuby
typické užití: vývoj webu (front-end, back-end), zpracovánídat, skriptování, prototypování, . . .
54 / 76
Eval
interpretované jazyky flexibilnější než kompilované
typická ukázka: příkaz eval„vyhodnocení výrazu v řetězciÿmůže usnadnit práciale nebezpečné (zejména nad uživatelským vstupem)
55 / 76
JavaScript
JavaScript is a sword without a hilt.
56 / 76
JavaScript
i přes podobnost názvu nemá s Javou mnoho společnéhointerpretovaný jazyk„jazyk webového front-enduÿ
57 / 76
PHP
PHP is a bamboo raft. A series of hacks held together bystring. Still keeps afloat though.
58 / 76
Ruby
Ruby is difficult to describe. It’s sleek, sexy, and very fun todrive. Here’s a picture. Very trendy.
59 / 76
PerlPerl would be Voodoo – An incomprehensible series of arcaneincantations that involve the blood of goats and permanentlycorrupt your soul. Often used when your boss requires you todo an urgent task at 21:00 on friday night.
—
Perl used to serve the same purpose as Python, but now onlybearded ex-hippies use it.
60 / 76
Deklarativní jazyky
imperativní programování: program je posloupnostinstrukcí („ jakÿ má počítač počítat)deklarativní programování: program je popis toho, co semá udělat
61 / 76
Deklarativní jazyky
logické programování: Prologfunkcioná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šíchjazycích)
62 / 76
Prolog
Prolog is an AI weapon, you tell it what to do, which it doesbut then it also builds some terminators to go back in timeand kill your mom.
63 / 76
Prolog
mother_child(trude, sally).
father_child(tom, sally).father_child(tom, erica).father_child(mike, tom).
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).
64 / 76
LISP
Lisp is a shiv which comes in many forms. Anyone who usesthis is probably crazy and dangerous.
65 / 76
Haskell
bsort :: Ord a => [a] -> [a]bsort s = case _bsort s of
t | t == s -> t| otherwise -> bsort t
where _bsort (x:x2:xs) | x > x2 = x2:(_bsort (x:xs))| otherwise = x:(_bsort (x2:xs))
_bsort s = s
67 / 76
Matematický software
nástroje vyvinuté primárně jako „matematický softwareÿ, aleobsahují obecný programovací jazyk
MathematicaR
68 / 76
Mathematica
Mathematica is a low earth orbit projectile cannon, it couldprobably do amazing things if only anyone could actuallyafford one.
69 / 76
Esoterické programovací jazyky
„karikaturyÿ programovacích jazyků – dobrá karikaturaumožňuje uvědomit si důležité aspekty originálu
BrainfuckAsciiDotsLOLCODEOSTRAJavaWhitespace. . .
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
/#$<.*-[+]\#1/
HAICAN HAS STDIO?VISIBLE "HAI WORLD!"KTHXBYE
banik pycotryda Ostrava{
rynek(){Konzola.pravit("Toz vitaj") pyco
}}fajront pyco
70 / 76
Jaký jazyk je nejlepší?
neexistuje „univerzálníÿ jazyk, každý má své (ne)výhodylepší otázka: „Jaký jazyk je nejlepší pro danou situaci?ÿ
problém, který řešímetým, který problém řeší„legacy codeÿ
učte se různé jazyky!
Kolik jazyků umíš, tolikrát jsi programátorem.
71 / 76
Popularita jazyků
těžko měřitelné, existuje řada pokusů různými metrikami:vyhledávání na webupočty knížek o jazykuvýskyty v inzerátechdotazy na StackOverflow (a podobných stránkách)projekty na GitHubu (a podobných repozitářích)
72 / 76
Popularita jazyků
na vršku se vesměs vyskytují (abecedně): C, C++, Java,JavaScript, Python
konkrétní příklad indexu popularity:
73 / 76
Co dál?
algoritmy (směr k větší abstrakci)IB002 Algoritmy a datové struktury I – programátorskéúlohy v Pythonunavazující IV003 Algoritmy a datové struktury II
programování podrobněji (směr k nižší abstrakci, jakfunguje počítač)
PB071 Principy nízkoúrovňového programování – jazykC, správa paměti, práce s řetězci
objektově-orientované programováníPB161 Programování v jazyce C++ (a navazující)PB162 Programování v jazyce Java (a navazující)
74 / 76
Co dál?
jiná paradigmataIB015 Neimperativní programování – Haskell, Prolog
více o jazyce Python a jiných jazycíchPV248 Kurz jazyka PythonPV249 Vývoj v jazyce RubyPV178 Úvod do vývoje v C#/.NET (a navazujícípředměty)
teorie programování, vyčíslitelnost a složitost – učí se vrámci různých předmětů (IB102, IB107)
75 / 76
Závěrečné přání
Ať vás programování baví!
76 / 76