ACM schreef op maandag 21 september 2009 @ 13:01:
Ik denk dat je het wel wat overdrijft als je het 'hopeloos inefficient' noemt. Het is uiteraard wel veel minder voorspelbaar. Sowieso heb ik de indruk dat je een mate van onhandelbaarheid aan de GC toewijst die er in de praktijk misschien wel helemaal niet is of weg te tunen is.
Uiteraard. Maar een GC moet je heus niet komen onderbreken tijdens een berekening die zo hard steunt op de inhoud van je cachegeheugen. Waarschijnlijk kun je de GC wel in- en uitschakelen tijdens de uitvoering van je programma. Dat doet echter geen afbreuk aan het feit dat een GC nu niet het meest cruciale onderdeel is van een wetenschappelijke berekening. Bij dat soort programma's is het geheugenbeheer over het algemeen vrij eenvoudig en beperkt tot het alloceren en dealloceren van een paar matrices of vectoren. Voor algemene software is een GC héél wat nuttiger.
Het is inderdaad ontworpen als generieke taal en de meer recente versies lijken vooral desktop- en serverwerk uitbreidingen te krijgen. Overigens zijn er wel wat projecten om numeriek te werken.
Zeker, maar dat maakt het niet plotseling de taal bij uitstek voor numerieke software

.
Je noemt allemaal beperkingen waarvan ik als numerieke-programmeur-leek niet zo goed van begrijp waarom ze problematisch zijn, op de missende bibliotheken na dan. Ik heb meer de indruk dat ze eigenlijk als voordeel van talen die het wel hebben gezien moet worden (zoals complex, matrix en vector types). Vziw hebben C en C++ ook geen numerieke typen?
Zie hieronder. Een ingebouwde complex klasse is overigens een must voor wetenschappelijke berekeningen. Het ontbreken van zo'n type geeft louter aan dat de taal niet voor dat doel ontworpen werd.
Leuk voor eenvoudige lussen, maar dat gaat niet werken voor datastructuren voor ijle matrices (dé bouwsteen bij iteratieve methoden voor het oplossen van ijle stelsels vergelijkingen, zoals bijvoorbeeld in eindige-elementen solvers). Dit komt omdat je een indirecte geheugentoegang nodig hebt: array[ other[i] ].
Iets wat natuurlijk ook in compiler technologie zit, dewelke bijvoorbeeld ook aan intra-procedurale optimalisatie kunnen doen. Volgens de auteurs van dat artikel is dat bijvoorbeeld nog niet mogelijk met dynamische compilers.
Ik snap niet welk punt je hier probeert te maken.
Het punt is dat het mechanisme van dynamische binding gebruikt word. In C++ bijvoorbeeld heb je voor het aanbieden van een uniforme interface geen expliciete interface nodig, door gebruik te maken van templates. Bijvoorbeeld
C++:
1
| template<typename T> T add(const T& a, const T& b) const { return a + b; } |
zal in C++ compileren, zolang alle instanties de operator+ implementeren. Met generics in Java ben je verplicht om een interface klasse te maken die deze methode bevat. Vervolgens zullen alle instances die methode moeten implementeren. Het nadeel is dat je dan weer met dynamische binding zit opgescheept (en dus met een indirecte toegang, die in een typische implementatie eerst via wat men in C++ een virtual function table moet, tot de methode).
Als je in een C++ applicatie ook eerst al het geheugen op voorhand alloceert en dan met bijvoorbeeld een placement new werkt, dan zal dat minstens even efficiënt zijn.
Mooi.
Ik heb het echter niet over "veel gevallen". Het gaat hier specifiek over software voor wetenschappelijk rekenen.
Hetgeen ook zeer duidelijk is aangegeven in alle posts.Dat hebben meer talen niet.
Relevantie? Ik maak
enkel de opmerking dat Java niet ontworpen is voor wetenschappelijke berekeningen. Het ontbreken van een complex data type is een van de vele voorbeelden waarom.
Een matrix of een vector type kun je in Java introduceren door zelf een class te schrijven.
Zelfde opmerking. Een goede matrix en vector klasse wil je wegens numerieke redenen niet altijd zelf implementeren. Indien deze numerieke redenen belangrijk zijn, dan gebruik je simpelweg BLAS en LAPACK. Op een numeriek accurate wijze het inproduct berekenen van twee vectoren, bijvoorbeeld, is niet zo'n eenvoudige aangelegenheid als je zou denken.
Met dank aan Soultaker om het zo mooi samen te vatten. Echter, zoals ik mijn allereerste post al opmerkte is dit een van de historische redenen waarom Java door de scientific computing gemeenschap niet werd opgenomen. Net zoals met C++ overigens.
Uiteraard is de uitvoeringstijd van het dynamisch compileren veelal verwaarloosbaar ten opzichte van de algehele uitvoeringstijd van numerieke software. Het geeft echter aan dat Java
niet ontworpen is voor numerieke software. Immers, voor dat soort toepassingen heb je helemaal geen nood aan dynamische compilatie.
Misschien een vraag/aanbod probleem? Als er te weinig interesse is, dan komt zo'n API niet zo maar uit de lucht vallen.
Nogmaals: ik beargumenteer dat Java niet ontworpen werd met wetenschappelijk rekenen in het achterhoofd. Dat er voor deze twee belangrijke bibliotheken geen Java API bestaat, onderstreept alleen maar mijn bewering. Ik beweer helemaal niet dat Java een slechte taal zou zijn
omdat er geen API is voor OpenMP en MPI.
Dit is een conclusie getrokken op basis van wat precies? Niet al je aangedragen punten gaan namelijk over performance.

Dat is gebaseerd op de verscheidene ontwerpbeslissingen die vanuit het standpunt van
numerieke software overbodig zijn en alleen maar nodeloos de prestaties negatief beïnvloeden. Ik denk niet dat je gaat beweren dat er geen kostprijs in prestaties is van dynamische uitvoering, dynamische compilatie, bounds-checking, garbage collector, etc.
De prestaties van de JVM zijn de afgelopen jaren inderdaad verbeterd, tot het niveau waarop de overhead van al deze features relatief verwaarloosbaar is ten opzichte van de totale uitvoeringstijd. Dat neemt echter niet weg dat als je deze features niet nodig hebt (wat binnen de numerieke software gemeenschap blijkbaar de algemene indruk is), dit gewoon overhead is. Als jij een gedistribueerde 3-tier applicatie wilt maken gebruik je toch ook geen Fortran? Die taal is daar niet voor
ontworpen. Het is louter dat wat ik beargumenteer: Java is niet ontworpen voor wetenschappelijke berekeningen. Waarom? Zie lijst van features die we niet nodig hebben
voor numerieke software.
[
Voor 13% gewijzigd door
Nick The Heazk op 21-09-2009 14:57
]
Performance is a residue of good design.