IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 1 - Úvod do Dartu

Vítejte u prvního dílu on-line kurzu, který vám odhalí programovací jazyk Dart. Budeme se učit postupně, od úplných začátků až po složité konstrukce, objektové modely a např. práci s databází nebo webové aplikace. S trochou trpělivosti a vytrvalosti se z tebe tak stane dobrý programátor.

Dart a Dart SDK

Dart je moderní jazyk od Google, ve kterém jsou napsané např. Google Analytics. Lze jej použít v prohlížeči, na serveru, v příkazové řádce nebo v mobilních zařízeních. Nejčastěji ale konkuruje na webu JavaScriptu, do kterého se kompiluje a kde tak poskytuje programátorům vysoký komfort. Na webu se často setkáte s využitím frameworku AngularDart, Dart verzi webového frameworku Angular, který tvoří mocný nástroj na vývoj robustních webových aplikací.

Jazyk Dart je hojně ovlivněn jazyky jako JavaScript, Java, C# atp. Z každého si bere řadu dobrých vlastností a přidává i své vlastní novinky. Jelikož je Dart velmi podobný jazykům vycházejících z jazyka C, lze se jej opravdu lehce naučit.

Programovací jazyk Dart - Základní konstrukce jazyka Dart

U vývoje pro prohlížeče bych se ještě zastavil, jelikož by bylo dobré zmínit, že dlouhou dobu měl Dart svou vlastní verzi prohlížeče Dartium (vycházející z Chromium) s fungujícím Dart VM, což znamená, že bylo možné spustit Dart v prohlížeči nativně. Jedna z vizí Dartu byla, že by mohl postupně nahradit JavaScript, což se (bohužel) nevydařilo a Dart tým od tohoto záměru nadobro opustil, což mělo za následek mylný dojem veřejnosti, že Dart jako takový končí. Opak je však pravdou. Kromě toho všeho vyvíjí Dart tým perfektní dart2js kompilátor, který velmi efektivně převede kód Dartu do JavaScriptu.

Dart lze taktéž využít na vývoj konzolových/ser­verových aplikací a relativně nově i pro vývoj velmi rychlých (60+ fps) multiplatformních (iOS a Android) mobilních aplikací ve Flutter.

Dart podporuje dynamické i statické typování, avšak vývoj Dartu směřuje k přechodu na pouze statické typování – avšak typ dynamic bude stále možno používat.

Další výhodou Dartu je, že je zcela zdarma a je tedy dostupný všem vývojářům. Vývoj Dartu je open source.

Abychom plně porozuměli jazyku Dart, ohlédněme se do minulosti na to, jak se programovací jazyky vyvíjely. Bude pro nás totiž důležité pochopit, jak Dart pracuje a proč je dobré programovat právě v něm.

Vývoj programovacích jazyků

1. generace jazyků - Strojový kód

Procesor počítače umí vykonávat jen omezené množství jednoduchých instrukcí, které jsou uloženy jako sekvence bitů, jsou to tedy čísla. Ta se mu obvykle zadávají v hexadecimální (šestnáctkové) soustavě. Instrukce jsou tak elementární, že umožňují pouze např. sčítání adres nebo skoky mezi instrukcemi. Nelze např. jednoduše sečíst dvě čísla, musíme se na čísla dívat jako na adresy v paměti a takové sečtení čísel zabere několik instrukcí. Program sčítající dvě čísla by vypadal např. takto:

2104
1105
3106
7001
0053
FFFE
0000

Instrukce se procesoru předloží v binární podobě. Takovýto kód je samozřejmě extrémně nečitelný a závisí na instrukční sadě daného CPU. Určitě v tomto jazyce nebude jednoduché tvořit nějaké programy, bohužel každý program musí být nakonec do tohoto jazyka přeložen, aby mohl být na procesoru počítače spuštěn.

Strojový kód - Základní konstrukce jazyka Dart

2. generace jazyků - Assembler

Assembler (zkráceně ASM) není o nic jednodušší, než strojový kód, ale je lidsky čitelný. Jedná se o strojový kód, ve kterém mají instrukce slovní označení (kód), čili si člověk nemusí pamatovat čísla. Kódy instrukcí se poté přeloží na výše uvedený strojový kód. Stejný program by v ASM vypadal takto:

ORG 100
LDA A
ADD B
STA C
HLT
DEC 83
DEC –2
DEC 0
END

