Java je podle mě celkem pěkný jazyk. Oproti C/C++ odstraňuje spousty konstrukcí náchylných na chyby, a umožňuje model checking, tedy formální test bezchybnosti kódu (lze například zaručit že v kódu nedojde k deadlocku, nebo že instance třídy nehrábne do jiné paměti než do té své).
Bohužel jako platforma je Java utrpení, protože toho spoustu neumí. Zamrzí i dost mizerný výkon, správa paměti na 32-bitových platformách, a uvedení 64-bitové verze s tak velkým zpožděním.
Za mě je daleko zajímavější C#. Podobně jako Java je to pěkný jazyk, není náchylný na chyby, a také umožňuje model checking. Umožňuje ale umí .NET daleko lépe využít platformu - člověk není tak svázaný jako u Javy. Navíc C# i Common Language Infrastructure jsou ISO standardy.
Navíc C# i Common Language Infrastructure jsou ISO standardy.
A jaké verze jsou ISO standardizovány? ISO standard C# je z roku 2006, takže není standardizován C# 3, 4 a 5, ne?
Bohužel jako platforma je Java utrpení, protože toho spoustu neumí.
Ano. Zejména štve nepodpora tailcallů v JVM. Ale třeba v případě reifikace generik v CLR si už tak jistý nejsem - v aktuální podobě neumožňují parametrický polymorfismus vyšších řádů (a předpokládám, že např. autoři F# se nebudou chtít uchýlit k řešení, jenž používá Java).
Ano, ISO standard pro novější verze není zatím k dispozici. Standardizace je na dlouhé lokte. Nicméně i tak je situace daleko lepší než u Javy.
Ohledně platformy si asi nerozumíme. Java má svoje WORA, jenže one size doesn't fit all. Zkuste v Javě zjistit jestli na Windows běží nějaký servis a případně ho nastartujte, zjistěte jaká okna jsou zobrazená a jedno z nich minimalizujte, načtěte hodnotu z Registry, zjistěte adresář ve kterém je uložený desktop, koukněte na nainstalované tiskárny a zjistěte která z nich umí duplexní tisk. Na podobná omezení Javy narazíte na každé platformě. Komu stačí parsnout XMLko, provést pár SQL dotazů a nějak zamíchat hodnotami, a zároveň nutně potřebuje psát i pro unixy, ten Javu možná ocení víc.
Pouze velmi omezeně. C/C++ má spoustu konstrukcí, které se těžko posuzují. Například u a[b+c] těžko zjistíte, jestli sáhne mimo hranice pole. U strcpy() také budete těžko zaručovat, že nezapíše jinam než zamýšlíte. Takových konstrukcí vymyslíte za pět minut nejspíš desítky.
Samozřejmě se můžete některých konstrukcí C/C++ vzdát, a zavést constrains. Jenže výsledkem bude něco co má s C/C++ společný leda kus syntaxe (u Cčka vizte třeba ArC), a API OS a mnoha knihoven vám tenhle úkol rozhodně neusnadní. Managed languages, jako Java nebo C#, jsou na formální verifikaci/model checking nesrovnatelně lépe připravené.
V C# se zaručeně nedostanete mimo hranice pole, takže nepřepíšete co nemáte, a nebudete číst data z nesmyslné lokace. V C/C++ se naopak řadu konstrukcí dopracujete k nedefinovanému chování, které neskončí chybou při kompilaci, a často ani v runtime. Místo toho vám aplikace tiše vyhnije zevnitř.
V C# se zaručeně nedostanete mimo hranice pole, takže nepřepíšete co nemáte, a nebudete číst data z nesmyslné lokace. V C/C++ se naopak řadu konstrukcí dopracujete k nedefinovanému chování, které neskončí chybou při kompilaci, a často ani v runtime.
To ano. Ale při dokazování korektnosti nějakého algoritmu stejně mohu potřebovat dokázat, že a[b+c] je uvnitř pole.
C++ nijak nedefinuje, jestli se to ověřuje, takže pokud potřebujete bounds checking, potřebujete STL, která je má (třeba GNU debug STL).
Formální verifikace a model checking se nedělá za běhu finálního produktu (to už je pozdě), takže je úplně jedno, jestli to vyhodí výjimku nebo přepíše jádro, v obou případech to udělalo něco, co to udělat nemělo.