Na to se vám chystám záhy odpovědět a své tvrzení dokázat.
Java:
Jediná výhoda Javy je její jednoduchost.
Když se ale na toto téma podíváme blíže, zjistíme, že ani tato výhoda Javě nepřináší prvenství v kategorii jednoduchých programovacích jazyků. Například jazyk C# je stejně jednoduchý, leč co do možností a výkonu Javu několikrát předčí.
První, z řady nevýhod je ukrutná až naprosto fenomenální pomalost. Na tomto poli patří Javě poslední místo mezi všemi programovacími jazyky, které znám. Dokonce i stařičký interpretovaný Visual Basic 6 je rychlejší. Abych jen tak nemlel na prázdno, dovolil jsem si připravit malý experiment. Nechejme 4 jazyky setřídit pole o n prvcích Bubble Sortem, což je algoritmus se složitostí O(n^2), a podívejme se, o kolik je který rychlejší než druhý.
Jak je vidno, java je zhruba 6x (!!!) pomalejší, než nativní céčko (a to ještě není úplně nativní, poněvadž běží pod frameworkem; nativní je na něm přímý přístup do paměti pomocí ukazatelů).
Dále zhruba 1,5x pomalejší, než konkurenční částečně interpretované jazyky – C++/CLI a C#. Toto číslo je zásadní parametr, poněvadž se jedná o stejný proces zpracování – kompilace do metajazyka (MSIL a bytecode), následně jeho interpretace. Zklamal tedy buď samotný javovský interpreter (JVM), návrh metajazyka nebo velmi pravděpodobně obojí najednou.
To je také důvod, proč se na serverech Java používá jen velmi zřídka, zatímco konkurenční platforma (.NET) relativně hojně.
Další nevýhoda je omezenost.
Omezenost Javy lze rozdělit na dvě dílčí omezenosti – omezenost knihovního zázemí a omezenost jazyka.
Knihovní část javovského frameworku obsahuje kvanta metod, to je fajn, ale zdaleka ne tolik, jako .NET framework. Ten obsahuje velmi účinné nástroje, umožňující pracovat téměř s jakýmkoli hardwarem, softwarem, ryzími daty i abstraktními strukturami v počítači obsaženými. Javovská knihovna tříd je v porovnání s konkurencí velice omezená.
Omezenost jazyka spočívá v jeho špatném návrhu. Nepřítomnost přímého přístupu k paměti dokážu pochopit (Java chce lautr všechno zapoudřit… nejraději by zapouzdřila i programátora), ale nedostatky v její vlastní doméně (v OOP) pochopit nedovedu. Vícenásobná dědičnost (což je věc, kterou má i C++) zde neexistuje. Nelogicky se zde ale vyskytuje klíčové slovo Protected, které v C++ sloužilo pro označení soukromých členských proměnných a funkcí, které se dědí rodokmenem až k poslednímu potomku. Co je nepochopitelnější, než samotný výskyt tohoto klíčového slova, je jeho pozměněná funkcionalita. Označíte-li proměnnou jako Protected, je veřejná, a tudíž přístupná úplně všem cizím třídám v tomtéž balíčku. Také nikde nevidíte smysl?
Java tedy postrádá vícenásobnou dědičnost. Takže, kdybyste si chtěli naprogramovat simulaci složitějších struktur, které znáte z reality, budete nuceni vytvořit prasácké hierarchie, které vlastně hierarchiemi nejsou. Tím pádem mizí důvod, proč jste vlastně OOP použili a můžete všechno naprogramovat procedurálně.
Tipoval bych, že na naší milé ČVUT FEL se Java v prvním ročníku používá, protože Sun mocně sponzoruje katedru počítačů. A pokud někdo řekne „to víš, musej’ dát tém prvákům neco lehkýho… dyk nekterý z nich programujou poprvý v životě“, odvětím „a proč ne C#, který je jednoduchý stejně, akorát mnohem lepší?“ a budu mít pravdu. Kdybychom používali C#, nemuseli bychom se stydět… leč zůstává otázka, zda-li bychom měli učebny plné tenkých klientů Sun ray a cluster serverů se Solarisem (což je kapitola sama pro sebe…), jako je tomu teď.
Jaký jazyk si tedy vybrat?
V dnešní době existují na poli programovacích jazyků (vynechám nyní jazyky primárně určené pro vývoj webových aplikací) dva hlavní konkurenti s vlastní platformou. Je to Microsoft a Sun. A pakliže jsme Sun právě sborově zavrhli :-), zbývá Microsoft. Ten je už od dob, kdy ještě soutěžil s Borlandem, známý tím, že má výborné kompilery. Zvlášť C kompiler obsažený ve Visual C++ 6 mnozí (teď pominu open-source komunitu) považují za dosud nepřekonaný. V současné době Microsoft oficiálně podporuje několik svých jazyků pro .NET platformu, z nichž hlavní tahouni jsou:
C#, Visual Basic.NET a C++/CLI
Veskrze začátečnickou až středně pokročilou programátorskou populaci je nejoblíbenější jazyk C# (pokročilí programátoři (systémoví a podobní) stále používají nativní C, C++ a používat budou).
Jazyk C# je jednoduchostí syntaxe a jazykovou omezeností (spousta lidí nazývá jazykovou omezenost bezpečností) podobný Javě, nicméně nabízí mnoho vychytávek, které z něj dělají společně .NET knihovním zázemím velice efektivní nástroj. Právě proto je oblíbený – hodně muziky za málo peněz.
Druhým nejoblíbenějším jazykem je Visual Basic.NET.
Visual Basic byl mým vůbec prvním programovacím jazykem a ačkoli v něm již dávno neprogramuji, chovám k němu citový vztah :-). Historie jazyka sahá velice hluboko. Jazyk BASIC (prapředek) byl vyvinut o několik let dříve, než vzniklo samotné C, a proto je tedy nejstarším žijícím programovacím jazykem na světě. O tom také vypovídá jeho syntaxe, která není od C odvozena. Dovolím si malý příklad:
Public Sub Shift(ByVal param1 As String, ByRef abc)
Dim i As Integer
Dim j As Integer
For i = 1 To rr - 1 Step 1
For j = 0 To ss - 1 Step 1
a(i - 1, j).Text = a(i, j).Text
a(i - 1, j).ForeColor = a(i, j).ForeColor
a(i - 1, j).BackColor = a(i, j).BackColor
Next
Next
End Sub
VB.NET má mnoho jiných syntaktických odlišností a jejich popsání by zabralo více než jeden článek, takže tuto část shrnu tím, že ve VB.NET se dá napsat cokoli stejně dobře jako v C#, vice versa. Jsou to jazyky víceméně se stejnými možnostmi.
Poslední jazyk, který zde zmíním je zároveň nejmocnějším a nejsložitějším svého druhu.
Je jím C++/CLI (kde CLI znamená Common Language Infrastructure).
Mnoho setkání začínajících programátorů s tímto jazykem skončilo a skončí tragicky, protože jeho složitost přesahuje složitost jakéhokoli jiného jazyka. Tato složitost má ale své opodstatnění.
Cílem vývojářů bylo skloubit jazykou neomezenost a sílu (jiní tomu říkají nebezpečnost) jazyka C++ s mocí skrývající se v .NET frameworku. Cesta to byla trnitá a vzniklo mnoho příšerných verzí tohoto jazyka, které byly na pohled děsivé a špatně čitlené, ale nakonec dospěla ke zdárnému cíli a vzniklo C++/CLI.
#using <mscorlib.dll>
using namespace System::Collections::Generic;
ref class referencetype
{
protected:
String^ stringVar;
array<int>^ intArr;
List<double>^ doubleList;
public:
referencetype(String^ str, int* pointer, int number)
{
doubleList = gcnew List<double>();
System::Console::WriteLine(str->Trim() + number);
}
};
Milovníci ukazatelů a adres jistě ocení další referenční typ, bez kterého se navíc nedá obejít. Je to ‘^’ stříška, aneb řízený ukazatel, aneb handle, který dělá to samé jako nativní ukazatel, akorát na řízené haldě a jeho adresu nelze změnit, jelikož je dynamická. K objektům (respektive k jejich vnitřnostem), k nimž vlastníme handle se dostaneme operátorem nepřímého přístupu, znamým již z C++… je jím šipka „->“. Existuje zde také řízený odkaz, který má (ve jménu přehlednosti) značku procenta „%“ :-). Mezi jednotlivými obory názvů (to je správný překlad slova namespace) se pohybuje operátorem dvojdvojtečka „::“ :-). Ano, to je přesně jeden z důvodů vysoké úmrtnosti. Pokud ale nezemřete, po chvíli v tomto systému spatříte krásu… a pro krásu a moc tohoto jazyka budete ztraceni, stejně jako já, jeho zastánce a uživatel.
Vyberte si, který se vám líbí. Ať to bude jakýkoli, chybu neuděláte.