Rád bych pokračoval ve svém článku Java versus
C# v příštích letech. Dostal jsem na něj spoustu dotazů a
připomínek. Dnes se budu věnovat otázce, co
vybrat dnes za prostředek na navržení a naprogramování desktop
aplikace? Javu nebo programovací jazyk C#?
Programovacím jazykem C# samozřejmě myslím prostředí platformy Microsoft
NET.
Je to samozřejmě důležitá otázka a lze na ni odpovědět jednoduše:
pokud bude aplikace běžet pouze pod některým
z operačních systémů Microsoft Windows, je nelepším řešením C#. Pokud
požaduji multiplatformnost, třeba běh
aplikace též pod operačním systémem Linux, musím použít Javu.
To je jednoduchá odpověď a navíc ještě pravdivá. Trochu si ji ovšem
zkomplikujeme: víme jaký operační
systém používají naši zákazníci dnes, ale nevíme jaký budou používat za
5 let. Rádi bychom dělali upgrade
aplikace - to jsou přece zaručené příjmy. Pokud vybereme nevhodné
technické řešení můžeme mít velké
problémy: zákazník přejde jinam - horší varianta, nebo budeme muset
celou aplikaci přeprogramovat a zahodit veškeré
dosavadní znalosti, zkušenosti a školení - také žádná radost.
Představme si nějaké zadání. Na tom se budou všechny aspekty nejlépe
demonstrovat. Použiji zadání ze svého
článku Desktop versus
web aplikace: napsat
aplikaci pro řízení projektů, jejich zaznamenávání a sledování.
Přenositelnost
Potřebujeme přenositelnost? Dnes asi ne. 99 procent našich uživatelů
používá některý z operačních systémů
z rodiny Windows firmy Microsoft. Nevíme ale zda ji budeme potřebovat za
5 let? Pokud přenositelnost za 5 let budeme
potřebovat, budeme s největší pravděpodobností chtít naši aplikaci
provozovat na operačním systému Linux. Již
dnes jde o operační systém, který je plně srovnatelný s MS Windows a
může ho v 95 procentech zastoupit. Existují
sice desítky a možná i stovky dalších operačních systémů, ale ty naši
zákazníci nepoužívají.
Java je na Linuxu bez problémů provozovatelná. Úplně jiná je ovšem
situace u C#. Ten je aktuálně schopen práce
pouze na počítačích na kterých je nainstalován .NET Framework.
Jde o operační systémy Windows 98, ME,
NT, 2000, XP.
Pokud budeme chtít naši aplikaci napsanou pomocí C# provozovat na
Linuxu, je naší jedinou šancí projekt Mono.
Mono projekt založený v roce 2001 je Open Source iniciativa podporovaná
firmou Ximian. Jde o Unix verzi Microsoft NET
platformy (Frameworku). Projekt se snaží na Unixu a především na Linuxu
realizovat technologie, které byly
Microsoftem předloženy ECMA (European Computer Manufactures Association)
pro standardizaci. Z programovacích jazyků
MS NET se věnuje C#, ale do budoucna nelze vyloučit rozšíření
kompilátoru i na jiné programovací jazyky. Mono
je v současné době ve vývoji a mělo by být dokončeno na přelomu roku
2003/2004. V této době by měla být
uvolněna verze 1.0, která ovšem nebude obsahovat
System.Windows.Forms a Enterprise.Services. Verze 1.2
se očekává zhruba v polovině roku 2004 a bude doplněna o všechny
zbývající části. Bude tedy plně kompatibilní
s NET 1.0. Firma Ximian není v Linuxu žádný nováček. Vytvořila grafické
prostředí Gnome a skvělý nástroj pro instalaci odinstalaci
aplikací Red Carpet a nedávno byla zakoupena firmou Novell.
To jsou vše samozřejmě pouze plány. Mono má dnes již k dispozici plně
hodnotný kompilátor jazyku C#, ale
programovací jazyk nedělá kompilátor, ale knihovny. V tomto případě jde
právě především o knihovny Windows
Forms, které zajišťují zobrazování okének a souvisejících věcí. Není
k přehlédnutí, že projekt Mono
sám uvádí, že v první verzi tyto knihovny nebudou k dispozici. Sám
Microsoft investoval stovky milionů dolarů do
vývoje platformy NET a myslím, že Ximian/Novell nebude něčeho takového
schopen a ani ochoten. Podle mého názoru
nebude firma Ximian schopna tak velký úkol zvládnout. Podporu od
Microsoftu očekávat nelze. Ten na portaci NET
platformy na Linux nemá žádný zájem, spíše bych řekl naopak. Celkově
tedy zřejmě nelze očekávat rozšíření
C# a NET mimo operační systémy MS Windows. Samozřejmě vyloučit nelze nic
a mohu se plést.
Přenositelnost Javy je proti tomu špičková. Naprostou většinu
aplikací lze bez jakýchkoliv změn přenést na
libovolný operační systém, na kterém je k dispozici JRE. Někdy jsou
drobné problémy s formátem souborů a
souborových cest, ale pokud programátor dodržuje elementární pravidla
psaní přenositelného kódu, na žádné
problémy se nenarazí.
Závěr: pokud očekáváte, že aplikace bude běžet na jiném OS,
než MS Windows, je nutné zvolit Javu. Vše
záleží na tom, jak úspěšný bude Linux. Pokud během příštích let dosáhne
pozice na desktopech v řádu desítek
procent, stane se přenositelnost klíčovou vlastností programovacího
jazyku.
Nutno podotknout, že přenositelnost minimálně na Linux lze zajistit i
jinými programovacími jazyky, především
u GUI programů pomocí jazyku C++. Zde je nutné ovšem použít speciální
knihovny, které tuto přenositelnost zajišťují,
např. wxWindows.
Rychlost provádění
Dle testů na serveru The
Great Win32 Computer Language Shootout jsem
provedl některé z porovnání a s výjimkou testů pro zpracování výjimek,
vláken a hešů je jazyk C# významně
rychlejší. I pokud započítám výše uvedené výjimky je rozdíl 10 % ve
prospěch C#. Domnívám se ale, že v
testu vláken je chyba, protože podle testu je při práci s vlákny C# o
600% pomalejší a to se mi nezdá. Nechci se
Microsoftu zastávat, ale zrovna vlákna běží na MS Windows poměrně
efektivně.
V každém případě má jazyk C# velkou výhodu ve vykreslování formulářů
a oken. Bohužel se mi nepodařilo
najít žádný věrohodný test, který by porovnával rychlost vykreslování
grafických komponent, formulářů a
oken pomocí Javy a C#. Na první pohled je zřejmě, že Java používající
Swing je pomalejší - přenositelnost
a zajištění stejného vzhledu na všech platformách něco stojí.
Závěr: v kritériu rychlosti aplikace vítězí C#. Je samozřejmě
otázkou, zda je to pro Javu nějaký
problém. V uvedeném zadání lze očekávat, že aplikace bude čekat na vstup
uživatele, přístup na disk nebo do
databáze. Vlastní rychlost vykreslování grafických komponent není
významná. Paměťová náročnost bude přibližně
srovnatelná.
Vývoj
Z hlediska programových konstrukcí jsou oba jazyky naprosto
srovnatelné. Zkušený programátor bude v obou jazycích
programovat stejně rychle a nezkušený programátor se oba jazyky bude
učit stejně dlouho. Samozřejmě zde máme několik
méně, či více významných rozdílů. C# proti Javě podporuje tyto
konstrukce a vlastnosti:
- atributy;
- delegáty;
- enum (zřejmě bude v Javě 1.5);
- multidimenzionální pole;
- parametry metodám (primitivní typy) lze předávat jak
odkazem, tak hodnotou (v Javě pouze hodnotou);
- příkazy preprocesoru;
- properties (zřejmě budou v Javě 1.5);
- přetížení operátorů;
- struct;
- verzování;
Java proti tomu má tyto výhody:
- anonymní vnitřní třídy;
- kontrolované výjimky (checked exceptions);
- není nutné u přetěžovaných metod psát identifikátor
virtual, resp. override. Toto ovšem může mít u Javy
negativní dopad na výkon;
Co se mi osobně nejvíce líbí na C# proti Javě jsou příkazy
preprocesoru. To myslím Javě chybí. Znám
argumenty, které se uvádí proti této vlastnosti jazyka, ale považuji je
za minoritní proti výhodám, které přinášejí.
Výhody Javy nepovažuji za důležité až možná na anonymní vnitřní
třídy, které jsou dobré
pro automatický návrh formulářů pomocí IDE nástrojů.
Pro vizuální tvorbu formulářů existují pro oba programovací jazyky
kvalitní nástroje (Visual Studio,
JBuilder, NetBeans).
Provoz aplikace
- V obou případech je nutné zajistit, aby na cílovém počítači
bylo k dispozici běhové prostředí. Do
budoucna u operačních systémů MS Windows bude tato
platforma ve výhodě, protože NET Framework bude na vše
k dispozici ihned po instalaci. JRE se bude muset
doinstalovávat.
- Start aplikace je rychlejší na platformě NET.
Ostatní
- Údržba aplikace by měla být pro obě platformy
srovnatelná.
- Cena vývojového prostředí není významná. Pro Javu jsou k
dispozici komerční i Open Source velmi kvalitní
nástroje, pro C# je k dispozici Visual Studio, které
sice není k dispozici zadarmo, ale jeho cena není nijak
závratná. MS Visual Studio má již dnes kvalitní Open
Source ekvivalent - SharpDevelop. Tento
produkt je sice zatím ve verzi 0.97, ale již se s ním dá
dobře pracovat.
Celkový závěr: v případě, že potřebujete přenositelnost na
jiný operační systém, doporučuji
Javu. V případě, že aplikace pracuje a bude pracovat pouze na operačních
systémech MS Windows, doporučuji použít
C#. Je to zásadní rozhodnutí - nezapomeňte, že největší investice je
vaše energie.