Vidíme, že je to poněkud lidštější, ale stále nezasvěcení lidé vůbec netuší, jak program funguje (včetně mne).

3. generace jazyků

Jazyky v třetí generaci konečně nabízí uživateli určitou abstrakci nad tím, jak program vidí počítač, zaměřují se na to, jak program vidí člověk. Naše čísla jsou vnímána již jako proměnné, zdrojový kód připomíná matematický zápis.

Sečtení dvou čísel by v jazyce C vypadalo takto:

int main(void)
{
    int a, b, c;
    a = 83;
    b = -2;
    c = a + b;
    return 0;
}

Všichni asi tušíme, co program dělá, sečte čísla 83 a -2 a výsledek uloží do proměnné c. U všech jazyků třetí generace je samozřejmě výhodou vysoká čitelnost. S dalším vývojem šly jazyky ještě dál a přinesly objektově orientované programování, ale o tom až později. Jazyky v třetí generaci spadají v zásadě do třech kategorií:

Kompilované jazyky

Kompilované (neřízené) jazyky mají tedy svůj zdrojový kód v jazyce, kterému lidé dobře rozumí. Tento zdrojový kód se samozřejmě musí přeložit do strojového kódu, aby ho bylo možné na procesoru spustit. Tento překlad zajišťuje překladač (kompiler), který přeloží najednou celý program do stroj. kódu.

Kompiler - Základní konstrukce jazyka Dart

Kompilace má tyto výhody:

  • Rychlost - Jediné zbrzdění spočívá v jednorázové kompilaci, přeložený program poté běží srovnatelně rychle, jako kdyby byl napsán např. v ASM.
  • Nepřístupnost zdroj. kódu - Program se šíří již zkompilovaný, není jej možné jednoduše modifikovat pokud zároveň nevlastníte jeho zdroj. kód.
  • Snadné odhalení chyb ve zdroj. kódu - Pokud zdrojový kód obsahuje chybu, celý proces kompilace spadne a programátor je s chybou seznámen. To značně zjednodušuje vývoj.

Dále jsou tu samozřejmě nevýhody:

  • Závislost na platformě - Program je stále závislý na platformě, tedy na typu procesoru a operačním systému. Zkompilovaný program nemůžeme vzít a přenést na jinou platformu bez toho, aby byl na této platformě zkompilován.
  • Nemožnost editace - Jakmile se program jednou zkompiluje do strojového kódu, nelze ho editovat jinak, než opětovnou kompilací. To pochopitelně platí i pro výše zmíněné jazyky.
  • Memory management - Vzhledem k tomu, že počítač danému programu nerozumí a jen mechanicky vykonává instrukce, můžeme se někdy setkat s velmi nepříjemnými chybami s přetečením paměti. Kompilované jazyky obvykle nemají automatickou správu paměti a jsou to jazyky nižší (s nižším komfortem pro programátora). Běhové chyby způsobené zejména špatnou správou paměti se kompilací neodhalí.

Příkladem kompilovaných jazyků jsou např. jazyk C, jeho objektový následník C++ nebo Pascal nebo Delphi.

Jak jsme si již říkali, Dart se někdy převádí do JavaScriptu. Tomuto procesu říkáme také kompilace, i když se nejedná o nativní kód, ale o kód jiného programovacího jazyka. Kód v Dartu je mnohem jednodušší a přehlednější, do JavaScriptu jej musíme zkompilovat samozřejmě proto, že v prohlížečích Dart není, ale JavaScript ano.

Interpretované jazyky

Interpretace se snaží řešit problém přenositelnosti programů mezi různými platformami a také přichází s vyšším komfortem pro programátora. Interpret funguje podobně, jako kompiler, jen nepřekládá program celý najednou, ale překládá pouze to, co je v danou chvíli potřeba. (Interpreter znamená v angličtině tlumočník, tedy nejprve vyslechne jednu větu mluvčího a tu poté přeloží a vysloví. Překlad probíhá během proslovu, tedy běhu programu, po větách/instrukcích. Kompiler/překladač přeloží rozhovor celý najednou a poté ho celý přečte.). Můžeme si představit, že výše uvedený zdrojový kód by interpret četl po jednotlivých řádcích, tu část by vždy zkompiloval do strojového kódu a vykonal. Výsledek kompilace by zahodil a přesunul by se na další řádek. Možná vám to připadá jako plýtvání výkonem procesoru a je pravda, že tento způsob běhu programu také není zrovna nejrychlejší.

