it-swarm.dev

Eine moderne Überprüfung von Java

Ich programmiere seit ein paar Jahren und habe in Java angefangen. In meiner Zeit habe ich viele verschiedene Quellen gefunden, die behaupteten, Java sei auf die eine oder andere Weise eine minderwertige Sprache. I ') Ich bin mir bewusst, dass jede Sprache ihre Stärken und Schwächen hat, aber viele Dinge, über die ich gelesen habe Java scheinen veraltet zu sein.

Der am häufigsten genannte Grund dafür, dass Java minderwertig ist), ist, dass es viel langsamer ist als andere nativ kompilierte Sprachen, wie beispielsweise C++. Viele Leute kritisieren den Spieledesigner Notch (der Minecraft entwickelt hat) für die Verwendung von = Java wegen seines offensichtlichen Mangels in der Leistungsabteilung. Ich weiß Java war damals viel langsamer, aber seitdem gab es viele Verbesserungen, insbesondere die JIT-Kompilierung .

Ich möchte einige objektive Meinungen zu Java als Sprache heute erhalten. Meine Frage besteht also aus 4 Teilen.

  1. Performance.

    ein. Wie ist die Geschwindigkeit von Java heute im Vergleich zu C++?

    b. Wäre es möglich, mit Java einen modernen AAA-Titel zu erstellen?

    c. In welchen Bereichen ist Java langsamer als C++, wenn überhaupt? (D. H. Zahlenkalkulation, Grafik oder einfach überall)?

  2. Wird Java jetzt als kompilierte oder interpretierte Sprache betrachtet?

  3. Was sind einige Hauptmängel von Java, die seit den frühen Tagen behoben wurden?

  4. Was sind einige Hauptmängel von Java, die noch behoben werden müssen?

Bearbeiten:

Nur zur Verdeutlichung mache ich das nicht Java vs C++, offensichtlich ist C++ im Durchschnitt etwas schneller als Java. Ich brauche einfach etwas zum Vergleichen Java = zu in Bezug auf die Reife als Sprache zu diesem Zeitpunkt. Da es c ++ schon immer gibt, dachte ich, ich wäre ein guter Vergleichspunkt.

58
Ryan Stull

ein. Wie ist die Geschwindigkeit von Java heute im Vergleich zu C++?

Schwer zu messen. Es ist erwähnenswert, dass ein Großteil der Geschwindigkeit einer Implementierung, der Speicherzuweiser, sehr unterschiedliche Algorithmen in Java und C++) sind. Die nicht deterministische Natur des Kollektors macht es äußerst schwierig, sie zu erhalten aussagekräftige Leistungsdaten im Vergleich zur deterministischen Speicherverwaltung von C++, da Sie nie sicher sein können, in welchem ​​Zustand sich der Kollektor befindet. Dies bedeutet, dass es sehr schwierig ist, einen Benchmark zu schreiben, der sie sinnvoll vergleicht. Einige Speicherzuweisungsmuster laufen viel schneller mit Bei einem GC laufen einige mit einem nativen Allokator viel schneller.

Was ich jedoch sagen würde, ist, dass die Java GC in every Situation schnell laufen muss. Ein nativer Allokator kann jedoch gegen einen geeigneteren ausgetauscht werden. Ich habe kürzlich eine Frage zu SO gestellt darüber, warum ein C # Dictionary in (0,45 ms auf meinem Computer) ausgeführt werden kann, verglichen mit einem äquivalenten std::unordered_map, Das in (10 ms auf) ausgeführt wird meine Maschine). Durch einfaches Austauschen des Allokators und des Hashers gegen geeignetere habe ich diese Ausführungszeit auf meinem Computer auf 0,34 ms verkürzt - ein Dreißigstel der ursprünglichen Laufzeit. Sie könnten niemals hoffen, diese Art der benutzerdefinierten Optimierung mit Java durchzuführen. Ein hervorragendes Beispiel dafür, wo dies einen echten Unterschied bewirken kann, ist das Einfädeln. Native Thread-Bibliotheken wie TBB bieten Thread-Caching-Allokatoren, die bei vielen Allokationen auf vielen Threads erheblich schneller sind als herkömmliche Allokatoren.

