Text v počítači je reprezentován pomocí (nečekaně) čísel.
Každému znaku je přiřazeno nějaké číslo, vznikne tak mapování
kódování (čísla) na znak.
Nejznámější kódování je ASCII (používá 7 bitů na znak, 128 znaků).
Vznikla v dávné minulosti (60. léta) a vyšla z potřeby
standardizovat znaky používané v anglicky mluvících zemích.
Obsahuje písmena anglické abecedy, číslice, základní interpunkční
znaménka a pár speciálních znaků (nový řádek, tabulátor, atd.).
Problém ASCII je, že neobsahuje znaky s diakritikou, ani znaky z jiných abeced.
Moderní kódování je UTF-8.
Je zpětně kompatibilní s ASCII (prvních 128 znaků je stejných).
Používá proměnný počet bajtů na znak (1 až 4 bajty).
Obsahuje znaky z většiny světových abeced, včetně diakritiky, speciálních znaků, emoji, atd.
Stack a heap
V paměti počítače jsou data organizována do různých oblastí.
Nejblíž procesoru jsou registry (rychlé, velmi malé, mezipamět na
počítání a operace)
Dále je to cache (L1, L2, L3), která je větší než registry, ale
pomalejší. Není to pamět, kterou programátor přímo ovládá, ale
pomáhá zrychlit přístup k datům.
Cachují se jak často používaná data, tak rozmezí adres v paměti.
Hlavní paměť (RAM) je větší, ale pomalejší.
Zde běží programy a jsou uložena jejich data.
V operační paměti má každý program svou vlastní oblast paměti.
Přiřazuje mu ji operační systém.
Tato oblast je rozdělena na několik částí, z nichž nejdůležitější
jsou stack a heap.
Stack (zásobník)
Slouží pro ukládání lokálních proměnných, proměnných u kterých
známe velikost a řízení toku programu.
Je organizován jako zásobník (LIFO - last in, first out).
Když se volá funkce, na stack se uloží informace o jejím stavu
(parametry, návratová adresa, lokální proměnné).
Po skončení funkce se tyto informace odstraní.
Přístup k datům na stacku je velmi rychlý, protože je určen při
překladu programu.
Heap (halda)
Slouží pro dynamicky alokovaná data, jejichž velikost není
známá při překladu programu.
Data na haldě mohou být alokována a dealokována v libovolném
pořadí.
Přístup k datům na haldě je pomalejší než na stacku, protože
vyžaduje správu paměti za běhu programu.
Programovací jazyky
Dnes jsme si předvedli dělení na interpretované a kompilované jazyky.
Také jsme zmínili JITované jazyky.
Interpretované jazyky (Python, JavaScript, Ruby,...)
Kód je vykonáván řádek po řádku.
Náš program je vykonávaný interpretem.
Výhody:
Přenositelnost mezi platformami.
Většinou jednodušší na vývoj
Nevýhody:
Pomalejší výkon.
Vyšší nároky na paměť.
Kompilované jazyky (C, C++, Rust,...)
Kód je přeložen do strojového kódu před spuštěním programem, kterému
říkáme překladač.
Ten vyplivne spustitelný soubor, který je pak vykonáván přímo procesorem.
Výhody:
Rychlejší běh programu (nemáme overhead interpretu).
Nižší nároky na paměť.
Nevýhody:
Méně přenositelné (je třeba překládat pro každou platformu zvlášť).
Vývoj může být složitější (kompilace, ladění,...).
JITované jazyky (Java, C#, Kotlin,...)
Kombinují prvky interpretovaných a kompilovaných jazyků.
Kód je nejprve přeložen do mezikódu (bytecode), který je pak
interpretován JIT (Just-In-Time) kompilátorem (někdy tomuto programu
říkáme runtime) za běhu programu.
Mezikód je optimalizovaný, ale ne úplně. Není to strojový kód.
Optimalizace probíhají až při běhu programu.
Výhody:
Lepší výkon než čistě interpretované jazyky.
Přenositelnost mezi platformami (stačí mít JIT runtime).
Nevýhody:
Výkon může být nižší než u čistě kompilovaných jazyků