Je java vhodná pro desktop?

javalogo Java se stala velmi oblíbeným jazykem. Je plně postavena na principech objektově orientovaného programování a svou jednoduchostí si získala srdce nejednoho developera. Objevuje se v mobilních zařízeních, na webových stránkách, v různých podnikových aplikacích a tak podobně. Jak je to ale s jejím uplatněním na desktopech?

Výhody javy

Asi největší výhodou javy je její přenositelnost. Pokud napíšete aplikaci v javě, spustíte ji potom na jakékoliv platformě, pro kterou bylo vytvořeno JVM (Java Virtual Machine). Díky tomu odpadají problémy s portováním pro jinou platformu. I když je třeba i C/C++ multiplatformní jazyk, javě se v tomhle ani zdaleka nevyrovná.

Vývoj aplikací je velmi rychlý, protože java už v základu obsahuje spoustu hotových řešení, které můžete při vývoji využít. Vy už se potom staráte jen o správný návrh aplikace, ty nízkoúrovňové záležitosti prostě neřešíte. Například díky garbage collectoru se nemusíte starat ani o správu paměti. Naproti tomu třeba v C/C++ si musíte pořádně hlídat každý paměťový prostor, který jste alokovali. Pokud byste ho potom správně nedealokovali, vznikl by tzv. memory leak, což je někdy taková noční můra všech programátorů. Zvlášť u velkých projektech se memory leaky hledají dost těžce a jejích oprava zabere spoustu času.

Druhá strana

Výhody jsou dost lákavé a svádějí člověka k dojmu, že java je nejlepší. To ale není pravda (menší odbočka: neexistuje nejlepší programovací jazyk, každý jazyk je vhodný na něco jiného).

Jako největší nevýhoda javy se uvádí její rychlost, tedy lépe řečeno pomalost. Proč jsou java aplikace vůbec pomalejší, než ty nativní, psané dejme tomu v C/C++? Pokud napíšete nějakou aplikaci, java přeloží zdrojový kód programu do tzv. byte-code. Tento byte-code je srozumitelný pro JVM, která ho poté interpretuje do podoby srozumitelné pro danou platformu.

Rychlost javy se ale stále zlepšuje a s rostoucím výkonem počítačů se tento nedostatek poměrně rychle vytrácí. Java aplikace teoreticky nebudou nikdy rychlejší něž aplikace, které byly staticky zkompilovány pro určitou platformu. Při dobrém návrhu se jim mohou rychlostně přiblížit, nebo dokonce i vyrovnat.

Další nevýhoda javy je paměťová náročnost. Například v C++ jste za správu paměti zodpovědní hlavně Vy. Když je program potom moc náročný na operační paměť, můžete za to ve většině případu Vy. V java aplikacích však za správu paměti zodpovídá garbage collector a Vy nemáte téměř žádné možnosti, jak ho ovlivnit. Správa paměti se stejně jako výkon java aplikací stále zlepšuje. Podstatnou nevýhodou je však nutnost spuštění celého běhového prostředí javy. U větších aplikací se tato nevýhoda vytrácí, ale u malých projektů je dost velká nevýhoda, že Váš malý prográmek zabírá v paměti více než 20MB. I přes dnešní ceny pamětí je to ale dost velká nevýhoda.

Pokud chcete vyvíjet aplikace v javě, musíte si shrnout všechny klady a zápory, a podle toho se potom rozhodnout, zda Vám to vyhovuje.

Problém s distribucí

Já však vidím největší problém javy někde jinde. Zkuste se zamyslet, kolik vůbec znáte java programů? Používáte nějaký? Já tedy ne a jedinou java aplikaci pro desktop, na kterou jsem kdy narazil byl program Rachota. Java sice nabízí relativně snadný způsob, jak distribuovat své aplikace. Můžete použít samospustitelné jar balíčky, na které stačí poklepat a ony se spustí.

Teoreticky to zní jednoduše, ale v praxi to tak snadno nefunguje. Zkuste si kupříkladu stáhnout zmíněný program Rachota. Je to jar soubor, zkuste na něj poklepat a spustit ho. Jde vám to?