Interpreter - Základní konstrukce jazyka Dart

Jaké může mít tedy tento postup výhody? Je jich hned několik:

  • Přenositelnost - Program je plně přenositelný, pokud existuje interpret pro danou platformu, půjde tam zdrojový kód programu spustit (a vývoj interpretu je snazší, než vývoj kompilátoru).
  • Jednodušší vývoj - Ve vyšších jazycích jsme odstíněni od správy paměti, kterou za nás dělá tzv. garbage collector (řekneme si o něm v seriálu více). Často také nemusíme ani zadávat datové typy a máme k dispozici vysoce komfortní kolekce a další struktury.
  • Stabilita - Díky tomu, že interpret kódu rozumí, předejde chybám, které by zkompilovaný program jinak klidně vykonal. Běh interpretovaných programů je tedy určitě bezpečnější, dále umožňuje zajímavou vlastnost, tzv. reflexi, kdy program za běhu zkoumá sám sebe, ale o tom později.
  • Jednoduchá editace - Program můžeme vyvíjet po částech a nahrávat na cílové umístění, díky tomu, že se nemusí kompilovat, ho je možné jednoduše editovat "za běhu".

Interpret má tři zásadní nevýhody:

  • Rychlost - Interpretace může být mnohdy velmi pomalá a program tak plně nevyužívá výkon počítače.
  • Často obtížné hledání chyb - Díky kompilaci za běhu se chyby v kódu objeví až v tu chvíli, kdy je kód spuštěn. To může být někdy velmi nepříjemné.
  • Zranitelnost - Protože se program šíří v podobě zdrojového kódu, každý do něj může zasahovat nebo krást jeho části.

Příkladem interpretovaného jazyka je např. PHP.

Jazyky s virtuálním strojem

Napadlo vás, co by se stalo, kdyby se oba dva výše zmíněné způsoby spojily? Pokud ano, gratuluji, vynalezli jste virtuální stroj. Jedná se o nejmodernější podobu jazyka, která je v současné době také nejrozšířenější a nejlepší volbou pro vývoj většiny aplikací. Nebudu tajit, že do této kategorie spadá samotný Dart, obdobně jako C# nebo Java.

Určitě jste trochu vyděšeni, ale věřte, že jsme v podstatě odstranili nevýhody interpreta i kompileru a můžeme využívat mnohé z jejich výhod:

  • Odhalení chyb ve zdrojovém kódu - Díky statické analýze kódu jednoduše odhalíme chyby ve zdrojovém kódu.
  • Stabilita - Díky tomu, že interpret kódu rozumí, nás zastaví před vykonáním nebezpečné operace a na chybu upozorní. Můžeme také provádět reflexi.
  • Jednoduchý vývoj - Máme k dispozici hitech datové struktury a knihovny, správu paměti za nás provádí garbage collector.
  • Slušná rychlost - Rychlost se u virtuálního stroje pohybuje mezi interpretem a kompilerem. Virtuální stroj již výsledky své práce po použití nezahazuje, ale dokáže je cachovat, sám se tedy optimalizuje při četnějších výpočtech a může dosahovat až rychlosti kompileru. Start programu bývá pomalejší, protože stroj překládá společně využívané knihovny.
  • Přenositelnost - Asi je jasné, že hotový program poběží na každém železe, na kterém se nachází virtuální stroj.

Dart je specifický v tom (oproti C# nebo Javě), že svůj kód nepřekládá do mezikódu. Dart VM (Dart Virtual Machine) jako vstup přijímá přímo jazyk Dart. Pro statickou analýzu kódu se využívá Static Analyzer, například nástroj dartanalyzer.

Jazyky s virtuálním strojem ctí objektově orientované programování a jedná se o současný vrchol vývoje v této oblasti. Existují i jazyky 4. a 5. generace, ale ty mají specifické použití a nebudeme se s nimi zde zatím zabývat.

Nyní víme, s čím to vlastně budeme pracovat. V příští lekci, IntelliJ IDEA a první konzolová aplikace, si ukážeme práci s IDE (programátorským prostředím) IntelliJ IDEA a vytvoříme si svůj první program.


 

Všechny články v sekci
Základní konstrukce jazyka Dart
Přeskočit článek
(nedoporučujeme)
IntelliJ IDEA a první konzolová aplikace
Článek pro vás napsal Honza Bittner
Avatar
Uživatelské hodnocení:
27 hlasů
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Aktivity