Úvod do programování
Co je programování a k čemu slouží
Abychom odpověděli na tuto otázku, tak si připomeňme co je počítač. Počítač je zařízení které, jak název napovídá, počítá. Počítač je tak důmyslný, že neumí řešit pouze jednu úlohu, ale podle příkazů které mu dáme může řešit úlohy různého druhu. Posloupnost takévých příkazů nazýváme program a programy se programují. Můžeme tedy říct, že programování je navržení takové posloupnosti příkazů, které vedou k vyřešení nějakoho úkolu či realizaci nějakého výpočtu.
Historická vsuvka
První o kom bych se rád zmínil je Basile Bouchon. Basile Bouchon byl tkalec a vynálezce. Jeho jméno zde připomínám proto, že jako první použil děrný štítek a to na ovládání tkalcovského stavu (1725). Jeho vynález vylepšili Jean-Baptiste Falcon (1728) a Jacques Vaucanson (1740), i přestože jejich vylepšení řídilo tkaný vzor, jejich stav vyžadoval stále asistenci při ovládání mechanismu. Jejich vynález dále vylepšil Joseph Marie Jacquard, jehož stav pracoval automaticky (1804).
Dalším důležitým člověkem ve vývoji počítačů je Charles Babbage, který je někdy označován jako “otec počítačů”. V době kdy Babbage žil se již hojně používaly matematické tabulky. Ať ve vědě, navigaci, inženýrství nebo v matematice musely být tyto tabulky někým spočítány. (Ano tenkrát matematické tabulky počítali lidé na papíře.!) Při tomto procesu vznikaly chyby. Okolo roku 1822 Babbage vynalez Diferenční stroj, který dokázal automaticky řešit matematické rovnice. Později postavil mnohem komplexnější stroj nazývaný Analitický stroj. Analytický stroj byl mnohem univerzálnější a dal se programovat. Neprogramoval se ničím jiným než děrnými štítky.
Poslední o kom je nutné se zmínět je první programátor. Vlastně programátorka abych byl přesný. První byla Lada Lovelace, dcera básníka lorda Byrona, která ve svých poznámkách k Babbagově analytickému stroji napsala algoritmus pro výpočet Bernoulliho čísla, který se tak stal prvním algoritmem zpracovatelný počítačem.
Tkalcovský stav Basila Bouchona.
Tkalcovský stav Josepha Jacquarda.
Portrét Jesepha Jacquarda utkaný stavem, který vynalezl. Tkalcovský stav byl ovládám pomocí cca 24000 děrných štítků.
Portrét Charlese Babbage.
Diferenciální stroj Charlese Babbage.
Portrét Ady Lovelance.
Hardware
Než začneme počítač programovat bylo by dobré si něco říct o tom jak počítače fungují. V roce 1945 John von Neumann navrhl model samočinného počítače, viz obrázek. Jeho model je složen z 5 částí: Operační paměť-je v ní uložen program, zpracovávaná data a výsledky výpočtu, ALU (aritmetickologická jednotka)-provádí aritmetické a logické výpočty, řadič-řídí činnost všech částí a vstupní a výstupní jednotky-slouží jako vstup a výstup.
Princip činnosti toho modelu je následující: přes vstupní jednotku a ALU se umístí program do operační paměti. Stejným způsobem do operační paměti umístíme zpracovávaná data. Příkazy se následně posílají do řadiče, který řídí veškerou činnost. Pokud je cílem výpočtu ALU je výsledek uložen do paměti a zároveň do řadiče, který rozhodne co dál. Nakonec jsou výsledky poslány přes ALU na výstupní jednotku.
von Neumannovo schéma.
Vývoj progarmování
Programování dnes není stejné jako kdysi. První počítače byli pomalé a měli malou paměť. Nebylo tedy možné psát dlouhé programy protože by si je počítač “nezapamatoval”. S vývojem výpočetní techniky se vyvijely také způsoby jakými lidé programovaly.
1. strojový kód
Strojový kód je programovací jazyk 1. generace. Programátor zapisoval instrukce v jazyce kterému příslušný hardware rozuměl a komunikoval tak přímo s procesorem. Po programátorovy vyžadoval velkou píli a pozornost.
2104
1105
3106
7001
0053
FFFE
0000
2. jazyk symbolických instrukcí
Jazyk symbolických instrukcí někdy také nazývaný assembler byl 2. generací programovacích jazyků. Od strojového kódu se principielně neliší. Stále po programátorovi vyžaduje znalost architekruky, registrů a instrukčních sad mikroprocesoru. Ale na rozdíl od strojového kódu si nemusí programátor pamatovat číslo instrukce, ale pouze jení symbolický název. Kód se následně překládá do strojového kódu a může být vykonán.
ORG 100
LDA A
ADD B
STA C
HLT
DEC 83
DEC –2
DEC 0
END
3. generace
Skutečná revoluce přišla s 3. generací programovacích jazyků, které již vynikají mírou abstrakce zdrojového kódu. Mírou abstrakce se myslí to jakým způsobem je zdrojový kód zapsán. Je kladen větší důraz na to aby kód byl pro lidi dobře čitelný. Tento způsob zápisu vyžaduje, aby byl zdrojový kód nejdříve zkompilován než bude možné ho spustit. Kompilace je v podstatě přeložení našeho zdrojového kódu do strojového kódu. Tím se také odstiňuje nutnost znalosti architektury, neboť o správný překlad našeho kódu do strojového kódu pro daný hardware zařizuje kompilátor.
Tato generace jazyků podporovala metody strukturovaného programování, o kterém pojednává následující část, objektově orientované progarmování a další, pro nás již ne tak důležité, přístupy.
Strukturované programování
Strukturované programování vzniklo za účelem větší přehlednosti, strozumitelnosti, kvality, … kódu. Když programujeme, tak většinou ne bez chyb. Strukturované programování usnadňuje orientace v kódu a zmenšuje pravděpodobnost chyby popř. čas jejího hledání. Tím se urychluje vývoj softwaru.
Koncept strukturovaného programování nám říká, že každý program se na nejnižší úrovní může skládat z následujících řídících struktur:
- Sekvence - Sekvence je posloupnost instrukcí, které se provádějí v přesně určeném pořadí jedna po druhé.
- Větvení - Přikazy jsou vykonávány v závislosti na stavu programu.
- Cykly - Příkazy se provádějí opakovaně dokud není dosaženo nějakého stavu.
Tyto řídící struktůry se dájí sdružovat do podprogramů, funkcí či procedur na které se lze odkazovat jako na příkaz.
Úvod do programování
Algorytmy
Při programování se snažíme řešit nějakou úlohu. Přesnému postupu jakým lze daný problém vyřešit se říká algoritmus.
V praxi jsou důložité v některém ohledu “kvalitní” algoritmy. Například nejrychleji řeší danou úlohy nebo nejpřesněji apod.
Diagramy
Algoritmy lze zapisovat pomocí diagramů. V mnoha textech a knihách o algoritmech můžete nalézt algoritmy zakraslené pomocí Vývojových diagramů. Vývojové diagramy jsou dlouho zastaralé. Budeme se zde tedy držet moderní varianty a tou je UML - diagram aktivit. UML (Unified Modeling Language) je grafický jazyk pro návrh a dokumentaci systémů (ne jen počítačových). Diagram aktivit je pak jeden z několika druhý diagramů které UML zahrnuje a skvěle se hodí pro popis algoritmů.
Activiti diagram
Každý proces v diagramu je zakreslen jako sekvence jednotlivých kroků, které jsou zakresleny jako: akce (- dále nedělitelné kroky) nebo vnořené akce (-vpodstatě jde o další proces který se zkládá z aktivit). Posloupnosti akcí se říká tok aktivity.
Základní symboly v digramu jsou:
Inicializační bod
Vyznačuje záčátek toku.
Koncový bod
Označuje konec toku.
Aktivita
Vyznačuje aktivitu. Do symbolu napíšeme co daná aktivita dělá.
Řídící tok
Je vyznačen šípkou. A ukazuje směr toku.
Podmínka
Používáme když se nám tok rozděluje na větve v závislosti na podmínce.
Pokud se ovšem má akce spustit pokud je libovolná z předchozích akcí hotova, tak musíme použít spojovník: (Je to stejný symbol jako podmínka.)
Zásady programování
Kromě toho, že je progarmátor omezen pravidli daného programovacího jazyka, se ustálily mezi programátory časem prověřené poučky a techniky. V angličtině se těmto poučkám říká Best practices. Jde o doporučenou sadu technik pro bezpečný, robustní, snadno čitelný a pochopitelný kód.
-
Komentáře
Kdaždý kód a jeho části je dobré opatřit komentáři. Tyto komentáře nám později mohou pomoci v rychlé orientaci (když se například po měsíci k němu vrátíme). Popřípadě pomoct v orientaci někomu jinému.
-
Modularita
Program je vhodné rozdělovat do samostatných částí. V každém jazyku se tyto části mohou nazývat jinak. My jim budeme říkat procedury a funkce. S modularitou souvisí poučka DRY (Don’t Repeat Yourself) = neopakuj se!. Pokud v programu potřebejeme například spočítat průměr sady čísel, není třeba abychom v programu měli několikrát stejný kód pro spočítání průměru. Stačí pouze zavolat funkci které předáme čísla a ona nám spočítá průměr. Tento přístup zvyšuje přehlednost a usnadnuje vývoj. Když máte dobře napsanou funkci můžete ji s čistým svědomím používat kdekoliv v kódu a neriskovat, že při kopírování kódu stále dokola uděláte chybu. Navíc když se rozhodnete změnit kód funkce, změníte ho jen na jednom místě a neriskujete že při přepisování na mnoha místech v kódu něco vynecháte nebo že někde uděláte překlep.
-
Odsazení, mezery
Pro přehlednost kódu se používá tabulárot nebo několik mezer pro vyznačení bloku kódu. Také je vhodné odělovat prázdnými řádky logické skupiny kódu.
-
Názvy proměných
V programech používáme proměné, tak jako v matematice např. x. V programech by měli být proměnné pojmenovány, tak aby bylo jasné co představují. A obvykle by mělo jít o podstatná či přídavná jmené. Nepoužívá se diakritika ani mezery. Pokud se název skládá z více slov je dobré každé slovo začít velkým písmenem (tzv. velbloudí notace). Pro pojmenová používáme české nebo anglické názvy, ale neni příliš vhodné je kombinovat. Není vhodné používat zkratky pokud nejsou pro daný účel obvyklé nebo přinejmenším zdokumentované komentářem. Příklad: aritmetickyPrumer, prumer, docasny, xPosition, velocity, …
-
Názvy procedur a funkcí
Názvy procedur a funkcí se řídí stejnými konvencemi jako názvy proměnných. Jen je obviklé používat podstatná jména nebo slovesa např. spoctiPrumer, aritmetickyPrumer atd.
-
Procedury a funkce
Proceduty a funkce by neměli být dlouhé a složité. Běžně se uvádí maximální délka od 25-50 řádků kódu. Toto tvrzení vyjadřuje poučka KISS (Keep it short and simple) = Zachovej to krátké a jednoduché. Další poučkou je tzv. Single responsibility principle = Princip jedné odpovědnosti. Která nám říká že každá funkce či procedura by se měla starat pouze o jednu věc.