2 Postup při programování, úvod do programovacího jazyka Java Studijní cíl V tomto bloku bude věnována pozornost správnému postupu při programování, budou detailně vysvětleny jednotlivé etapy programování a podíváme se také na základy vyššího programovacího jazyka Java.
Doba nutná k nastudování
2 – 2,5 hodiny
2.1 Postup při programování Při programování, stejně jako při jakékoliv jiné odborné činnosti, je vhodné dodržovat standardizované postupy. Stejně jako např. při stavbě domu, kdy je nejprve vypracován návrh, potom projekt a teprve potom následuje samotný proces jeho výstavby, tak i v oblasti vývoje počítačových programů existuje několik metodik, kterými je vhodné se řídit. Vysvětlování jakékoliv komplexní metodiky vývoje softwaru (např. Unified Process nebo Agile Unified Process - agilní metodiky vývoje software) by bylo nad rámec tohoto výukového materiálu (s touto problematikou se seznámíte v jiných specializovaných předmětech během dalšího studia), proto si uvedeme pouze stručně jeden z možných postupů při programování a zaměříme se na podrobný popis každé etapy. Dále uvedený postup při programování je opravdu nutné brát pouze jako jeden z možných, který ale budeme uplatňovat v tomto kurzu základů programování. V jiných kurzech programování nebo v navazujících předmětech se můžete a nejspíše se i setkáte s jiným postupem při programování, který může mít oproti zde uvedenému postupu celou řadu výhod (např. programování řízené testy). Tento kurz je určen začátečníkům v oblasti programování, proto je zde představen asi nejjednodušší koncept přístupu k programování. Nyní již tedy k základním osmi etapám, na které budeme rozkládat zadání úloh, které budeme mít za cíl vyřešit. Nejdříve si jednotlivé etapy představíme v obecné rovině a v průběhu dalšího výkladu se dostaneme také k příkladům. 1. Formulace úlohy – prvním krokem při řešení jakékoliv úlohy je formulace úlohy. Pokud přijde nějaký zákazník s tím, že by si chtěl nechat naprogramovat nějaký konkrétní produkt, tak je nejprve nutné daný produkt formulovat pro pochopení toho, co máme programovat a proč. Součástí této etapy jsou následující úkoly: a. Stanovují se cíle řešení – jaké funkce má daný program obsahovat – jedná se opravdu o základní úkol, aby nedošlo k tomu,
KST/IZAPR - Základy programování
blok 2, strana 1 (9)
Michael Bažant
že výsledný program bude dělat něco jiného, než co požaduje zákazník. b. Požadavky na přesnost – definujeme, jaké má uvažovat program vstupy, s jakou přesností má docházet ke zpracování dat, jaké má program poskytovat výstupy apod. c. Podklady pro řešení – zjištění, zda máme pro řešení úlohy vůbec dostupné všechny potřebné podklady, zda vůbec máme s dostupnými podklady možnost danou úlohu řešit. 2. Analýza úlohy – v této etapě se vytváří první představy o řešení. V rámci této etapy je nutné si odpovědět na následující otázky: a. Je úloha řešitelná? V dnešní době výkonných počítačů by se mohlo zdát, že jsou všechny úlohy řešitelné, ale z hlediska definovaných požadavků zákazníkem tomu tak být nemusí. Pokud by zákazník chtěl například realizovat nějaké složité výpočty v reálném čase, tak se může stát, že tento požadavek nebude možné splnit (spousta problémů není v reálném čase řešitelná). b. Jsou výchozí informace postačující? Po vytvoření představy o řešení dané úlohy je nutné zvážit, zda jsou dostupné informace o úloze postačující. 3. Návrh řešení – tato etapa již obsahuje konkrétní návrh toho, jak daný problém řešit s tím, že je výhodné nejprve jeden větší problém rozložit na více problémů menších a teprve poté volit metody řešení menších problémů. V tomto kroku se ale stále jedná o návrh, nikoliv samotné řešení, které bude následovat. a. Rozklad na podproblémy (třídy, metody, procedury, funkce apod.) b. Návrh metod řešení (např. třídění quicksort, bubblesort apod.) 4. Sestavení algoritmu řešení – když máme z předchozí etapy jasno v tom, jaký způsob řešení zvolíme, tak v této etapě daný způsob řešení zapíšeme. Samozřejmě není nutné (a obvykle to ani není vhodné) ihned psát samotný zdrojový kód programu. Je možné využít celou řadu jiných technik, které jsou k dispozici a které již znáte z předchozího studia (např. vývojové diagramy). a. Návrh vhodných datových struktur b. Zápis algoritmu c. Vývojový diagram d. Programovací jazyk v kombinaci s přirozeným jazykem (pseudojazyk)
KST/IZAPR - Základy programování
blok 2, strana 2 (9)
Michael Bažant
5. Kódování programu – zápis zdrojového kódu v programovacím jazyku. Pokud máme sestaveny algoritmy řešení programu, tak již nic nebrání zapsání zdrojového kódu ve vybraném programovacím jazyku 6. Odladění – v této etapě je nutné podrobit námi zapsaný program zkoušení (verifikaci) – zda pro dané vstupy poskytuje správné výstupy, přičemž můžeme využít několik možných přístupů: a. Zkoušení programu, případně testování – se základy testování se seznámíte v následujícím předmětu Objektově orientované programování. V tomto kurzu budeme používat zkoušení programu. b. Porovnání výsledků c. Ověření správnosti programu 7. Optimalizace – nastává v momentě, kdy program poskytuje správné výsledky a v této etapě nemá cenu optimalizovat na úrovni počtu cyklů v daném algoritmu nebo počtu proměnných apod. Tyto základní optimalizace zvládne rozumný překladač sám, spíše jde o záležitosti týkající se volby datových typů a datových struktur, které mohou vést k významným zrychlením běhu programu, zrychlení výpočtů, snížení paměťové náročnosti apod. Nutno podotknout, že zkušenější programátoři již tyto optimalizace zvažují a zapracovávají v bodě 3 – návrh řešení. Závěrem k této problematice je nutné poukázat na to, že je výhodné ve všech etapách (i v etapách 1–4) programování zvažovat testovací data – tzn. mít přehled o tom, jak se daný návrh projeví na těchto testovacích datech. V další části tohoto kurzu bude naše pozornost zaměřena zejména na etapy 5 a 6 uvedeného postupu, neboť předchozí kroky jste již poměrně podrobně prošli v předchozím kurzu základů algoritmizace. Tam, kde bychom se věnovali úlohám složitějšího charakteru (než jaké byly řešeny v kurzu základy algoritmizace), budou diskutovány i etapy předchozí 1-4.
2.2 Úvod do programovacího jazyka Java Po úvodních obecnějších informacích, které jsou ale nezbytné pro základní orientaci v oblasti programování, se může naše pozornost zaměřit na vyšší programovací jazyk Java. V tomto úvodu si uvedeme základní informace o tomto jazyku a v dalších blocích budeme rozvíjet znalosti tohoto jazyka o další konstrukce.
2.2.1 Proč jazyk Java? Při návrhu jazyka Java byl důraz kladen na odstranění složitostí, které obsahují jiné vyšší programovací jazyky, a proto se jazyk Java stal velmi populárním při výuce základů programování. Kromě této příjemné vlastnosti má ale celou řadu dalších příznivých vlastností jako jsou:
KST/IZAPR - Základy programování
blok 2, strana 3 (9)
Michael Bažant
Univerzálnost – je možné psát programy pro serverové aplikace, desktopové aplikace, aplikace pro přenosná zařízení (mobilní telefony, PDA), webové aplikace, aplety. Nejedná se o zkratku, ale slovo. Proto píšeme Java, nikoliv JAVA. Java Virtual Machine (JVM) – programy nejsou kompilovány přímo do strojového kódu ale do bytecode (mezikódu), který je spouštěn na virtuálním stroji jazyka Java. Díky použití této technologie je možné využívat příjemné vlastnosti jako je Garbage Collection (automatické rušení objektů v paměti pokud na ně není k dispozici reference) a také některé vlastnosti z bezpečnosti. K detailům těchto vlastností se dostaneme v dalším výkladu.
2.2.2 Stručná historie jazyka Java Projekt na vývoj dnešního jazyka Java založil James Gosling v roce 1991. Původní název projektu „Oak“ (dub) podle stromu před kanceláří, tento název byl již používán jiným programovacím jazykem. Z toho důvodu byl vybrán název „Java“ z několika náhodných slov. V roce 1995 byl uveden jazyk Java ve verzi 1.0 s tím, že heslo při uvedení znělo „Napiš jednou, spusť kdekoliv“. Poté následovaly další verze jazyka: JDK 1.02 – 1995 JDK 1.1 – 1996 JDK 1.2 – 1998 JDK 1.3 – 2000 JDK 1.4 – 2002 JDK 1.5 (Java 5) – 2004 JDK 1.6 (Java 6) – 2006 JDK 1.7 (Java 7) – 2011
2.2.3 Vlastnosti jazyka Java Jazyk Java, stejně jako i jiné vyšší programovací jazyky, disponuje celou řadou vlastností. Z důvodu obsažnosti tématu se omezíme pouze na stručný výklad základních vlastností jazyka, zájemce o bližší informace může nahlédnout např. do zdroje [1]. Mimo jiné je jazyk Java: Objektově orientovaný – jazyk Java je již od začátku vyvíjen jako objektově orientovaný jazyk (komunikace mezi objekty – viz Obrázek 1). Nikoliv tedy jako jiné jazyky, ke kterým byla objektově orientovaná funk-
KST/IZAPR - Základy programování
blok 2, strana 4 (9)
Michael Bažant
cionalita doplňována až v průběhu vývoje. Jazyk Java je objektově orientovaný až na 8 primitivních datových typů.
Obrázek 1: Princip objektově orientovaného programování
Distribuovaný - jazyk Java je navržen pro podporu aplikací v síti - podporuje různé úrovně síťového spojení, práce se vzdálenými soubory, umožňuje vytvářet distribuované klientské aplikace a servery. Jazyk je navržen tak, aby bylo možné distribuované výpočty realizovat snadno. Přístup k síťovým prostředkům je v zásadě stejný jako k lokálním souborům. Snadný - syntaxe jazyka je navržena na základě C++, přičemž cílem bylo jazyk významně zjednodušit oproti C++ a dosáhnout více funkčnosti než je v jazyce C++ a méně negativních aspektů pro začátečníky. Např. odpadá práce s ukazateli, používají se reference (odkazy na objekty v paměti), je k dispozici automatická správa paměti, dochází k automatické uvolňování paměti během života programu, datový typ boolean nabývá jen hodnot true nebo false Vícevláknový - nativně je možné využívat vícevláknový přístup (multithread) při psaní aplikací. Bezpečný - do jazyka je implementováno několik bezpečnostních mechanismů, kterých bylo dosaženo implementací Java Runtime Environment (JRE), které: o
spouští zkompilovaný kód
o
vykonává načítání tříd (class loader) – oddělení jmen tříd lokálního systému souborů od importovaných ze sítě, určování oblastí pamětí spouštěného programu až po nahrání všech tříd do paměti atd.
o
Vykonává verifikaci kódu (bytecode verifier) a finální spouštění – testování a kontrola fragmentů kódu na ilegální kód (mohl by porušit přístupová práva)
KST/IZAPR - Základy programování
blok 2, strana 5 (9)
Michael Bažant
Nezávislý na platformě – není nutné kompilovat zdrojový kód pro konkrétní platformu jako v případě jiných jazyků - viz Obrázek 2 jako příklad pro jazyk C.
Obrázek 2: Kompilace a spuštění programu napsaného v jazyce C na různých platformách
Způsob kompilace a spuštění programu napsaného v jazyce Java – viz Obrázek 3. U tohoto obrázku je nutné vysvětlení některých pojmů, jako např. bytecode, což je speciální strojový jazyk, které umí interpretovat Java Virtual Machine. Programy v jazyce Java jsou tedy spouštěny nebo chcete-li interpretovány programem, jehož název zní Java Virtual Machine. Program napsaný v jazyce Java tedy není spouštěn přímo na operačním systému, ale je spouštěn prostřednictvím Java Virtual Machine. To má tu výhodu, že jakýkoliv systém, na kterém je nainstalovaný Java Virtual Machine může spouštět programy napsané v jazyce Java nezávisle na tom, na kterém systému byly programy vyvíjeny. Bytecode je tedy speciální strojový jazyk, který je interpretován pomocí Java Virtual Machine, je nezávislý na hardware a každý počítač s Java interpretem může spustit zkompilovaný program napsaný v jazyce Java. Java Virtual Machine (JVM) je virtuální stroj, který poskytuje specifikace hardwaru, pro který se kompilují všechny programy v jazyce Java. JVM je odhadem nainstalován na více než 4 500 000 000 stanic po celém světě (údaj k roku 2009).
KST/IZAPR - Základy programování
blok 2, strana 6 (9)
Michael Bažant
Obrázek 3: Kompilace a spuštění programu napsaného v jazyce Java na různých platformách
Pro vývoj aplikací v jazyce Java je nutné mít k dispozici JDK (Java Development Kit), který obsahuje: JRE – Java runtime environment (java) Java Virtual Machine – závislý na platformě, obsahuje Java knihovny (class libraries) – závislé na platformě Java compiler (javac) Java API (Application Programming Interface) – dokumentace (JavaDoc) Doplňkové utility (pro vytváření souborů JAR, ladění programů atd.) např. JConsole ve složce bin (sledování paměti a vláken) Příklady programů
2.2.4 Výhody a nevýhody jazyka Java Jazyk Java má, stejně jako i jiné jazyky, celou řadu výhod a také celou řadu nevýhod. Mezi hlavní výhody patří vlastnosti uvedené v předchozí kapitole. Mezi nevýhody můžeme zařadit následující vlastnosti: paměťové nároky, vyžaduje interpret, kombinuje primitivní datové typy a objekty, programy napsané v jazyce Java mohou být při běhu pomalejší než v jiných jazycích.
KST/IZAPR - Základy programování
blok 2, strana 7 (9)
Michael Bažant
2.2.5 Jazyk Java – kompilace a spuštění programu Kompilaci zdrojového kódu zapsaného v jazyce Java provádíme pomocí Java kompilátoru (Java compiler), který je součástí nástrojů obsažených v JDK. Java compiler provádí kompilaci zdrojového kódu na bytecode. Pro spuštění dále používaných příkazů je nutné mít nainstalované JDK a případně mít také v operačním systému nastavenou cestu k těmto příkazům. Příkaz pro kompilaci je následující: javac [nastaveni] [soubory se zdroj. kodem] Příklad: javac HelloWorld.java Výsledkem kompilace je bytecode uložený v souboru se stejným názvem (ve stejné složce) Příklad: HelloWorld.class Pomocí různých parametrů je možné měnit nastavení kompilace, následující nastavení „-d“ provede uložení výsledného souboru do složky „classes“. Příklad nastavení: javac –d classes HelloWorld.java Pro spuštění programu napsaného v jazyce Java používáme příkaz java [nastaveni] class [argumenty] Příklad: java HelloWorld Postup při kompilaci a spuštění programu z příkazové řádky je uveden na obrázku (viz Obrázek 1).
Obrázek 4: Postup při kompilaci a spuštění programu v příkazovém řádku
Závěrem této kapitoly bych upozornil na rozdíl při zadávání souborů jako parametrů při kompilaci a spouštění, který je zřejmý z přechozích příkladů. Při kompilaci zadáváme celá název soubor i s příponou názvu souboru „.java“, při spuštění bez přípony názvu souboru „.class“.
KST/IZAPR - Základy programování
blok 2, strana 8 (9)
Michael Bažant
Otázky na procvičení 1. 2. 3. 4. 5.
Jaké základní kroky si představíte pod pojmem programování? Co může představovat optimalizace programu? Které činnosti se vykonávají během návrhu řešení programu? Co rozumíme pod zkratkou JVM? Co rozumíme pod zkratkou JRE?
Odkazy a další studijní prameny 1. Java Tutorial - http://docs.oracle.com/javase/tutorial/
KST/IZAPR - Základy programování
blok 2, strana 9 (9)
Michael Bažant