Problémů je několik. Ke spuštění potřebujete Java Runtime Enviroment. Spustit můžete buď otevřením (klasickým dvojklikem na jar soubor), nebo z příkazové řádky pomocí příkazu java -jar nazevaplikace.jar .Pokud někdo nemá JRE, Váš program si prostě nespustí. Když potom bude chtít nějaký BFU Váš skvělý program zkusit a nebude mít JRE, pravděpodobně se na to vykašle. Proč by měl instalovat navíc ještě nějaký cizí program? Zkuste to takovým uživatelům nějak vysvětlit, není to nic snadného 🙂

Taky se může stát, že uživatel sice bude mít JRE v systému nainstalováno, ale bude mít špatnou asociaci souborů s příponou .jar. Třeba na bráchovém počítači se při poklepání na jar soubor otevře obsah archívu ve Winzipu. Takový člověk si zas pro změnu řekne, že sice nároky na spuštění programu splňuje, a přesto to nejde spustit. Tak se na to taky vykašle.

Jak to tedy vyřešit? Způsob může být třeba použití nějakého skriptu, který bude ve formě .bat souboru a jediné co provede bude volání java -jar z příkazové řádky. Další možnou variantou je spolu s programem distribuovat celé JRE. Už jsem to tak někde viděl, ale detailnější informace o tomto řešení zatím nemám. Bylo by to sice skvělé, protože by uživatel nemusel mít nic nainstalovano, ale datová náročnost by potom dost vzrostla. Malá, jednoduchá aplikace zabírající na disku několik desítek megabajtů nejspíše nebude budit v očích uživatele moc důvěry.

Nejlépší řešení je asi kompilace aplikace do nativního zdrojového kódu. Tím ale příjdete o onu úžasnou přenositelnost. Ke kompilaci můžete použít GCJ (GNU Compiler for the Java). Tuto možnost jsem zatím blíže nezkoumal, ale v budoucnu se tím budu zabývat trochu více do hloubky. Bude to nejspíše jedno z možných dalších témat zde na blogu.

Situace se zlepšuje, protože spoustu lidí má JRE už předinstalováno, nebo se jim nainstalovalo kvůli potřebě spouštět java aplikace v prohlížeči. Nicméně distribuce java aplikací je zatím stále složitější, než v případě nativních aplikací zkompilovaných pro danou platformu. Až se tato skutečnost vyřeší, bude podle mě vznikat mnohem více desktopových java aplikací.

Příspěvek byl publikován v rubrice Programování. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

