Paradigmata programovacích jazyků, historie
Tento článek je první ze série návodů, ve které Vás postupně provedu různými zákoutími programování (nejen) Arduina. Zároveň touto sérií doplním či rozšířím okruhy, které jsem v předchozích článcích (ať už úmyslně či neúmyslně) zanedbával. Postupně budeme stavět od základů až po složitější koncepty a konstrukce.
Obsah článku:
Úvod
V tomto článku bych se chtěl zabývat různými paradigmaty programovacích jazyků. Co paradigma, to jiný pohled na způsob vývoje programu, jeho zápisu, práci s daty a podobně. Před tím, než se pustíme do přehledu paradigmat, zkusme se podívat na nejdůležitější etapy etapy, které dovedly svět IT až do dnešní podoby.
Strojový kód
- Strojový kód tvoří nuly a jedničky, jejichž různé kombinace odpovídají různým instrukcím procesoru.
- Instrukce mohou být například načtení hodnoty z paměti do registru, sečtení hodnoty v registru s hodnotou v jiném registru a mnohé další.
- Jelikož procesor rozumí pouze nulám a jedničkám, všechny kompilované programy nakonec skončí v podobě strojového kódu.
- Tento přístup byl pro programátory velice náročný kvůli nutnosti zapamatovat si sekvenci nul a jedniček. Proto se hledaly cesty, jak vývoj zjednodušit. Řešením byl assembler.
Assembler
- Assembler, neboli jazyk symbolických adres, je funkčně úzce svázaný se strojovým kódem. Každá instrukce (kombinace 0 a 1) ze strojového kódu má svoji odpovídající instrukci v assembleru.
- Co čip, to jiná sada instrukcí. Podívejte se například na instrukce, které používají čipy řady x86 (velká část dnešních PC).
- jednoduchý program, který sečte dvě hodnoty vypadá například takto:
-
MOV EAX, 10 ;do registru EAX uloží hodnotu 10 ADD EAX, 20 ;k hodnotě v EAX přičte 20 a uloží ji zpět do EAX ;v EAX je 30
- Může se zdát, že Assembler zas taková spása není. Například v C++ se dá psát daleko produktivněji a přehledněji. Důležité je si ale uvědomit, jak velký přechod znamenal nástup assembleru v době, kdy hlavním nástrojem vývojářů byl strojový kód. Druhou výhodou je, že s Assemblerem má vývojář plnou kontrolu nad procesorem.
- Předchozí instrukce se do strojového kódu přeloží následovně:
- 1011100000001010000000000000000000000000100000111100000000010100
- Toto dříve musel programátor napsat sám! 🙂
Od této chvíle už se začaly objevovat první jazyky, které bychom mohli opravdu označit za programovací jazyky. Všechny tyto jazyky sice skončí v podobě nul a jedniček, každý ale může být vhodný na určitou činnost, jejíž programování nám velice usnadní.
Seřadit jazyky podle doby jejich vzniku by bylo na samostatný článek, proto si představíme pouze nejrozšířenější paradigmata. Pokud by vás historie programovacích jazyků zajímala, odkáži vás na Wikipedii. Výborně zpracovaný je také tento rodokmen programovacích jazyků.
Co je paradigma
Paradigma (z řeckého παράδειγμα parádeigma = vzor, příklad, model) je obecně přijímané schéma, vzorec myšlení, či model. (Wikipedia)
- To, že je jazyk určitého paradigmatu, nám říká, jakým způsobem budeme při psaní kódu nad programem přemýšlet.
- Jednotlivá paradigmata se liší ve způsobu, jakým přistupují k datům, nebo jaké máme možnosti při tvorbě programů.
- Některé jazyky se striktně drží jednoho paradigmatu, zatímco jiné jich mohou kombinovat i několik.
- Asi nejzákladnější členění jazyků dle paradigmat je dělení na imperativní a deklarativní jazyky
- Jazyky můžeme dělit také podle toho, jakým způsobem přistupují k datům. Podle úrovně abstrakce se dělí na jazyky strojové úrovně, jazyky vyšší úrovně, univerzální jazyky, objektově orientované jazyky a další. My si popíšeme právě objektově orientované jazyky.
Imperativní jazyky
- Tento způsob programování je lidem asi nejbližší.
- Program tvoří zápis přesně definovaných kroků, které se provedou, když na ně přijde řada (podobné například receptu na vaření).
- Při programování v nějakém imperativním jazyku řešíme:
- Co se má provést?
- Kdy se to má provést?
- Jako zástupce si můžeme uvést například jazyky C a BASIC
- Program v BASIC (zdroj Wikibooks)
-
10 CLS * 20 PRINT "Hello, world!" 30 PRINT "I'm learning about commands in BASIC." 40 PRINT "This text is being printed via the PRINT command." 50 PRINT "On the next line, I'll use CLS." 60 CLS "Now the next word would be PRINT." 70 PRINT "Finally, on line 80, I'll use END." 80 END "And return to PRINT"ns 90 PRINT "Now my program is over."
- Program postupně vypisuje na obrazovku řetězce
-
- Program v C
-
#include "stdio.h" int main(){ printf("Hello World"); }
-
Deklarativní jazyky
- Deklarativní jazyky se od těch imperativních velmi liší. Nejenom zápisem programu jako takového, ale hlavně ve způsobu myšlení, jaký při návrhu deklarativních jazyků musíme použít.
- Při tvorbě programu programátor pouze sděluje, jakého výsledku chce dosáhnout. Už ale většinou nemá kontrolu nad tím, kdy se který krok výpočtu provede.
- Deklarativní jazyky můžeme rozdělit na funkcionální a logické, přičemž některé postupy z těchto paradigmat se mohou uplatnit i v jazycích imperativních.
Funkcionální jazyky
- Běh programu představuje z velké části provádění (často matematických) funkcí.
- Matematická funkce je závislá pouze na vstupech (argumentech), které zobrazuje na výstup. Nečte tedy žádné hodnoty z globálních proměnných, ani nemění jejich hodnoty (nemá vedlejší efekty).
- Zřetězené funkce postupně upravující data.
- Ve velké míře je uplatněna rekurze (funkce volá sama sebe)
- Je velice blízký modelu zvanému Lambda kalkul (formální matematický popis algoritmů)
- Jako příklady si můžeme uvést LISP, Haskell, Clojure, či F#
- Program v Haskell na výpočet Fibonacciho posloupnosti (zdroj Wikipedia)
-
fibonacci_aux = \n first second-> if n == 0 then "" else show first ++ "\n" ++ fibonacci_aux (n - 1) second (first + second) fibonacci = \n-> fibonacci_aux n 0 1 main = putStr (fibonacci 10)
-
- Program v Clojure
-
(println (str (+ 10 20 30 (* 10 20))))
-
Logické jazyky
- Využívá matematické logiky ke tvorbě programů
- Programu zadáme klauzule (pravidla), vztahy a vstupní data, které dále využívá k řešení problému.
- I zde se ve velké míře uplatňuje rekurze
- Asi nejznámějším reprezentantem je jazyk PROLOG
- Program v Prologu pro zjištění většího z čísel
-
maxOfTwo(X, Y, X) :-
X >= Y. % Větší ze dvou čísel X a Y je X, pokud platí X >= Y
maxOfTwo(X, Y, Y) :- X < Y. % Větší ze dvou čísel X a Y je Y, pokud platí X < Y
-
-
Objektově orientované jazyky
- Základním předpokladem objektově orientovaných jazyků je, že program tvoří struktury zvané objekty, které
- mají určité vlastnosti – parametry
- vnitřní proměnné jednotlivých objektů
- umí určité věci – metody
- funkce jednotlivých objektů
- mají určité vlastnosti – parametry
- Uvažujme jako náš objekt například psa
- Takový pes může mít různé parametry – například rasa, výška, jméno a další
- Jeho metody mohou být: běhej, štěkej, kousej …
- Takovéto objekty spolu vzájemně komunikují (mechanismu komunikace se říká zasílání zpráv)
- Čistě objektovými jazyky jsou například Smalltalk či Ruby
- Tímto paradigmatem se budeme zabývat v příštím článku, protože hlavním nástrojem pro programování Arduina je C++, které je objektově orientované.
Důležité je si také uvědomit, že kromě jazyků, které striktně dodržují určité paradigma, je velká část jazyků, které se snaží z jednotlivých paradigmat vybrat to nejlepší. Často se tak setkáme s jazyky, které jsou kombinací různých paradigmat (včetně C++) a my si můžeme částečně vybrat, jaký přístup zvolíme.
- Sledovač slunce s Arduinem - 23.3.2022
- Programovatelný kytarový pedál s Arduinem - 26.2.2020
- Arduino infračervený teploměr vytištěný na 3D tiskárně - 11.2.2020