Java vs. C# - který jazyk zvolit?

V dnešní době hodně programátorů přemýšlí, který programovací jazyk mají používat, případně studovat. Jeden z nejpopulárnějších a také nejpoužívanějších programovacích jazyků dneška je Java, kterou již přes pět let prosazuje firma Sun Microsystem. Reakcí na úspěch Javy je nový programovací jazyk, uvedený firmou Microsoft, C#. V tomto článku se pokusím přinést svůj pohled, který je založený na dlouhodobé zkušenosti s oběma jazyky (v Javě i v C# programuji od jejich uvedení v podobě betaverzí).
Jak to možná začalo...

Java již má něco za sebou a dokázala se za dobu své existence prosadit jako dnes již standard pro vývoj velkých serverových systémů a internetových aplikací. Mnoho těchto starostí způsoboval Javě primárně Microsoft, kterému se nejdříve vůbec nelíbilo, že někdo hned od začátku vzbudí takový zájem jako Sun Microsystems, a to ještě na poli, které si snaží Microsoft přivlastnit, tj. vývojové nástroje a programovací jazyky. Sám si pamatuji, jak jsem na internetu vedl diskuse nad výrokem Billa Gatese, který v souvislosti s uvedením Javy zarytě tvrdil, že další programovací jazyk už je zbytečný. Javě také bylo předpovídáno, že do 2 let zmizí ze světa.

Jak situace dnes vypadá můžeme vidět sami. Příkladem jsou internet-banking systémy největších našich bank, které jsou postaveny na platformě J2EE nebo třeba i burzovní systémy nebo clearingové systémy, většinou stojící na Javě (viz. např. Clearstream) a stále rostoucí komunita programátorů v Javě. A proto je zcela pochopitelné, že Microsoft se nemohl spokojit s tímto rostoucím úspěchem Javy. Musel změnit svoji strategii a hlavně rétoriku z pohledu: „není nutný další programovací jazyk“ na „C# je to, bez čeho programátor nemohl nikdy žít“. Když odhlédneme od toho, že to všechno je jen marketingový balast, tak je skoro až neuvěřitelné, jak Microsoft potichu a s úspěchem zkopíroval model firmy Sun Microsystems. Microsoft ve svém .NET prostředí postavil vše kolem C# (podobně jako Sun s Javou) a proklamoval .NET jako prostředí otevřené jakémukoliv programovacímu jazyku (hezká analogie k multi-platformnosti Javy). Platforma jako .NET se dala již víc než očekávat (a lidé kolem Javy o ní již dlouho věděli – viz. spousta ověřených i neověřených informací o připravované odvetě Microsoftu vůči Sunu na Javalobby).

Možná se teď ptáte, proč zde uvádím toto shrnutí? Myslím si, že pro správné (nebo alespoň uvážlivé) rozhodnutí, je vhodné znát tento pohled, a pak se lépe rozhodnout, na co vsadit a na čem vydělat.

Java/C# = 1 ?

Asi začnu od věcí, kterých si každý programátor všimne hned, když vidí kousek kódu v daném jazyce, styl programování a „vzhled“ kódu. Musím říct, že můj první dojem, když jsem C# viděl poprvé, byl, že Microsoft pouze překopíroval Javu a pouze přejmenoval standardní příkazy (viz. následující příklad).

Příklad v Javě

import java.lang.*;
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println(“Hello World”);
  }
}

Příklad v C#

using System;
class HelloWorld {
  public static void Main(string[] args) {
    Console.WriteLn(“Hello World”);
  }
}

Oba dva zdrojové kódy se zdají být koncepčně úplně shodné, pochopitelně s rozdílnými názvy pro příkazy, jinou jmennou konvencí a nebo názvy pro „packages“ potažmo „namespaces“. Ale myslím si, že to není vůbec podstatné, protože pak by se dalo tvrdit o každé aplikaci napsané v C/C++ a používající proprietární zápis, že se nejedná o C/C++, ale o nové programové prostředí dané firmy a aplikace.

V tomto případě bychom mohli jít ještě hlouběji a ukázat si víc, než těsnou provázanost C# a Javy (výjimky, objektové chování atd.).

Až později jsem zjistil, že zhodnocení tohoto jazyka je o něco složitější a že zaujatý a černobílý pohled se nikdy nevyplácí.

(Ne)výhody – Java, C#

Během několika let, kdy programuji s Javou, jsem se setkal s mnoha jejími nedostatky a následující krátký výčet, je asi zatížen subjektivním pohledem, který vychází ze stylu programování, osobních zkušeností a typů projektů, na kterých jsem pracoval. Přesto se ale pokusím o co nejvyšší objektivnost.