Jetzt werden viele Leute über JIT-Verbesserungen sprechen und wie die JIT mehr Informationen hat. Klar, das stimmt. Aber es ist noch nicht einmal annähernd das, was ein C++ - Compiler ziehen kann - denn der Compiler hat aus Sicht der Laufzeit des endgültigen Programms vergleichsweise unendlich viel Zeit und Raum zum Ausführen. Jeder Zyklus und jedes Byte, das die JIT damit verbringt, darüber nachzudenken, wie Ihr Programm am besten optimiert werden kann, ist ein Zyklus, den Ihr Programm nicht ausführt und nicht für seinen eigenen Speicherbedarf verwenden kann.

Darüber hinaus wird es immer Zeiten geben, in denen Compiler- und JIT-Optimierungen bestimmte Optimierungen nicht nachweisen können - insbesondere bei Dingen wie der Escape-Analyse. In C++ muss der Compiler ihn dann nicht ausführen, da sich der Wert auf dem Stapel befindet sowieso. Darüber hinaus gibt es einfache Dinge, wie das zusammenhängende Gedächtnis. Wenn Sie ein Array in C++ zuweisen, weisen Sie ein einzelnes zusammenhängendes Array zu. Wenn Sie ein Array in Java zuweisen, ist es überhaupt nicht zusammenhängend, da das Array nur mit Zeigern gefüllt ist, die auf eine beliebige Stelle verweisen können. Dies ist nicht nur ein Speicher- und Zeitaufwand für die doppelten Indirektionen, sondern auch ein Cache-Overhead. In dieser Art von Dingen erzwingt die Sprachsemantik von Java einfach, dass es langsamer sein muss als gleichwertiger C++ - Code.

Letztendlich ist meine persönliche Erfahrung, dass Java durchschnittlich etwa halb so schnell wie C++ sein kann. Es gibt jedoch realistisch gesehen keine Möglichkeit, Leistungsaussagen ohne eine äußerst umfassende Benchmark-Suite zu sichern, da die grundlegend unterschiedlichen Algorithmen beteiligt.

b. Wäre es möglich, mit Java einen modernen AAA-Titel zu erstellen?

Ich gehe davon aus, dass Sie hier "Spiel" meinen und keine Chance. Erstens müssten Sie alles von Grund auf selbst schreiben, da fast alle vorhandenen Bibliotheken und Infrastrukturen auf C++ abzielen. Dies macht es zwar nicht per se unmöglich, könnte aber durchaus einen soliden Beitrag zum Unmöglichen leisten. Zweitens können selbst die C++ - Engines kaum in die winzigen Speicherbeschränkungen bestehender Konsolen passen - wenn JVMs überhaupt für diese Konsolen existieren - und PC-Spieler erwarten etwas mehr für ihren Speicher. Das Erstellen performanter AAA-Spiele ist in C++ schwierig genug. Ich sehe nicht, wie dies in Java erreicht werden kann. Niemand hat jemals ein AAA-Spiel geschrieben, bei dem viel Zeit in einer nicht kompilierten Sprache verbracht wurde. Darüber hinaus wäre es einfach extrem fehleranfällig. Deterministische Zerstörung ist wichtig, wenn Sie beispielsweise mit GPU-Ressourcen arbeiten. In Java müssten Sie diese grundsätzlich malloc () und free ().

c. In welchen Bereichen ist Java langsamer als C++, wenn überhaupt? (D. H. Zahlenkalkulation, Grafik oder einfach überall)?

Ich würde definitiv alles machen. Die erzwungene Referenznatur aller Java -Objekte bedeutet, dass Java enthält weitaus mehr Indirektion und Referenzen als C++ - ein Beispiel, das ich zuvor mit Arrays gegeben habe). Dies gilt beispielsweise auch für alle Member-Objekte. Wenn ein C++ - Compiler eine Member-Variable in konstanter Zeit nachschlagen kann, muss eine Java-Laufzeit einem anderen Zeiger folgen. Je mehr Zugriffe Sie ausführen Je langsamer dies wird, desto weniger kann die GEG dagegen tun.

Wo C++ ein Stück Speicher fast sofort freigeben und wiederverwenden kann, müssen Sie in Java) auf die Sammlung warten, und ich hoffe, dass dieses Stück nicht aus dem Cache stammt und von Natur aus erforderlich ist Mehr Speicher bedeutet weniger Cache- und Paging-Leistung. Schauen Sie sich dann die Semantik für Dinge wie Boxen und Unboxing an. Wenn Sie in Java auf ein Int verweisen möchten, müssen Sie es dynamisch zuweisen. Dies ist eine inhärente Verschwendung im Vergleich zur C++ - Semantik.

Dann haben Sie das Generika-Problem. In Java können Sie generische Objekte nur durch Laufzeitvererbung bearbeiten. In C++ haben Vorlagen buchstäblich keinen Overhead - etwas Java kann nicht übereinstimmen. Dies bedeutet, dass der gesamte generische Code in Java ist von Natur aus langsamer als ein generisches Äquivalent in C++.

Und dann kommst du zu undefiniertem Verhalten. Jeder hasst es, wenn sein Programm UB zeigt, und jeder wünscht, dass es nicht existiert. UB ermöglicht jedoch grundsätzlich Optimierungen, die in Java niemals existieren können. Schauen Sie sich this Post an, in dem Optimierungen basierend auf UB beschrieben werden. Wenn das Verhalten nicht definiert wird, können Implementierungen mehr Optimierungen vornehmen und den Code reduzieren, der erforderlich ist, um nach Bedingungen zu suchen, die in C++ nicht definiert, aber in Java definiert sind.

Grundsätzlich schreibt die Semantik von Java vor, dass es eine langsamere Sprache als C++ ist.

Wird Java jetzt als kompilierte oder interpretierte Sprache betrachtet?

Es passt nicht wirklich in eine dieser Gruppen. Ich würde sagen, dass verwaltet wirklich eine separate Kategorie für sich ist, obwohl ich sagen würde, dass es definitiv eher eine interpretierte Sprache als eine kompilierte Sprache ist. Noch wichtiger ist, dass es so gut wie nur zwei wichtige verwaltete Systeme gibt, die JVM und die CLR, und wenn Sie "verwaltet" sagen, ist dies ausreichend explizit.

Was sind einige Hauptmängel von Java, die seit den frühen Tagen behoben wurden?

Automatisches Boxen und Unboxing ist das einzige, was ich weiß. Die Generika lösen einige Probleme, aber bei weitem nicht viele.

Was sind einige Hauptmängel von Java, die noch behoben werden müssen?

Ihre Generika sind sehr, sehr schwach. Die Generika von C # sind erheblich stärker - obwohl es natürlich auch keine Vorlagen gibt. Deterministische Zerstörung ist ein weiterer großer Mangel. Jede Form von Lambda/Closure ist ebenfalls ein großes Problem - Sie können eine funktionierende API in Java vergessen. Und natürlich gibt es immer das Problem der Leistung für die Bereiche, in denen sie benötigt werden.

62
DeadMG

Ich beginne mit der Maßgabe, dass es für niemanden möglich ist, eine wirklich neutrale Meinung zu Programmiersprachen abzugeben. Wenn Sie zwei Sprachen gut genug kennen, um sie überhaupt sinnvoll zu kommentieren, ist es fast unvermeidlich, dass Sie eine der anderen vorziehen. Als faire Warnung bevorzuge ich C++ gegenüber Java, was meine Kommentare zweifellos zumindest teilweise beeinflusst.

