IB111 ZÆklady programovÆní Radek PelÆnek 2017 fileVývojovÆ prostłedí, editory płíklady...
Transcript of IB111 ZÆklady programovÆní Radek PelÆnek 2017 fileVývojovÆ prostłedí, editory płíklady...
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