Java prošla za 6 let vývojem od jazyka, který spíše sloužil k vývoji „hraček“ ve stylu apletů na stránkách, až ke skutečným velkých informačním systémům. Zde se nakonec uchytila a čas prokázal, že právě zde je velmi vhodná a její použití zrychluje a zkvalitňuje vývoj, což znamená ušetřené peníze a větší zisk (a o to nám jde primárně).

Na druhou stranu se Javě doposud nepodařilo úspěšněji proniknout do desktopových aplikací, a to primárně z důvodu vysoké systémové náročnosti Swing knihoven. I zde by mělo být zlepšení díky použití SWT, ale to zatím mluvíme spíše o budoucnosti, než o tom, čeho Java dosáhla. Přesto její výhled je víc než dobrý.

Na druhou stranu zde máme nový, doposud nijak neprověřený a nepoužívaný nový programovací jazyk C#, který ale je víc než viditelným posunem ze strany Microsoftu. V tuto chvíli je těžké hodnotit jeho úspěch na serverové straně (i když se dá víc než předpokládát a to minimálně díky elegantní integraci do ASP.NET), ale je dnes již zcela zřejmé, že na straně desktopových systémů Windows nebude mít v nejbližší době konkurenci. Již nyní lze C# použít k vývoji kvalitních desktopových aplikací a přitom neriskovat nestabilitu, jako tomu může být v případě serverových systémů.

Co mi chybí na Javě

Java: To, co mi na Javě, asi chybí primárně je neexistence preprocesoru. Sice existují různé testovací a debugovací utility, ale všechny se stále snaží obejít onu skutečnost, že je nutné míchat a nebo minimálně provazovat testovací kód s produkčním kódem. Je to něco, co mě osobně v Javě výrazně chybí a doufám, že Sun se rozhodne k používání preprocesoru.

C#: C# se poučil z vývoje Javy (hlavně z reakcí programátorů) a rozhodl se chybu s preprocesorem neopakovat. Proto jej specifikace tohoto jazyka určuje a kromě toho pre-procesor v C# doznal výrazného vylepšení (tedy spíš zjednodušení) oproti např. pre-procesoru v C/C++. To, co pokládám za nejlepší změnu, je eliminace direktivy include a define, které jsou velmi často důvodem zdlouhavého prozkoumávání velkého kódu např. při jeho ladění nebo při předávání projektu novému kolegovi. Také eliminace include viditelně zrychlí kompilaci, což u velkých projektů je nezanedbatelný faktor (hlavně při ladění).

Co mi přebývá v C#

Java: Co mě na Javě stále více upoutává, je její jednoduchost a přehlednost. Autoři Javy se snažili, aby výsledný kód mohl být co nejvíce „čistý“ a čitelný a vedl ke kvalitnímu objektovému návrhu. I z tohoto důvodu zde existuje podle mého názoru jednoduchý přístup k objektovým principům, jako je například předefinování metod a virtuální metody. Neboli, pokud implementujete metodu, která se shoduje v názvu, návratovém typu i parametrech, vezme se její implementace z poslední třídy, kterou vytvoříte (myslím tím instanci třídy, které ale není přetypována) a která je poslední v hierarchii (prostě se přetíží původní funkčnost). To je podle mého názoru jednoduchá logika, která vede i ke kvalitnímu objektovému modelu při návrhu systémů.

C#: C# předefinování metod realizuje o něco jiným způsobem. Hlavní rozdíl je v tom, že předefinování je zde uděláno o něco složitěji a nejsem si jist (což soudím na základě svých zkušeností s vývojem v C#), že ku prospěchu věci.

Nebudu zde popisovat všechny možnosti, které C# pokrývá, protože cílem tohoto článku není zaškolit do Javy nebo C#, ale pokusit se o srovnání. To, co C# prosazuje, mi ale připadá jako předělávání programátora na písařku. V krátkosti mohu uvést, že pro to, abyste mohli explicitně předefinovávat metody pomocí klíčového slova override, je nutné u jejich předků uvádět v deklaraci další klíčové slovo virtual nebo abstract (pokud override nepoužijete, metoda se i tam předefinuje a pouze kompilátor vyhodí varování). Tím ale dochází k tomu, že kód se stává složitý (jak to přišlo mě, ale i mým kolegům i nepřehledný) a jak jsem si prožil na několika projektech, nakonec se upouští od používání těchto klíčových slov a v podstatě se udržuje chování podobné Javě nebo C++. Je pravda, že na jednu stranu zde působí jakési „zvykové právo“ programátorů, kteří přicházejí z Javy nebo C++, ale i při odhlédnutí od těchto zvyklostí mi připadá, že se podle mého názoru jedná o ne příliš praktickou vlastnost.

Co vybrat?

Tak na tohle není vůbec snadná odpověď a vůbec si nedělám patent na rozum, že ji vím. V předchozích odstavcích jsem se pokusil nabídnout určité pohledy, které jsou subjektivní a které zase mnoho mých kolegů může vidět odlišně. Přesto bych si dovolil aspoň pokus o shrnutí, který by mohl být základem pro další diskusi.

Musím říct, že za mých skoro 10 let práce v IT jsem poznal hodně programovacích technik, jazyků a přístupů a vytvořil jsem si jakýsi okruh mých „jazykových favoritů“ a Java mezi ně určitě patří a s technologií JNI dokáže řešit prakticky cokoliv.

Na druhou stranu se objevil C#, který má některé vlastnosti, jimiž by Java určitě nepohrdla a které podle mě dělají z C# přinejmenším velmi dobrého soupeře.

Přesto říct, zda-li je Java lepší či horší než C# nelze nějak jednoznačně a hned se pokusím vysvětlit proč.

Podíváme-li se na Javu, tak ji můžeme hodnotit ze dvou úhlů: přijetí Javy na trhu a pak možnosti jazyka jako takového.

Co se týká úspěchu na trhu, tak Java již jasně prokázala svojí kvalitu a to jak v malých aplikacích tak na velkých systémech. Příkladem může být integrace Javy do SAPu, podpora Javy v milionech mobilů (viz. podpora NTT DoCoMo) nebo z našich luhů a hájů implementace internet-banking systémů, kdy skoro všechny mají za základ Javu a prostředí J2EE. Proto je možné nyní jasně říct, které koncepty se v praxi ujaly a které naopak nejsou zase příliš využívány. V tomto je možné konstatovat, že je zcela zřejmý odklon od systémového programování (například v Javě minimální použití JNI) k spíše úlohově zaměřenému ( řešit danou obchodní úlohu, než její systémové pozadí a tím v důsledku šetřit náklady na vývoj).

Další obrovská výhoda Javy je její velká podpora od různých softwarových výrobců a integrace Javy do velkých aplikačních systémů jako jsou např. databáze (Oracle, Sybase, IBM). To je podle mě nesmírně důležité, protože to vytváří možnost kombinovat a používat různé produkty (ona stále zmiňovaná produktová nezávislost) a přitom požadavky a náklady na vývoj budou nižší právě díky jednotnému rozhraní definovanému v J2EE (je velmi snadné potom různě kombinovat a provazovat jednotlivé vývojové týmy, které mají odborné technické znalosti a tím zrychlit vývoj na krizových částech podle potřeby zadavatele).

Na druhou stranu je na Javě jako na programovacím jazyku vidět, že již má na sobě pár křížků, a proto některé jazykové koncepty mohou být již z dnešního pohledu pokládány za nedostatečné (viz. např. výše zmíněná část o preprocesoru). Je dost škoda, že se Sun neuvolnil ke standardizaci Javy (údajně kvůli rychlosti reakce standardizační komise na změny), která by možná vedla k lepšímu a hlavně rychlejšímu vývoji jazyka než je zatím pod křídly „Sluníčkářů“.

Dalším slabým místem Javy jsou klientské aplikace, kde Java zatím hledá sebe sama. Zde se sice v poslední době objevily velmi zajímavé koncepty (viz. novinky v JDK1.4 a nebo knihovny SWT), ale stále je na tomto poli Java těžkopádná. A to i přesto, že se objevily takové aplikace, jako světově populární P2P systém LimeWire.

Pak tu máme neotřelý C#. Žel zatím tak neotřelý, že nemáme v ruce skoro žádné nasazení v „enterprise“ sféře, a proto nemůžeme říct, kde je skutečná tržní síla tohoto jazyka a který koncept bude používán. Já osobně znám několik firem, které připravují použití C# pro velké burzovní systémy nebo i pro banky, ale zatím všude jsem byl svědkem toho, že ze strany klientů není zájem jít do .NET prostředí, dokud se neprokáže jako stabilní a bezpečné.

Osobně mám dojem, že Microsoft napodobil s vývojem C# pejska a kočičku, vařící dort, a smíchal mnoho, někdy i rozdílných, konceptů. Toto jednání chápu a dokonce je výhodné pro nás vývojáře. Microsoft dokázal velmi šikovně vykuchat jazyky jako Java, C/C++, Smalltalk atd. a vytvořit hodně univerzální řešení, které lze použít pro psaní databázových aplikací až po vývoj systémových ovladačů. Kromě toho specifikace C# neurčuje, pro kterou platformu má být C# určen, ale ve svém popisu je otevřena všem systémům.