1a. Geschwindigkeit: Die Geschwindigkeit, die Sie entweder von C++ oder Java) erhalten, hängt im Allgemeinen weniger von der Sprache oder ihrer Implementierung ab als von den Fähigkeiten der Programmierer, die sie verwenden. Letztendlich ist C++ wahrscheinlich can gewinnt meistens für Geschwindigkeit, aber die Unterschiede im Code, den Sie schreiben, sind wirklich wichtig.
1b. Ja, vermutlich. Gleichzeitig ist C++ bereits gut etabliert, und ich bezweifle, dass die meisten Spielestudios genug Vorteile sehen, um auf Java umzusteigen.
1c. Eine gründliche Antwort darauf könnte wahrscheinlich ein großes Volumen füllen. C++ wird im Allgemeinen mit begrenzten Ressourcen besser abschneiden. Java profitiert mehr davon, dass (zum Beispiel) viel "freier" Speicher verfügbar ist.
2. Langsame Ausführung und langsame Speicherbereinigung wären wahrscheinlich die beiden offensichtlichsten. Die frühe Fensterbibliothek (AWT) war ziemlich ungeschickt - Swing war eine wesentliche Verbesserung.
3. Ausführlichkeit. Fehlende Überlastung des Bedieners. Verwendung der Speicherbereinigung. Fehlende Mehrfachvererbung. Java Generics sind extrem im Vergleich zu C++ - Vorlagen begrenzt.

Ich sollte hinzufügen, dass einige (alle?) Dieser Nachteile (insbesondere die Verwendung der Speicherbereinigung, aber auch die anderen) von vielen als Vorteile von Java angesehen werden. Die einzig mögliche Ausnahme wäre seine Ausführlichkeit. Die Ausführlichkeitssituation verbessert sich langsam ein wenig, aber Sie sehen sicherlich nicht sehr oft Java gewinnende Code-Golfwettbewerbe, und im normalen Code wird häufig auch ziemlich viel Code verwendet. I. Ich vermute, es gibt mindestens einige, die es als lesbarer und verständlicher ansehen, so dass es wahrscheinlich auch als Vorteil angesehen werden kann.

34
Jerry Coffin
  1. In Bezug auf die Leistung;
    1. In der reinen Codeausführungsgeschwindigkeit entspricht Java ungefähr C++. Aber Java verbraucht tendenziell viel mehr Speicher - teilweise, weil es GC-basiert ist, teilweise Aufgrund seines Designs liegt der Schwerpunkt mehr auf Einfachheit und Sicherheit als auf Effizienz. Aufgrund von Cache-Problemen führt mehr Speicher zu einer geringeren Geschwindigkeit. A lot niedriger im Vergleich zu hoch optimiertem C++.
    2. Wenn Sie davon ausgehen, dass ein AAA-Titel am Rande dessen funktionieren muss, was mit der aktuellen Hardware möglich ist, nein. Zumindest nicht auf der Client-Seite. Ich würde wetten, dass einige AAA-Titel bereits Java für Teile der Backend-Infrastruktur verwenden).
    3. Alles, wo Sie mit großen Datenmengen und C++ arbeiten, kann optimiert werden, um cachefreundlich darauf zuzugreifen.
  2. Es wird zu Bytecode kompiliert und zur Laufzeit JIT-kompiliert. Kompiliert vs. interpretiert ist eine falsche, veraltete Zweiteilung.
  3. & 4. Es gibt zu viele Dinge, um sie alle aufzulisten, und bei den meisten wird es Meinungsverschiedenheiten geben.
11

Erstens ist mein C++ in einem bestimmten Kontext sehr verrostet, daher beziehen sich die meisten meiner Erfahrungen mit Java auf meine neueren Erfahrungen mit C #, das ohnehin viel mehr Äpfel mit Äpfeln vergleicht.

1. Geschwindigkeit

ein. Wie ist die Geschwindigkeit von Java heute im Vergleich zu C++?

Ich denke, dies lässt sich am besten mit der Frage beantworten SO Frage Warum hatte Java hatte den Ruf, langsam zu sein? , aber ich denke auch, dass dies so ist Die ganze Frage wird von Jeff Atwoods Blog-Beitrag Gorilla vs. Shark gefärbt. Vielen Dank an Péter & Christopher.

b. Wäre es möglich, mit Java einen modernen AAA-Titel zu erstellen?

Das hängt von den Prioritäten der Entwickler und den Fähigkeiten der Entwickler ab. Außerdem ist es keine Entweder-Oder-Situation. Unterschiedliche Teile des Titels erfordern möglicherweise unterschiedliche Dinge in der Sprache, in der sie implementiert sind, was zu einer heterogenen Sprachumgebung führt.

Ich habe kürzlich eine Reihe von Spielen gesehen, in denen erwähnt wurde, dass sie eine Python -Umgebung) laden, während sie geladen werden, und ich vermute, dass Pferde für Kurse eine starke Motivation ist, wenn Sie Sie möchten Ihren Titel rechtzeitig zur Weihnachtszeit veröffentlichen (zum Beispiel).

c. In welchen Bereichen ist Java langsamer als C++, wenn überhaupt? (D. H. Zahlenkalkulation, Grafik oder einfach überall)?

Sie können Code mit schlechter Leistung in jeder Sprache schreiben, aber einige Sprachen erleichtern es Ihnen, gute Entscheidungen zu treffen, während andere sich eher von Ihrem eigenen Petard hochziehen lassen. Java fällt in die erstere Kategorie, C++ fällt definitiv in die letztere.

Mit großer Kraft geht große Verantwortung einher wie sie sagen (ganz zu schweigen von der Fähigkeit, deinen Haufen komplett zu vermasseln * 8 ').

2. Wird Java jetzt als kompilierte oder interpretierte Sprache betrachtet?

Ich kann nicht sagen, was die meisten Leute Es für richtig halten, aber viele Leute kennen den Unterschied zwischen kompilierten und interpretierten Sprachen und hatten in den letzten 20 Jahren nicht in einer Höhle gelebt Sie sollten auch wissen, dass der JIT-Compiler ( Just-in-Time ) ein wichtiger Bestandteil des Ökosystems Java) ist und daher heutzutage wahrscheinlich eher als kompiliert angesehen wird .

3. Was sind einige Hauptmängel von Java, die seit den Anfängen behoben wurden?

Ich bin ein relativ neuer Konverter zu Java, daher habe ich wenig Kontext darüber, wie es sich entwickelt hat. Es ist jedoch interessant festzustellen, dass es Bücher wie Java: The Good Parts gibt, die versuchen, Menschen in Richtung der Teile der Sprache zu lenken, die heutzutage bevorzugt werden sollten, und Menschen von den Gebieten wegzulenken die veraltet sind oder sein sollten.

4. Was sind einige Hauptmängel von Java, die noch behoben werden müssen?

Meiner Meinung nach war ein Problem mit Java) die langsame Übernahme neuer Funktionen.

Nachdem ich zu Java von C # gekommen bin und die Wikipedia-Vergleichsseite durchgesehen habe, fallen mir folgende Dinge auf:

Dinge, die ich in Java vermisse, im Vergleich zu C #

  • Eigenschaften , insbesondere automatische Eigenschaften. Sie erleichtern das Erstellen und Verwalten von Schnittstellen viel.
  • Verschlüsse/Lambdas . Ich war wirklich enttäuscht, als ich hörte, dass Java Unterstützung wurde zurückgedrängt wieder.Schließlich haben wir Closures/Lambdas in Java 8, aber die Zeit, die es gedauert hat, bestätigt meine Aussage über langsame Adoption.
  • Typinferenz (var) mag syntaktisch erscheinen Zucker, aber wenn Sie komplexe generische Typen haben, kann dies den Code viel klarer machen, indem viele wertlose Duplikate entfernt werden.
  • Teilklassen helfen wirklich dabei, automatisch generierten Code (z. B. von einem GUI-Builder) vom vom Programmierer geschriebenen Code zu trennen.
  • Werttypen , manchmal gibt es ein Argument für die Verwendung eines Lightweight struct über eine ganze Klasse.
  • Erweiterungsmethoden können Systeme bei Überbeanspruchung komplex machen, eignen sich jedoch hervorragend, um die kanonische Art der Implementierung von etwas für eine Klasse anzugeben if es wird benötigt.
  • Vorzeichenlose Typen , manchmal kann dieses zusätzliche Bit den Unterschied ausmachen. * 8 ')

Dinge, die ich in Java nicht vermisse, verglichen mit C #

  • Überladen von Operatoren ist großartig, wenn es richtig verwendet wird, aber wenn es schlecht verwendet wird, kann es zu schwer zu findenden Fehlern und einer Trennung zwischen dem, was ein Operator sollte, führen offensichtlich tun und was es eigentlich tut.
  • Typen mit nullbaren Werten schienen immer mehr Probleme zu verursachen, als sie wert waren.
  • Zugriff auf unsafe Code. Sie müssen also vorsichtig sein, damit ich selten finde, dass es den zusätzlichen Aufwand wert ist.

Selbst wenn Äpfel mit Äpfeln verglichen werden, gilt Java als ins Hintertreffen geraten).

Die anderen beiden großen Probleme, die ich mit Java sehe) sind die ungeheure Startverzögerung und die Tatsache, dass Sie (für einige JVMs) Mikromanagement Ihres Heaps und sogar - müssen. permanenter Generierungsheap . Mit C # wurden Anwendungen immer sofort gestartet und ich musste nie an Heap denken, da er aus dem Systemspeicherpool zugewiesen wurde, nicht aus einem der virtuellen Maschine zugewiesenen vorab zugewiesenen Pool .

11
Mark Booth

Ich kann Ihnen eine Quelle nennen, die Ihnen helfen kann, den ersten Teil Ihrer Frage zu beantworten. Programmiersprachen schießen heraus http://shootout.alioth.debian.org/u64q/which-programming-languages-are-fastest.php ist eine ziemlich gute Quelle, um zu sehen, wie schnell Sprachen miteinander verglichen werden . Sie können sogar nach verschiedenen Kategorien gefiltert werden, um festzustellen, in welchen Bereichen Sprachen besser abschneiden als andere. Java ist viel schneller als vor einigen Jahren.

8
bschaffer13

1) Wenn ich streng über die UX spreche, die ich mit Java bekomme, fühlt es sich langsam an. Ich kann dir nicht sagen warum wirklich. Ich habe noch keine Java-basierte Desktop-Anwendung gefunden, die nicht fühlen langsam ist und eine schnellere Nicht-Java-Alternative hat. Davon abgesehen kann Java kann in reiner Rechengeschwindigkeit sehr schnell sein und das Internet ist voll von Benchmarks, um dies zu beweisen. Allerdings ist die Startzeit von Java Apps und Die Reaktionsfähigkeit ihrer GUIs hat sich meiner Meinung nach noch nicht verbessert. Vielleicht könnten Sie es tun;)
Am Ende ist Geschwindigkeit nicht so sehr ein Problem. Hardware wird nicht nur immer schneller, es ist auch so, dass sich die meisten Menschen immer noch überraschend wenig darum kümmern, solange die Software dies tut, was sie tun sollte und das Verhältnis von Interaktionszeit zu Wartezeit angemessen ist.

2) Diese Unterscheidung ist in letzter Zeit so verschwommen, dass sie wirklich wenig Wert hat.

3 + 4) Es gab einige Änderungen an Java tatsächlich. Einige Leute argumentieren bereits, dass diese Änderungen Javas rein vereinfachende Philosophie durch das Verschrauben von Alien-Merkmalen verdorben haben. Es ist wirklich schwer, objektiv zu sagen, Was für ein Mangel ist und was für eine Stärke. Für mich ist Java ist unnötig ausführlich, restriktiv und weist nur geringe Merkmale auf, während andere Menschen diese Merkmale als angenehme Eindeutigkeit, Sicherheit und Klarheit betrachten.
Obwohl es diese Dinge sind, die mich persönlich dazu bringen, kein Java zu verwenden, denke ich nicht, dass ich einfach die Dinge hinzufüge, die ich in Java ist eine gute Idee. Es gibt eine Menge Sprachen, die ich gerne auf der JVM laufen lasse und biege Java, um näher an ihnen zu sein, würde nur Javas Zweck zunichte machen.

Es ist eine Frage der Präferenz

Die Sache mit Java ist, dass es Sie daran hindern soll, sich in den Fuß zu schießen. Eine edle Sache, aber mit all den Einschränkungen, die es Ihnen auferlegt, ist es nicht unwahrscheinlich, dass Sie Stolpern Sie über einen Ihrer sicheren Füße, können Sie sich nicht darauf einstellen, dass Ihre Hände zu Ihrer eigenen Sicherheit hinter Ihrem Rücken gefesselt sind, und sterben Sie schließlich, weil Sie sich den Schädel brechen .: D.
In gewisser Weise war Java eine Antwort auf C++, die Ihnen genug Seil gibt, um nicht nur sich selbst, sondern auch den Rest der Welt aufzuhängen. Es ist alles das Seil, das macht es so attraktiv für Cowboys. All diese Freiheit und all diese Kraft.

Einfach gesagt, das ist wirklich nur eine Frage der Präferenz.

Ein Punkt ist jedoch, dass Sie mit C++ als Alternative zu Java Ihre eigenen Einschränkungen wählen können. Oder um mit all der Kontrolle, die Sie haben, wirklich verrückt zu werden und das Risiko einzugehen, Ihre Kollegen völlig zu verwirren:

Ich habe gesehen, wie "cout" "Hallo Welt" mal nach links verschoben wurde und genau dort angehalten habe.
- Steve Gonedes

Aus diesem Grund hat Java beschlossen, keine Operatorüberladung anzubieten. Dies verhindert natürlich, dass Personen ihren Code verschleiern, indem sie Funktionszeiger mit Listen multiplizieren. Gleichzeitig wird jedoch verhindert, dass andere Personen geometrische/algebraische Berechnungen mit den üblichen Operatoren durchführen. (v1 * v2 / scale) + (v3 * m) Ist wirklich viel klarer als v1.multiply(v2).divide(scale).add(v3.multiply(m)). Ich verstehe, warum dies Leute abschrecken kann, die sich mit 3D-Grafiken und Berechnungen beschäftigen.

Java hat sich für die Garbage Collection entschieden, während Sie in C++ wählen können. Sie können wirklich ganz nach unten graben und sich der Hardware nähern. Sie können Daten dicht in Strukturen packen. Sie können dunkle Magie ausführen, wie z. B. die schnelle inverse Quadratwurzel . Mit Vorlagen können Sie einige der kompliziertesten und kryptischsten Metaprogrammierungen der Welt durchführen. Es bedeutet aber auch, dass Sie sich verlaufen und Stunden damit verbringen können, all das Chaos zu debuggen, das Sie erstellt haben, oder absolut nicht hilfreiche Compilerfehler zu untersuchen.
Wenn Sie jedoch die Disziplin haben, nur die Teile der Sprache zu verwenden, die Sie wirklich beherrschen, können Sie C++ - Code genauso sicher schreiben wie Java Code, aber Sie haben die Möglichkeit dazu allmählich vorwärts schieben.

Obwohl Sie technisch nichts daran hindert, innovative Software mit Java zu schreiben, werden Sie feststellen, dass viele Entwickler wirklich leidenschaftlich daran interessiert sind, großartige Software zu schreiben, Spaß zu haben und sich dabei weiterzuentwickeln, und zwar über das hinaus, was Java muss) Angebot als Sprache.

Aber die Welt besteht nicht nur aus Menschen, die sich auf den Weg machen, um das nächste große Ding zu erschaffen, oder nur aus Menschen, die den Gebrauch der ihnen gegebenen Macht nur so weit einschränken, wie sie sie kontrollieren. IMHO Java ist die perfekte Ergänzung für Leute, die auf komfortable Weise stabile Ergebnisse erzielen möchten.

4
back2dos

Müllabfuhr ist das große Ding. Von Zeit zu Zeit sperrt GC alles andere für mehrere hundert Millisekunden (abhängig von der Größe des Heaps) und erstellt eine umfangreiche Sammlung. Dies ist in Ordnung, wenn Sie keine zeitlichen Einschränkungen haben, aber wenn Verspätung einen Fehler bedeutet, ist dies ein Show-Stopper. Sie können das Geld für Echtzeit-Java und ein Echtzeit-Betriebssystem ausgeben, aber Sie können einfach GCC und Standard-Linux verwenden, und Sie werden diese Probleme nicht haben.

Ohne die unvorhersehbaren zufälligen Pausen ist Java ist heutzutage wahrscheinlich schnell genug für die meisten Dinge. Und wenn Sie Monate damit verbringen, Ihre GC-Einstellungen und dergleichen zu optimieren, können Sie es vielleicht, nur vielleicht, lange zum Laufen bringen genug für den Kunden, um Ihnen einen Scheck auszustellen.

0
Kevin