Archief - [Discussie] Java vs. C++

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

apella

Legacy Member
C# en Java hebben het voordeel van rapid development languages te zijn. Ze zijn afgeleiden van C++ die er een hoop uitsmijten. Dit maakt dat je er sneller dingen mee kunt maken, maar je hebt minder bouwstenen om ze te maken. Die beperking is op die manier dus eigenlijk een zegen.
C# en Java gaan altijd trager zijn omdat ze naar een tussentaal worden gecompileerd en, in het geval van C#, op het moment van het runnen door een JIT-compiler worden vertaald, in het geval van Java in een virtual machine wordt gedraaid.

Wat betreft welke taal best eerst wordt geleerd:
C++ is een taal die meer inzicht in het proces vergt. Om het met een bekende quote te zeggen: "C++ gives you all the rope you need to hang yourself."
Dit klopt. Met C++ kan je je geheugen snel verneuken (pardon me the words), hetgeen in C# en Java niet meteen zal lukken, omdat je er geen rechtsreekse toegang tot hebt.

Een ander nadeel van C++ dat wordt aangehaald (Door Fraggie) is dat C++ lastig zou zijn wegens de libraries die je extra moet downloaden en inladen, bijvoorbeeld om te interfacen met mysql.
De reden hiervoor is dat C++ een oudere standaard heeft. Terwijl Java om de zo veel tijd updates krijgt.
De STL (de standaard bibliotheek van C++) is toen gemaakt om een basis te geven. Andere mensen hebben andere ideeën, en specifieke dingen zoals interfaces met mySQL zijn dus door verschillende mensen gemaakt.
Zo'n specifieke zaken horen ook niet in een standaard, aangezien je daardoor bepaalde technologieën voortrekt. Wil je er mee interfacen, gebruik dan een library er voor, of schrijf er zelf een, was de redenering.

Verder zorgt de grote hoeveelheid aan standaard toegevoegde classes van zowel Java als C# voor een zekere bloating. Een hoop data op de computer, die helemaal niet gebruikt wordt.

Daar tegenover staat natuurlijk weer dat het inderdaad wel makkelijker is, zeker voor de developer, om al die zaken meteen tot zijn beschikking te hebben.

Syntactisch is C++ ook niet zo evident. Sterretjes voor of na woorden, ampersands, zeker die ene punt-komma niet vergeten...
De IDE's voor C# en Java maken het ook daar je makkelijker.
Dat komt ook weer deels dankzij de eenvoudigere opzet van de taal, het verwijderen van templates lost een hoop problemen op van het parsen voor auto-aanvulling etc.