Prozatím je ale C# úzce svázán s Windows, kde bude jeho největší síla (existují portace na Linux, viz. tabulka). Umožňuje snadno pracovat s COM+ a je výborně integrován do všech produktů založených na .NET architektuře.

Kromě toho je C# otevřený programovací jazyk, který se pravděpodobně bude vyvíjet podle potřeb programátorů. To se u Javy nedá vůbec říci, protože Sun prakticky nereflektuje na mnoho připomínek i ze strany svých partnerů (např. připomínky výzkumníků IBM na téma multithreading). Osobně tohle pokládám za jeden ze zásadních bodů, protože tak jako se Sunu vyplatilo otevřít svůj „Java Runtime“ a pustit do něj další výrobce (IBM, HP, Microsoft), tak určitě se Microsoftu vyplatí otevřít přístup k vývoji C#. Věřím, že i díky tomu bude Sun nucen otevřít přístup k Javě a moc doufám, že díky tomuto souboji i Microsoft aspoň maličko pootevře cestu ke svému .NET runtimu (jak již udělal v případě Linuxu). A budu-li si chtít zahrát na silně idealistického vizionáře, tak nakonec budeme mít dvě kvalitní prostředí (obě dvě otevřená), z nichž ani jeden z výrobců nás nebude k sobě přivazovat. No nebyla by taková iluze skvělá? ;o)

Jan Šeda, autor je Project Directorem Cleverlance, s.r.o.

Souhrnné srovnání základních vlastností

Vlastnost prostředí Java C#
Nasazení na více OS ano

(soupis zde)

ne

(teoreticky možné pro IL Code, ale mnoho knihoven je svázáno s Windows, např. WinForms)

Existují ale pokusy o portaci .NET na Linux.

Stáří technologie 6 let 2 roky
Existují stabilní a velké free serverové produkty s podporou ... ano ne
Přímá podpora v databázích ano ne
Standardizováno ne (patrně nebude) ano
Serverové systémové produkty od třetích stran (aplikační server apod.) ano ne
Stabilita serverových aplikací (použití transakčního serveru, asynchronního serveru, load balancing atd.) vysoká střední (testováno jen na Windows 2000) s Visual Studio.NET RC
Rychlost desktopových aplikací nízká

(u JDK1.4 a SWT knihoven vysoká)

vysoká
Rychlost serverových aplikací vysoká vysoká
Podpora ve velkých Open Source systémech (např. Apache) ano ne
Přímá podpora ve velkých ERP systémech ano

(již implementována SAPem)

ano

(zatím jen proklamativní)

Nabídka nezávislých API na různé služby veliká minimální
Podpora pro SOAP, Web Services atd. ano

(několik nezávislých dodavatelů)

ano

(jen Microsoft)

Vlastnost jazyka Java C#
Garbage Collector ano ano
Přímé operace nad systémem ano (použitím JNI) ano (unsafe mód)
Preprocesor ne ano
Plovoucí řádová čárka umožňuje strict-FP

(plná podpora pro IEEE754)

strict-FP nepodporuje
Operátory ->, :: nepodporovány

(používá se pouze tečková notace)

nepodporovány

(používá se pouze tečková notace)

Řízení multithreadingu ano ano
Enum, struct ne ano
Přetížení operátorů ne ano
Mutidimensionální pole ne (u Sunu)

IBM tento problém řeší

ano
„string“ objekty hodnota se nemění

(alokuje se nová instance)

hodnota se nemění

(alokuje se nová instance)

Detekování přetečení ne ano
Hlavičkové soubory ne ne
Globální funkce, proměnné atd. ne ne
Předávání parametrů hodnotou

(odkazem platí jen pro objekty)

hodnotou, odkazem
Verzování

(overloaded, virtual atd.)

ne ano
Vícenásobná dědičnost implementací ne ne
Vícenásobná dědičnost rozhraní ano ano
Vnitřní třídy (Inner classes) ano ano
Anonymní vnitřní třídy ano ne
Statická inicialize tříd ano ano
Kontrolované výjimky ano ne
Delegáti a události ne

(zdůvodnění „proti“ od Javasoftu)

ano

(zdůvodnění „pro“ od Microsoftu)

Properties ne ano
Systémová rozšíření v základních knihovnách snadná

(přidáním vlastních .jar knihoven)

prakticky nemožná

(přepsáním kernelu Windows)

Podpora práce s „Collections“ dobrá výborná
Podpora reflexe výborná výborná
Podpora runtimu pro více jazyků ano

(soupis zde)

ano

(základ architektury CLR)

Diskuze (232) Další článek: Fronty na Radeon 8500

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,