7 komentářů: Je java vhodná pro desktop?

  1. Já osobně neprogramuji, takže do této problematiky nijak hlouběji nevidím a vycházím tak tedy jen s informací, které jsem vyčetl na netu. Ovšem pokud jde o Javu, tak, i přes její výhody, narážím povětšinou spíše na negativní reakce. Ať už je to ona pomalost, nebo datová náročnost, atd. Jistě – výhodou je ona multiplatfomnost, ovšem ta je taky jen relativní a prostě ne všude a vždy Java program pojede.

    Naopak jako velmi slibná programátorská platforma se mi (podle informací z fór) zdá být .NET. Psát se může ve spoustě jazyků, .NET programy jsou relativně rychlé a rovněž možnost stažení NET Framework např. přes Windows Update je jednodušší, než hledání instalátoru JRE na stránkách Sunu pro běžného uživatele (byť z http://www.java.com je to celkem snadné).

    Takže ano – pro Javu si dokážu představit soustu využití, ale přesto se na desktopu příliš nevyužívá. Pročpak asi – to jsi víceméně napsal v článku. Zato na mladší .NET platformě vyrůstají aplikace jako houby po dešti a na různých stránkách se softwarem najdeme ohromné množství .NET programů. Což má mimojiné za důsledek, že rozšíření .NET Frameworku bude mezi lidmi vyšší, než JRE, protože .NET využijí pro desítky aplikací, kdežto JRE možná pro i-net bankovnictví některých bank a pak pro … No – těžko hledat ;).

  2. Flavicius napsal:

    Super článek, úplně si mě nadchl… Jestli budeš psát něco jako seriál o vývoji té hry, tak to prosím zkus pobrat stylem pro začátečníky v Jave 😛

  3. David napsal:

    Přemek: no předně musím říct, že .NET je dost mimo oblast mého zájmu, takže o tom moc nevím, ale máš pravdu, že pro desktop se hodí více. Protože .net framework má nainstalována většina uživatelů windows. Ale k té rychlosti. Nevím přesné výsledky rychlostí mezi java a .net, ale typuju, že .net bude trochu rychlejší (protože běží jen na windows, může být tedy lépe optimalizován).

    Ani jedno z řešení ale nedosahuje rychlost kompilovaných jazyků, které se překládají rovnou do strojového kódu. Jsou ale výborné z hlediska firem. Tam totiž jde hlavně o náklady. Čím dříve je projekt dokončen, tím jsou náklady nižší. Proto je často výhodnější psát v těchto vyšších jazycích i za cenu vyšších nároku aplikace.

    Sám jsem se chtěl .net začít věnovat, ale momentálně to není priorita. Mám toho rozdělané spoustu a musím se pořádně naučit C++, Javu, Symbian C++(kvůli práci) a potom taky OpenGL (kvůli hře, na které začínám pracovat). Takže myslím, že kdybych k tomu přidal ještě ten dotnet, tak bych se asi zbláznil 🙂

    Flavicius: Neboj, budu to psát opravdu pro začátečníky. To můžu slíbit, protože sám jsem začátečník 😉 Já jen čekám, až se sem dostane nějaký Java guru, a pořádně mě setře 😀

  4. Samozřejmě, že kompilované jazyky budou vždy rychlejší a třeba i datově méně náročné. A ještě mnohem rychlejší a méně náročný bude program napsaný „přímo na tělo“ (v tomhle případě na hardware) v assembleru. Jenže je fakt, jak píšeš, že asi čím hlouběji k hardwaru jdeš, tím víc si omezen jednak možnostmi daného hardware, za druhé potřebnými znalostmi a za třetí nekompatibilitou mezi různými platformami. Takže přesně tak jak píšeš – Java, nebo .NET, nebudou sice tak rychlé, tak „malé“, nebo zcela nenáročné, ale zato poběží „všude“ (.NET např. díky projektu Mono) a programování v nich bude z hlediska programátora snazší a rychlejší. Rozumnou cestou je asi kompromis a také to, volit vhodné jazyky, nebo platformy podle konkrétního účelu, jehož se chce programátor dobrat.

  5. Dobrý den,

    jmenuji se Jiří Kovalský a jsem autorem aplikace Rachota. Moc děkuji za zajímavý článek, který přinesl Rachotě několik nových uživatelů. 🙂 Je pravda, že čas od času se objeví dotaz jak Rachotu spustit, ale 99% lidí si dokáže poradit samo takže zmíněný problém rozhodně není tak vážný. K tomuto tématu existuje i speciální FAQ [1] pro lidi, kteří mají podobný problém jako Vy.

    [1] http://rachota.sourceforge.net/cz/faq.html#1

    Nápad přeložit aplikaci do nativního zdrojového kódu zní opravdu zajímavě. Bohužel nevím jak na to. 🙂

    S pozdravem,
    Jiří Kovalský

  6. David napsal:

    Dobrý den,

    jsem rád, že článek přinesl nějaký užitek 🙂 V poslední době celkem uvažuju nad tím, že začnu nějaký timetracker používat. Jestli jo, určitě použiju Rachotu, která se mi na první pohled zdála dobrá. Potom bych mohl sepsat i nějakou recenzi (přece jen jsem se tady o Rachotě zmínil jen tak okrajově).

    Ten převod do nativního kódu je opravdu zajímavá volba. Pokud na to téma chcete více informací, zkuste hledat GCJ nebo java2exe nebo popřípadě jar2exe. Osobně jsem to ještě nijak nestudoval, na některé typy alikací se to ale může hodit.

    Jo a nakonec ještě musím dodat, že já problém se spouštěním java aplikací nemám. Jen se k tomu stavím celkem skepticky, když si vzpomenu na úroveň počítačové gramotnosti mých známých 🙂

    To že si 99% lidí s Rachotou poradí je super zpráva. Jen mě tak napadá, že se jedná o celkem specifickou aplikaci (jen pro užší okruh uživatelů), takže ji budou používat spíše technicky zdatnější jedinci 🙂

  7. Pingback: Jak se stát dobrým programátorem | Dadajax's weblog

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.