1. diel - Úvod do jazyka Java
Vitajte pri prvej lekcii populárneho on-line kurzu programovacieho jazyka Java. Budeme sa učiť postupne, od úplných začiatkov až po zložité konštrukcie, objektové modely a napr. prácu s databázou. S trochou trpezlivosti a vytrvalosti sa z teba stane dobrý programátor.
Minimálne požiadavky kurzu
Na tento kurz nepotrebujete žiadne špeciálne znalosti, stačí bežná práca s počítačom 🙂
Vývoj programovacích jazykov
Aby sme plne porozumeli jazyku Java, obzrieme sa do minulosti na to, ako sa programovacie jazyky vyvíjali. Bude pre nás dôležité pochopiť, ako Java pracuje a prečo je dobré programovať práve v tomto jazyku.
1. generácia jazykov - Strojový kód
Procesor počítača vie vykonávať len obmedzené množstvo jednoduchých inštrukcií, ktoré sú uložené ako sekvencie bitov, sú to teda čísla. Tie sa mu obvykle zadávajú v hexadecimálnej (šestnástkovej) sústave. Inštrukcie sú tak elementárne, že umožňujú iba napr. sčítanie adries alebo skoky medzi inštrukciami. Nie je možné napr. jednoducho sčítať dve čísla, musíme sa na čísla pozerať ako na adresy v pamäti a také sčítanie čísel zaberie niekoľko inštrukcií. Program sčítavajúci dve čísla by vyzeral napr. takto:
2104 1105 3106 7001 0053 FFFE 0000
Inštrukcie sú procesoru predložené v binárnej podobe. Takýto kód je samozrejme extrémne nečitateľný a závisí od inštrukčnej sady daného CPU. V tomto jazyku určite nebude jednoduché tvoriť nejaké programy, bohužiaľ každý program musí byť nakoniec do tohto jazyka preložený, aby mohol byť na procesore počítača spustený:
2. generácia jazykov - Assembler
Assembler (skrátene ASM) nie je o nič jednoduchší než strojový kód, ale je ľudsky čitateľný. Jedná sa o strojový kód, v ktorom majú inštrukcie slovné označenie (kód), čiže si človek nemusí pamätať čísla. Kódy inštrukcií sa potom preložia do vyššie uvedeného strojového kódu. Rovnaký program by v ASM vyzeral takto:
ORG 100 LDA A ADD B STA C HLT DEC 83 DEC –2 DEC 0 END
Vidíme, že je to trochu ľudskejšie, ale nezasvätení ľudia stále vôbec netušia, ako program funguje (vrátane mňa).
3. generácia jazykov
Jazyky tretej generácie konečne ponúkajú užívateľovi určitú abstrakciu toho, ako program vidí počítač, zameriavajú sa na to, ako program vidí človek. Naše čísla sú vnímané už ako premenné, zdrojový kód pripomína matematický zápis.
Sčítanie dvoch čísel by v jazyku C vyzeralo takto:
int main(void) { int a, b, sum; a = 83; b = -2; sum = a + b; return 0; }
Všetci asi tušíme, čo program robí, sčíta čísla 83
a
-2
a výsledok uloží do premennej sum
. U všetkých
jazykov tretej generácie je samozrejme výhodou vysoká
čitateľnosť.
S ďalším vývojom išli jazyky ešte ďalej a priniesli objektovo orientované programovanie, ale o tom až neskôr.
Kategórie jazykov
Jazyky tretej generácie môžeme v zásade rozdeliť do troch kategórií.
1. Kompilované jazyky
Kompilované (neriadené) jazyky majú teda svoj zdrojový kód v jazyku, ktorému ľudia dobre rozumejú. Tento zdrojový kód sa samozrejme musí preložiť do strojového kódu, aby ho bolo možné na procesore spustiť. Tento preklad zaisťuje prekladač (kompilátor), ktorý preloží naraz celý program do strojového kódu:
Výhody kompilácie
Medzi hlavné výhody kompilácie patrí:
- Rýchlosť - Jediné zbrzdenie spočíva v jednorazovej kompilácii, preložený program potom beží porovnateľne rýchlo, ako keby bol napísaný napr. v ASM.
- Neprístupnosť zdrojového kódu - Program sa šíri už skompilovaný, nie je ho možné jednoducho modifikovať, ak zároveň nevlastníte jeho zdrojový kód.
- Jednoduché odhalenie chýb v zdrojovom kóde - Ak zdrojový kód obsahuje chybu, celý proces kompilácie spadne a programátor je s chybou oboznámený. To značne zjednodušuje vývoj.
Nevýhody kompilácie
Kompilácia so sebou samozrejme prináša niekoľko nevýhod:
- Závislosť od platformy - Program je stále závislý od platformy, teda od typu procesora a operačného systému. Skompilovaný program nemôžeme vziať a preniesť na inú platformu bez toho, aby bol na tejto platforme skompilovaný.
- Nemožnosť editácie - Akonáhle sa program raz skompiluje do strojového kódu, nemožno ho editovať inak než opätovnou kompiláciou. To pochopiteľne platí aj pre vyššie spomínané jazyky.
- Memory management - Vzhľadom na to, že počítač danému programu nerozumie a len mechanicky vykonáva inštrukcie, môžeme sa niekedy stretnúť s veľmi nepríjemnými chybami s pretečením pamäte. Kompilované jazyky zvyčajne nemajú automatickú správu pamäte a sú to jazyky nižšie (s nižším komfortom pre programátora). Behové chyby spôsobené najmä zlou správou pamäte sa kompiláciou neodhalia.
Príkladom kompilovaných jazykov sú napr. jazyk C, jeho objektový následník C++ alebo Pascal/Delphi.
2. Interpretované jazyky
Interpretácia sa snaží riešiť problém prenositeľnosti programov medzi rôznymi platformami a tiež prichádza s vyšším komfortom pre programátora. Interpreter funguje podobne ako kompilátor, len neprekladá program celý naraz, ale prekladá iba to, čo je v danej chvíli potrebné. (Interpreter znamená v angličtine tlmočník, teda najskôr si vypočuje jednu vetu hovorcu a tú potom preloží a vysloví. Preklad prebieha počas príhovoru, teda behu programu, po vetách/inštrukciách. Kompilátor/prekladač preloží celý rozhovor naraz a potom ho celý prečíta.). Môžeme si predstaviť, že vyššie uvedený zdrojový kód by interpreter čítal po jednotlivých riadkoch, tú časť by vždy skompiloval do strojového kódu a vykonal. Výsledok kompilácie by zahodil a presunul by sa na ďalší riadok. Možno vám to pripadá ako plytvanie výkonom procesora a je pravda, že tento spôsob behu programu tiež nie je práve najrýchlejší:
Výhody interpretera
Aké môže mať teda tento postup výhody? Je ich hneď niekoľko:
- Prenositeľnosť - Program je plne prenositeľný a zdrojový kód programu tam pôjde spustiť, ak existuje interpreter pre danú platformu (a vývoj interpretera je ľahší než vývoj kompilátora).
- Jednoduchší vývoj - Vo vyšších jazykoch sa nemusíme zaoberať správou pamäte, toto za nás robí tzv. garbage collector (povieme si o ňom v seriáli viac). Často tiež nemusíme ani zadávať dátové typy a máme k dispozícii vysoko komfortné kolekcie a ďalšie štruktúry.
- Stabilita - Vďaka tomu, že interpreter kódu rozumie, predíde chybám, ktoré by skompilovaný program inak pokojne vykonal. Beh interpretovaných programov je teda určite bezpečnejší, ďalej má zaujímavú vlastnosť, tzv. reflexiu, kedy program za behu skúma sám seba, ale o tom neskôr.
- Jednoduchá editácia - Program môžeme vyvíjať po častiach a nahrávať na cieľové umiestnenie vďaka tomu, že sa nemusí kompilovať, a je možné jednoducho editovať „za behu“.
Nevýhody interpretera
Interpreter má však tri zásadné nevýhody:
- Rýchlosť - Interpretácia môže byť často veľmi pomalá a program tak nevyužíva výkon počítača naplno.
- Často ťažké hľadanie chýb - Vďaka kompilácii za behu sa chyby v kóde objavia až vo chvíli, keď je kód spustený. To môže byť niekedy veľmi nepríjemné.
- Zraniteľnosť - Pretože sa program šíri v podobe zdrojového kódu, každý do neho môže zasahovať alebo kradnúť jeho časti.
Príkladom interpretovaného jazyka je napr. PHP. Na väčšine webov tento pomerne pohodlný jazyk výkonnostne stačí, ale napríklad Facebook používa špeciálnu kompilovanú verziu PHP, záujemcovia nech sa pozrú na projekt HipHop for PHP.
3. Jazyky s virtuálnym strojom
Napadlo vám, čo by sa stalo, keby sa oba dva vyššie spomenuté spôsoby spojili? Ak áno, gratulujem, vynašli ste virtuálny stroj. Jedná sa o najmodernejšiu podobu jazyka, ktorá je v súčasnej dobe tiež najrozšírenejšou a najlepšou voľbou pre vývoj väčšiny aplikácií. Nebudem tajiť, že do tejto kategórie patrí samotná Java alebo C#.
Zdrojový kód je najprv preložený do tzv. medzikódu, ktorému sa v Jave hovorí bytecode. Ide v podstate o strojový (binárny) kód, ktorý má ale o poznanie jednoduchšiu inštrukčnú sadu a priamo podporuje objektové programovanie. Tento medzikód je potom vďaka jednoduchosti relatívne rýchlo interpretovateľný tzv. virtuálnym strojom (teda interpreterom, v prípade Javy je to tzv. JVM – Java Virtual Machine). Výsledkom je strojový kód pre náš procesor:
Výhody virtuálneho stroja
Určite ste trochu vydesení, ale verte, že sme v podstate odstránili nevýhody interpretera aj kompilátora a môžeme využívať mnohé z ich výhod:
- Odhalenie chýb v zdrojovom kóde - Vďaka kompilácii do bytecode jednoducho odhalíme chyby v zdrojovom kóde.
- Stabilita - Vďaka tomu, že interpreter kódu rozumie, zastaví nás pred vykonaním nebezpečnej operácie a na chybu upozorní. Môžeme tiež vykonávať reflexiu (aj keď pre bytecode, ale od toho sme väčšinou oprostení).
- Jednoduchý vývoj - Máme k dispozícii hi-tech dátové štruktúry a knižnice, správu pamäte za nás vykonáva garbage collector.
- Slušná rýchlosť - Rýchlosť sa pri virtuálnom stroji pohybuje medzi interpreterom a kompilátorom. Virtuálny stroj už výsledky svojej práce po použití nezahadzuje, ale dokáže ich cachovať, sám sa teda optimalizuje pri početnejších výpočtoch a môže dosahovať až rýchlosť kompilátora. Štart programu býva pomalší, pretože stroj prekladá spoločne využívané knižnice.
- Málo zraniteľný kód - Aplikácia sa šíri ako zdrojový kód v bytecode, nie je teda úplne jednoducho ľudsky čitateľná.
- Prenositeľnosť - Asi je jasné, že hotový program pobeží na každom železe, na ktorom sa nachádza virtuálny stroj.
Java a JDK
Java je distribuovaná v troch edíciách:
- Java SE - Štandardnú edíciu budeme používať na začiatok.
- Java EE - Enterprise edícia nie je v skutočnosti iná Java, ale sada knižníc do JSE, ktorá umožňuje vytvárať veľké webové aplikácie. Je pomerne komplikovaná, ale vo firmách extrémne žiadaná. Pokiaľ sa ju naučíte, budete veľmi žiadanými programátormi.
- Java ME - Mikro edícia beží v SIM kartách, práčkach a ďalších elektronických zariadeniach (Oracle tvrdí, že Java poháňa 9 miliárd zariadení).
Na spustenie našich aplikácií budeme potrebovať JRE (Java Runtime Environment), čo je behové prostredie obsahujúce virtuálny stroj. Na vývoj budeme potom potrebovať JDK (Java Development Kit), ktorý obsahuje knižnice a nástroje pre vývojárov.
Java je zadarmo pre nekomerčné použitie. Od verzie 11 je však Java pre komerčné účely spoplatnená.
Našťastie existuje edícia OpenJDK, ktorú je možné používať zadarmo aj pre komerčné aplikácie.
Aplikácie v Jave tiež možno spúšťať priamo vo webovom prehliadači pomocou Java Web Start. Ten sa tiež automaticky stará o aktualizáciu vašej aplikácie.
Jazyky s virtuálnym strojom ctia objektovo orientované programovanie a jedná sa o súčasný vrchol vývoja v tejto oblasti.
Existujú aj jazyky 4. a 5. generácie, ale tie majú špecifické použitie a nebudeme sa tu nimi zatiaľ zaoberať.
Teraz už vieme, s čím to vlastne budeme pracovať.
V budúcej lekcii, IntelliJ IDEA a prvá konzolová aplikácia, si ukážeme prácu s IDE (programátorským prostredím) IntelliJ. Vytvoríme si svoj prvý program.