Toto je časté revanie malých detí, ktoré si myslia, že keď napíšu kód v Jave, tak sú programátori. Je to naozaj silný pocit prehnať kód javac kompilátorom a potom si myslieť, že toto je „programový kód“. java je však v skutočnosti interpretovaná, preto sa jedná o „skriptovací kód“.
Mýtus: Microsoft okopíroval Javu.
Fakt: citácia z knihy JSP – Java Server Pages, Barry Burd, 2003 Computer Press:
Poohlédněme se teda za historií objektů typu JavaBeans. Ke knoci devadesátých let minulého století se programátoři ve vývojovém týmu firmy Sun Micrososystems dívali přes rameno svým kolegům v Redmondu. A co spatřili? Dozrávajíci model komponentového softwaru známý jako COM – neboli Microsoft Component Object Model. Objekty modelu COM byly z oblibou používány na webových stránkach známých pod označením ASP – Active Server Pages. Odpovědí firmy Sun byla specifikace JavaBeans (jako součást sady JDK 1.1).
Tento odstavec presne naznačuje, že Sun sa nechal inšpirovať komponentovým modelom COM od Microsoft-u.
Java jazyk vs. C#
Microsoft, ktorý údajne okopíroval Javu, sa pri návrhu jazyka C# (ktorý je syntakticky oveľa viacej podobný na C++ než na Javu) inšpiroval: autori C# zistili, že checked a unchecked exceptions sú úplná zbytočnosť, C# má narozdiel od Javy aj Vlastnosti, Delegátov, skutočné Udalosti a iné vymoženosti.
.NET narozdiel od Javy má skutočné generické typy – Java kompilátor odstráni informáciu o typovosti generických typov (tzv. erasures) – teda tieto informácie, nerozdiel od .NET, nie sú dostupné pomocou reflexie za behu programu. Podobne je tomu aj s atribútovým programovaním. Zatiaľ čo Java má v poslednej verzii úbohú podporu pre anotácie (veľmi zjednodušená obdoba atribútov), .NET už vo svojej prvej verzii podporuje plnohodnotnú prácu s atribútmi i pomocou reflexie. Plno „killing“ (alebo „that rocks!“) vlastností .NET-u je založených práve na atribútoch.
Ďalšie rozdiely medzi C# a Javou: Java vytvára všetky metódy ako virtuálne (explicitne treba zákazať pomocou final). C# (a .NET MSIL kód) ide presne opačnou cestou: virtuálne metódy treba explicitne označiť. Deklarácia implementácie rozhrania alebo rozširovania triedy sa v C# označuje operátorom : (ako v C++). Java používa kľúčové slová extends a implements. .NET (a teda aj C#) umožňujú explicitnú implementáciu rozhrania – Java nie.
Hodnotové a referenčné typy
Java obsahuje primitívne typy (ktoré sú naozaj primitívne a nedá sa s nimi robiť pomocou OOP – iba pomocou procedúr zaobalených do tried). .NET dotiahol unifikovanú OOP prácu s dátovými typmi takmer k dokonalosti – existujú hodnotové a referenčné typy, ktoré všetky dedia zo System.Object. Takto je skutočne zaručené, že všetky dátové typy dedia z jediného rootového typu. V Jave je toto obchádzané pomocou zaobalovacích tried. Základné dátové typy (bool, int, long, double, DateTime) sú hodnotové – tzn. vždy majú priradenú hodnotu. Takto sa vás nestane, že kompilátor za vás boxuje/unboxuje hodnoty, vy máte podmienku if (!isEditMode) { … } a zrazu dostanete NullPointerException.
Java Virtual Machine vs. .NET Runtime
Javisti si celkovo mýlia pojmy s dojmami a ani poriadne nerozlišújú medzi jazykom Java, jazykom C# a ich spúšťacími prostrediami – Java Virtual Machine a .NET Runtime. Mýtus okopírovania .NET modulu manažovanej správy pamäte vychádza práve z podobnosti správy pamäte v Jave. Treba však podotknúť, že manažovanú správu pamäti má aj PHP, Python, či JavaScript.
Finalizácia objektov je v .NETe oveľa lepšie vymyslená ako v JVM. .NET Garbage Collector umožňuje volať finalizátory (C# deštruktory) a podporuje IDisposable pattern. Ako som sa dočítal na webe, v Jave nie je vôbec zaručené vykonanie finalize() metódy a zdroje sa uvoľňujú v try/catch bloku. Vďaka definovanie IDisposable patternu a deštruktorom je možné správne uvoľniť zdroje, aj keď programátor spraví chybu a nepoužije napr. using() blok. Čo je ďalšia vec, ktorú jazyk Java nemá: blok using vygeneruje pre IDisposable objekty kompletný try/finally blok a dojde teda k správnemu a včasnému odstráneniu zdrojov.
No, to som sa ale rozpísal 🙂 Ako je vidieť, .NET ponúka oveľa bohatší programový model, ktorý je konzistentný a je založený na zdrojovom kóde (to je moje označenie. Java totiž strašne veľa vecí definuje iba v rôznych dokumentoch a špecikáciách (napr. JavaBeans a ich „vlastnosti“ = get, set, is). .NET vďaka využitiu atribútov poskytuje celé riadenie kompilátora, alebo vývojového prostredia zo zdrojového kódu.).
Človeka, ktorý píše skripty v Jave a hovorí si „programátor“, som určite nepresvedčil, že .NET a C# nie sú kópiou Javy. Ale ponúkol som prehľad výborných funkcií, ktoré nemajú svoj ekvivalent v Jave a vďaka ktorým viem, že som sa pred niekoľkými rokmi rozhodol správne, keď som sa začal učiť používať .NET platformu.
Aktulizácia: A skoro som zabudol na to, že pre .NET už môžete programovať vo vyše 30 jazykoch.
miro says:
Veď všetky programovacie jazyky sú skoro o tom istom. Java, Java Script, C, Action Script. Veď to sú jazyky, ktoré sú všetky skoro rovnaké. Každý programuje v tom čom chce a je na vyvíjajúcej firme ako dokáže svoj jazyk predať (ako bude používaný).
duchan says:
pre boha co je toto za clanok…proste preferujes M$ tak si cely hotovy z toho inak su to len akademicke keci nic viac. skus si trosku rozsirit aj prakticke obzory. kto chce davat rozumy ma mat skusenosti poriadne a nie len niekde nacitane v clankoch a knihach. sadni za komp…vytvor dake poriadne aplikacie a potom mudruj.
Jozef Izso says:
Je to článok napísaný na základe praktických skúseností s písaním web aplikácií v Jave a ASP.NET.
Všetko sú to veci, ktoré vývojár na projekte použije a vôbec sa nejedná o teoretické kecy, čo sa učia na výške.
lukas says:
Ja som vytvoril a mudrujem – som spokojny s vyberom – .NET a nemenil by som. V Jave som robil kratko a pride mi to ako neskutocna zmes, splet, gulas v ktorej je tazko sa vyznat. Preto preferujem .NET. Robi sa mi v nom rychlejsie, pohodlnejsie, a zvykol som si na mnoho vymozenosti, ktore mi pridu samozrejme.. No ked sadnem spat k Jave, az take samozrejme niesu. A komentar – to ze sa nevyznas v Jave neznamena ze je zly jazyk:
Ja sa programovanim zivim. Pre mna je cas peniaze. Nemam zaujem bojovat s Javou len preto aby som si dokazal ze som „dobry“. Toto je respekt v druhom rocniku VS. .NET mi umoznuje pracovat rychlo a efektivne
Python says:
Pekný článok. Ešte že som si vybral ten C# čo by som si počal bez delegátov, anonymných delegátov, lamda, event …
najmä .NET 4.0 už má všetko čo potrebujem aj dynamický typ ako má Python
Mne pripadalo programovanie v C# aj trošku podobné z Pythonom ten je tiež silne orientovaný na rôzne Collections. Ale tá podobnosť asi má čo dočinenia z modernými prog. jazykmi.