Wet Manjak zei over Haskell:
functionele talen zoals Haskell (dat zijn talen die functies als eerste-klasse objecten zien, zoals klassen in C# en Java zijn, dus je werkt er niet met klassen, maar met functies of operaties) hebben een prachtige elegantie die een object-georiënteerde taal niet kan evenaren.
waar je in Java twintig regels voor zou nodig hebben, kan je in een taal als Haskell of Scheme misschien in vijf regels schrijven, dankzij recursie.

Het loont daarom ook om zowel functionele als OO talen te leren, technieken die je in de ene meestal gebruikt kan je ook vaak op een of andere manier in de andere gebruiken.

Nog een laatste punt: betreffende cross-platform ontwikkeling:
Ook C++ is een taal die niet platformafhankelijk is.
Als je alleen de standaard bibliotheek gebruikt (dus een console programma), zal deze op ieder platform draaien, op voorwaarde dat je een compiler hebt voor dat platform.
Op het vlak van compilers zijn er helaas soms wat verschillen. Zaken die VC++ zal compilen zullen niet altijd compilen met G++ bijvoorbeeld, de standaarden worden niet altijd volledig nageleefd, of extra's worden toegevoegd (#pragma once, bijvoorbeeld, is geen onderdeel van de standaard, en als je met iets anders dan VC++ compileerd, moet je je headers nog altijd beschermen met een #ifdef).
Betreffende cross-platform UI's zijn er meerdere op het internet te vinden die op meerdere platforms werken.


Om terug te keren naar de oorspronkelijke vraag:
Wil je snel programma's maken, leer dan Java of C# (of een functionele taal, zeker even goed!)
wil je snelle programma's maken, leer dan C++, maar reken er dan op dat de leercurve een pak steiler is.

Messias.

Legacy Member
Manjak zei:
Momenteel ben ik met iet totaal anders bezig, ik ben namelijk Haskell aan het verkennen, moest van school uit het begin kennen, maar ben nu toch benieuwd how deep the rabbit hole goes. Nog iemand ervaring met Haskell? En hoe beviel die ervaring?

In Haskell wordt ge plots geconfronteerd met een aantal dingen die radicaal anders zijn. Niet alleen zit ge plots met een type-systeem dat zeer sterk verschilt uit eerdere ervaringen: ADT's, higher-kinded polymorfisme, functies als types, en het statisch typeren van neveneffecten (zoals I/O).

Daar komt bovendien nog eens luie evaluatie bovenop. Vooral dat laatste is theoretisch zeer mooi, maar maakt het lastig om het geheugengerbruik van uw code te beredeneren, vooral als ge uit een meer traditionele programmeertaal komt. Haskell leren is een speciale ervaring, en verloopt (bij mij althans) zeer gefaseerd.

Messias.

Legacy Member
Akkoord. Er wordt vaak over de traagheid van Java gesproken in de context van processen die vaak een korte looptijd hebben. In zo'n cases weegt de overhead van een jit-compiler (en de opstarttijd van de VM) inderdaad relatief zwaarder door. Maar gegeven processen met een lange looptijd is die extra opstarttijd en overhead te verwaarlozen. Een jit heeft op langere termijn bovendien veel meer informatie ter beschikking om optimalisaties door te voeren. Als ge in zo'n zaken geïnteresseerd zijt, moet ge de blog van Cliff Click maar eens volgen om te zien wat voor zotte dingen allemaal mogelijk zijn.

Mensen kunnen zagen wat ze willen op Java-de-programmeertaal, maar de HotSpot, het kloppend hart van de JVM is echt state-of-the-art.

Messias.

Legacy Member
Manjak zei:
Hier ook wat benchmarks, en wat recenter denk ik. C++ komt er over het algemeen toch beter uit.

speed and size Java 6 -Xint÷C++ GNU g++ | ComputerLanguageBenchmarksGame

Weet wel niet meteen wat het verschil is tussen de verschillende Java stuff. Kan iemand even toelichten wat het verschil is tussen Java 6 - Xint / Server / steady state?

De "-server" flag zorgt er voor dat de jit agressiever zal inlinen ten koste van geheugengebruik en opstarttijd.

Cycloon

Legacy Member
Fraggie zei:
Mijn voorkeur als taal gaat naar Java omdat deze 100% OOP is, daar waar C++ dingen bestaan als globale functies. Iets waar ik een hekel aan heb.

Statische methoden in een OO model zijn anders ook wel te vergelijken met globale functies.

Cycloon

Legacy Member
Fraggie zei:
Maar die zijn toch altijd klasse gebonden?

Ja, maar maakt dat ze plots wel beter dan globale functies? Ik zie geen verschil tussen

Code:
String GeefHallo() { return "Hallo"; }

of

Code:
public class Verteller {
   public static String geefHallo() { return "Hallo"; }
}

Dat C# dus minderwaardig zou zijn (of minder de voorkeur zou krijgen) tov Java omwille van globale functies is nogal kort door de bocht omdat statische methoden even goed globale functies zijn (zei het verpakt in nog een extra class definitie die hier eigenlijk totaal nutteloos is). In principe staan statische methoden eigenlijk volledig los van de klasse en het object omdat het totaal geen staten/toestanden van het object kan manipuleren, het kan er zelf volledig geen interactie mee aangaan.

Manjak

Legacy Member
Cycloon zei:
Ja, maar maakt dat ze plots wel beter dan globale functies? Ik zie geen verschil tussen

Code:
String GeefHallo() { return "Hallo"; }

of

Code:
public class Verteller {
   public static String geefHallo() { return "Hallo"; }
}

Wordt het ook niet aanschouwd als good practice om globale functies (als je ze gebruikt) binnen een namespace te zetten? Wat min of meer hetzelfde effect bereikt als die klasse.

Fraggie

Legacy Member
Ik vind persoonlijk van wel gezien je de aanroep anders is. Je bent in Java verplicht om de klasse te vermelden en gezien alles op zen minst erft van Object, is da volgens mij volgens de regels van OOP.

Daedie

Legacy Member
Cycloon zei:
In principe staan statische methoden eigenlijk volledig los van de klasse en het object omdat het totaal geen staten/toestanden van het object kan manipuleren, het kan er zelf volledig geen interactie mee aangaan.

Dat is niet altijd waar he. Zoals gij die functie schrijft nu klopt dit. Maar ge kunt ook statische methoden schrijven die statische variabelen van de class manipuleren. En dan is uw functie weldegelijke class gebonden (maar nooit object gebonden).

Singleton design pattern is daar een goed voorbeeld van.

Cycloon

Legacy Member
Daedie zei:
Dat is niet altijd waar he. Zoals gij die functie schrijft nu klopt dit. Maar ge kunt ook statische methoden schrijven die statische variabelen van de class manipuleren. En dan is uw functie weldegelijke class gebonden (maar nooit object gebonden).

Singleton design pattern is daar een goed voorbeeld van.

Maar dan ben je niet meer bezig over globale functies versus statische methoden. Een statische methode op zich heeft nooit een functie die gekoppeld kan worden aan een instantie van de klasse. Waar jij op doelt is dat statische variabelen handig gebruikt kunnen worden, maar da's weer totaal iets anders. Ik wil niet zeggen dat statische definities slecht zijn, ik wil enkel verduidelijken dat globale functies op zich ook niet "the horror" zijn en dat ze dus ook in Java toegepast kunnen worden, ze hebben enkel een andere naam. Bad practices zijn in beide talen dus perfect mogelijk.

Krueger

Legacy Member
Soulless zei:
Op school (EHB Toegepaste Informatica) zijn we in het eerste jaar enkel bezig met c++. Het voordeel is volgens mij, dat c++ enorm strict is en je hierdoor "verplicht" bent goed te programmeren om iets te laten werken. Het nadeel is dat het allemaal relatief "droog" is. Het eerste jaar zijn we niet anders bezig dan met het maken van console applicaties. Een ander ding dat ik niet zo leuk vindt aan c++ zijn pointers :p, het is enorm krachtig, maar volgens mij niet erg evident om het juiste gebruik ervan aan te leren.

Ik kijk wel uit naar Java en/of C#, het meest kijk ik wel uit naar ABAP :p aangezien ik mij wil verdiepen in SAP ERP development ^_^

Op welke manier vind je c++ zeer strikt? Ik denk dat C# (java ken ik niet zo goed meer) net een stuk strikter is. In C++ kan je los casten naar void* , kan je met pointer in ander geheugen zitten schrijven, kan je arrays manipuleren die in C# gewoon ondenkbaar zijn... Ik denk dat moderne talen net veel strikter zijn.

Chaoz

Legacy Member
Krueger zei:
Op welke manier vind je c++ zeer strikt? Ik denk dat C# (java ken ik niet zo goed meer) net een stuk strikter is. In C++ kan je los casten naar void* , kan je met pointer in ander geheugen zitten schrijven, kan je arrays manipuleren die in C# gewoon ondenkbaar zijn... Ik denk dat moderne talen net veel strikter zijn.

Indeed, C++ is een slagveld voor mensen da er nie met kunnen werken. Ge kunt makkelijk dingen schrijven met undefined behaviour wanneer ge niet weet wa ge aan het doen zijt. Het voordeel is dan wel omdat al die checks er nie in zitten zoals array bounds etc da het sneller runned.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan