Ich programmiere seit ein paar Jahren und habe in Java angefangen. In meiner Zeit habe ich viele verschiedene Quellen gefunden, die behaupten, Java sei auf die eine oder andere Weise eine minderwertige Sprache. Mir ist klar, dass jede Sprache ihre Stärken und Schwächen hat, aber viele Dinge, die ich über Java gelesen habe, 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, weil es offensichtlich an der Performance-Abteilung mangelt. Ich weiß, dass Java früher viel langsamer war, aber seitdem wurden viele Verbesserungen vorgenommen, insbesondere die JIT-Kompilierung.
Ich möchte heute einige objektive Meinungen über Java als Sprache erhalten. Also meine Frage besteht aus 4 Teilen.
Performance.
ein. Wie ist Javas Geschwindigkeit 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, wenn überhaupt, langsamer als C ++? (zB Zahlen, Grafiken oder einfach alles)
Wird Java jetzt als kompilierte oder interpretierte Sprache betrachtet?
Was sind einige der Hauptmängel von Java, die seit den Anfängen behoben wurden?
Was sind einige der Hauptmängel von Java, die noch behoben werden müssen?
Bearbeiten:
Nur zur Verdeutlichung mache ich dieses Java nicht gegen C ++, offensichtlich ist C ++ im Durchschnitt etwas schneller als Java. Ich brauche einfach etwas, mit dem ich Java in Bezug auf die Reife als Sprache zu diesem Zeitpunkt vergleichen kann. Da es C ++ schon immer gab, dachte ich, ich wäre ein guter Vergleichspunkt.
quelle
Antworten:
Schwer zu messen. Es ist erwähnenswert, dass ein großer Teil der Geschwindigkeit einer Implementierung, der Speicherzuweiser, sehr unterschiedliche Algorithmen in Java und C ++ sind. Die nicht deterministische Natur des Kollektors macht es im Vergleich zur deterministischen Speicherverwaltung von C ++ äußerst schwierig, aussagekräftige Leistungsdaten zu erhalten, 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 das könnte sie sinnvoll vergleichen. Einige Speicherzuweisungsmuster werden mit einem GC viel schneller ausgeführt, andere mit einem systemeigenen Zuweiser.
Was ich jedoch sagen würde, ist, dass der Java GC in jeder Situation schnell laufen muss . Ein nativer Allokator kann jedoch gegen einen geeigneteren ausgetauscht werden. Ich habe kürzlich eine Frage zu SO gestellt, warum ein C #
Dictionary
in (0,45 ms auf meinem Computer) im Vergleich zu einem Äquivalent ausgeführt werden kannstd::unordered_map
was auf (10ms auf meinem Rechner) ausgeführt. Durch einfaches Austauschen des Allokators und des Hashers gegen geeignetere habe ich die Ausführungszeit auf meinem Computer auf 0,34 ms verkürzt - ein Dreißigstel der ursprünglichen Laufzeit. Sie könnten niemals hoffen, eine solche benutzerdefinierte Optimierung mit Java durchzuführen. Ein hervorragendes Beispiel dafür, wo dies einen echten Unterschied machen kann, ist das Einfädeln. Native Thread-Bibliotheken wie TBB bieten Thread-Caching-Zuweiser, die bei vielen Zuweisungen für viele Threads erheblich schneller sind als herkömmliche Zuweiser.Nun werden viele Leute über JIT-Verbesserungen sprechen und wie das JIT mehr Informationen hat. Klar, das stimmt. Aber es ist immer noch nicht annähernd das, was ein C ++ - Compiler abrufen kann, da der Compiler aus der Sicht der Laufzeit des endgültigen Programms vergleichsweise unendlich viel Zeit und Raum zum Ausführen hat. Jeder Zyklus und jedes Byte, für das die JIT sich Gedanken macht, wie Sie Ihr Programm am besten optimieren können, ist ein Zyklus, den Ihr Programm nicht ausführt und für seinen eigenen Speicherbedarf nicht 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 den Wert dann nicht ausführen, da er sich ohnehin auf dem Stapel befindet . Darüber hinaus gibt es einfache Dinge wie zusammenhängendes Gedächtnis. Wenn Sie ein Array in C ++ zuordnen, ordnen Sie ein einzelnes, zusammenhängendes Array zu. Wenn Sie ein Array in Java zuordnen, ist es überhaupt nicht zusammenhängend, da das Array nur mit Zeigern gefüllt ist, die irgendwo hinweisen könnten. Dies ist nicht nur ein Speicher- und Zeitaufwand für die doppelten Indirektionen, sondern auch ein Cache-Aufwand. In solchen Fällen erzwingt die Sprachsemantik von Java lediglich, dass sie langsamer sein muss als äquivalenter C ++ - Code.
Letztendlich ist meine persönliche Erfahrung, dass Java im Durchschnitt ungefähr halb so schnell wie C ++ sein kann. Aufgrund der grundlegend unterschiedlichen Algorithmen ist es jedoch realistisch nicht möglich, Leistungsaussagen ohne eine äußerst umfassende Benchmark-Suite zu sichern.
Ich nehme an, Sie meinen hier "Spiel" und keine Chance. Erstens müssten Sie alles von Grund auf selbst schreiben, da fast alle vorhandenen Bibliotheken und Infrastrukturen auf C ++ abzielen. Obwohl dies nicht per se unmöglich gemacht wird, könnte es zweifellos einen soliden Beitrag zum Undurchführbaren leisten. Zweitens können selbst die C ++ - Engines kaum in die winzigen Speicherbeschränkungen bestehender Konsolen passen - wenn es für diese Konsolen überhaupt JVMs gibt - und PC-Spieler erwarten ein wenig mehr für ihren Speicher. Das Erstellen performanter AAA-Spiele ist in C ++ schwierig genug. Ich sehe nicht, wie dies in Java erreicht werden könnte. Niemand hat jemals ein AAA-Spiel geschrieben, das viel Zeit in einer nicht kompilierten Sprache verbracht hat. Mehr als das, es wäre einfach extrem fehleranfällig. Deterministische Zerstörung ist unerlässlich, wenn Sie zum Beispiel mit GPU-Ressourcen arbeiten.
Ich würde mich auf jeden Fall für Allround entscheiden. Die erzwungene Referenznatur aller Java-Objekte bedeutet, dass Java weitaus mehr Indirektionen und Referenzen enthält als C ++ - ein Beispiel, das ich zuvor mit Arrays angegeben habe, das jedoch beispielsweise auch für alle Member-Objekte gilt. Wenn ein C ++ - Compiler eine Mitgliedsvariable in konstanter Zeit nachschlagen kann, muss eine Java-Laufzeit einem anderen Zeiger folgen. Je mehr Zugriffe Sie ausführen, desto langsamer wird dies, und das JIT kann nichts dagegen tun.
Während in C ++ ein Teil des Arbeitsspeichers fast sofort freigegeben und wieder verwendet werden kann, muss in Java auf die Auflistung gewartet werden, und ich hoffe, dass dieser Teil nicht den Cache verliert und von Natur aus mehr Arbeitsspeicher benötigt, was eine geringere Cache- und Paging-Leistung bedeutet. 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 zuordnen. Das ist eine Verschwendung im Vergleich zur C ++ - Semantik.
Dann hast du das Generika-Problem. In Java können Sie generische Objekte nur über die Laufzeitvererbung bearbeiten. In C ++ haben Vorlagen praktisch keinen Overhead - etwas, mit dem Java nicht übereinstimmen kann. Dies bedeutet, dass der gesamte generische Code in Java von Natur aus langsamer ist als ein generisches Äquivalent in C ++.
Und dann kommen Sie zu Undefiniertem Verhalten. Jeder hasst es, wenn sein Programm UB ausstellt, 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 diesen Beitrag an, in dem Optimierungen auf der Basis von UB beschrieben werden. Wenn das Verhalten nicht definiert wird, können Implementierungen mehr Optimierungen vornehmen und den Code reduzieren, der zum Überprüfen auf Bedingungen erforderlich ist, die in C ++ undefiniert, aber in Java definiert sind.
Grundsätzlich schreibt die Semantik von Java vor, dass es eine langsamere Sprache als C ++ ist.
Es passt nicht wirklich in eine dieser Gruppen. Ich würde sagen, dass managed eine separate Kategorie für sich ist, obwohl es definitiv mehr einer interpretierten als einer kompilierten Sprache ähnelt. Noch wichtiger ist, dass es so ziemlich nur zwei große verwaltete Systeme gibt, die JVM und die CLR, und wenn Sie "verwaltet" sagen, ist dies ausreichend explizit.
Automatisches Ein- und Auspacken ist das einzige, was ich kenne. Die Generika lösen einige Probleme, aber bei weitem nicht viele.
Ihre Generika sind sehr, sehr schwach. Die Generika von C # sind erheblich stärker - obwohl es sich natürlich auch nicht um Vorlagen handelt. 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, die sie benötigen.
quelle
Ich beginne mit der Maßgabe, dass es für niemanden möglich ist, eine wirklich neutrale Meinung zu Programmiersprachen zu äußern. Wenn Sie zwei Sprachen gut genug beherrschen, 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 mit C ++ oder Java erreichen, hängt im Allgemeinen weniger von der Sprache oder ihrer Implementierung ab als von den Fähigkeiten der Programmierer, die sie verwenden. Letztlich wahrscheinlich C ++ kann als nicht für Geschwindigkeit häufiger gewinnen, aber die Unterschiede im Code Sie schreiben , was wirklich wichtig ist .
1b. Ja möglicherweise. Gleichzeitig ist C ++ bereits gut etabliert, und ich bezweifle, dass die meisten Spielestudios genug Vorteile sehen, um sich die Mühe zu machen, 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 (zum Beispiel) viel "freien" Speicher zur Verfügung zu haben.
2. Langsame Ausführung und langsame Speicherbereinigung wären wahrscheinlich die zwei offensichtlichsten. Die frühe Fensterbibliothek (AWT) war ziemlich ungeschickt - Swing war eine wesentliche Verbesserung.
3. Ausführlichkeit. Fehlende Überlastung des Bedieners. Verwendung der Müllabfuhr. Fehlende Mehrfachvererbung. Java Generics sind im Vergleich zu C ++ - Vorlagen extrem eingeschränkt.
Ich sollte hinzufügen, dass einige (alle?) Dieser Nachteile (insbesondere die Verwendung von Garbage Collection, aber auch die anderen) von vielen als Vorteile von Java angesehen werden. Die einzig mögliche Ausnahme wäre die Ausführlichkeit. Die Ausführlichkeits-Situation verbessert sich langsam ein wenig, aber Sie werden sicher nicht oft Java-Gewinn-Code-Golfwettbewerbe sehen, und in gewöhnlichem Code wird auch ziemlich viel Code verwendet. Ich vermute, dass es zumindest einige gibt, die es als lesbarer und verständlicher ansehen, so dass es wahrscheinlich auch als Vorteil angesehen werden kann.
quelle
quelle
Erstens ist mein C ++ in einem gewissen Kontext sehr verrostet, daher beziehen sich die meisten meiner Erfahrungen mit Java auf meine jüngeren Erfahrungen mit C #, das ohnehin ein viel besserer Vergleich von Äpfeln zu Äpfeln ist.
1. Geschwindigkeit
Ich denke, dies lässt sich am besten mit der SO-Frage beantworten. Warum hatte Java den Ruf, langsam zu sein? aber ich denke auch, dass diese ganze Frage von Jeff Atwoods Blog-Post Gorilla vs. Shark gefärbt ist . Vielen Dank an Péter & Christopher.
Das hängt von den Prioritäten der Entwickler und den Fähigkeiten der Entwickler ab. Außerdem ist es keine Entweder-Oder-Situation. Verschiedene Teile des Titels erfordern möglicherweise unterschiedliche Aspekte 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 sind, wenn Sie Ihren Titel rechtzeitig für die Ferienzeit veröffentlichen möchten (zum Beispiel). .
Sie können schlecht funktionierenden Code in jeder Sprache schreiben, aber einige Sprachen erleichtern es, gute Entscheidungen zu treffen, während andere sich eher von Ihrem eigenen Petarden hochziehen lassen . Java fällt in die erstere Kategorie, C ++ definitiv in die letztere.
Mit großer Kraft geht eine große Verantwortung einher, wie sie sagen (ganz zu schweigen von der Fähigkeit, Ihren Haufen komplett zu vermasseln * 8 ').
2. Wird Java jetzt als kompilierte oder interpretierte Sprache betrachtet?
Ich kann nicht sagen , was die meisten Leute betrachten es zu sein, aber viele Leute kennen den Unterschied zwischen kompilierten und interpretierten Sprachen und war nicht für die letzten 20 Jahre in einer Höhle lebt, würde auch wissen , dass der JIT - Compiler ( Just-in -Time ) Compiler ist ein wichtiger Teil des Java-Ökosystems, daher wird es heutzutage wahrscheinlich eher als kompiliert betrachtet.
3. Was sind einige Hauptmängel von Java, die seit den Anfängen behoben wurden?
Ich bin ein relativ neuer Java-Konverter, daher habe ich wenig Kontext, wie es sich entwickelt hat. Es ist jedoch interessant festzustellen, dass es Bücher wie Java gibt: Die Guten Teile, die versuchen, die Menschen in die Richtung der Teile der Sprache zu lenken, die heutzutage bevorzugt werden sollten, und die Menschen von den Gebieten wegzulenken, die sind oder sein sollten. veraltet.
4. Was sind einige der Hauptmängel von Java, die noch behoben werden müssen?
Ein Problem bei Java war meiner Meinung nach die langsame Einführung neuer Funktionen.
Nachdem ich von C # nach Java gekommen bin und die Wikipedia-Vergleichsseite durchgesehen habe, fallen mir folgende Dinge auf:
Dinge, die ich in Java vermisse, im Vergleich zu C #
Verschlüsse / Lambdas . Ich war wirklich enttäuscht, als ich hörte, dass die Java-Unterstützung wieder zurückgedrängt wurde .Schließlich haben wir Closures / lambdas in Java 8, aber die Zeit, die es dauerte, bestätigt meine Aussage über langsame Übernahme.var
) mag wie syntaktischer Zucker erscheinen, aber wenn Sie komplexe generische Typen haben, kann dies den Code viel klarer machen, indem viele wertlose Duplikate entfernt werden.struct
über einer vollständigen Klasse.Dinge, die ich in Java nicht vermisse, verglichen mit C #
unsafe
Code. Damit muss man so vorsichtig sein, dass ich es selten als einen zusätzlichen Aufwand wert empfunden habe.Selbst wenn man Äpfel mit Äpfeln vergleicht, gilt Java als zurückgeblieben.
Die anderen beiden großen Probleme, die ich bei Java sehe, sind die ungeheure Startverzögerung und die Tatsache, dass Sie (für einige JVMs) Ihren Heap und sogar den permanenten Generationsheap mikroverwalten müssen . Mit C # -Anwendungen wurde immer sofort gestartet, und ich musste nicht einmal über Heap nachdenken, da es aus dem Systemspeicherpool und nicht aus einem der virtuellen Maschine zugewiesenen vorab zugewiesenen Pool zugewiesen wurde.
quelle
Ich kann Ihnen eine Quelle nennen, die Ihnen dabei helfen kann, den ersten Teil Ihrer Frage zu beantworten. Programmiersprachen finden Sie unter http://shootout.alioth.debian.org/u64q/which-programming-languages-are-fastest.php. Hier können Sie sehen, wie schnell Sprachen miteinander verglichen werden. Sie können sogar nach verschiedenen Kategorien gefiltert werden, um festzustellen, in welchen Bereichen Sprachen besser sind als in anderen. Java ist viel schneller als vor einigen Jahren.
quelle
1) Wenn ich nur über das UX spreche, das ich mit Java bekomme, fühlt es sich langsam an. Ich kann dir nicht wirklich sagen warum. Ich habe noch keine Java-basierte Desktop-Anwendung gefunden, die sich nicht langsam anfühlt und eine schnellere Alternative ohne Java bietet. Davon abgesehen kann Java in reiner Rechengeschwindigkeit sehr schnell sein, und das Internet ist voll von Benchmarks, um dies zu beweisen. Die Startzeit von Java-Apps und die Reaktionsfähigkeit ihrer GUIs müssen IMHO jedoch noch verbessert werden. Vielleicht könntest du es schaffen;)
Letztendlich ist Geschwindigkeit kein so großes Problem. Die Hardware wird nicht nur immer schneller, sondern die meisten Menschen interessieren sich auch immer noch erstaunlich wenig dafür, solange die Software dies tut, was sie tun sollte und das Verhältnis zwischen der für die Interaktion aufgewendeten Zeit und der für das Warten aufgewendeten Zeit angemessen ist.
2) Diese Unterscheidung ist in letzter Zeit so unscharf geworden, dass es wirklich wenig Wert hat.
3 + 4) Es gab tatsächlich einige Änderungen an Java. Einige Leute argumentieren bereits, dass diese Änderungen Javas rein simplistische Philosophie verdorben haben, indem sie fremde Merkmale aufgegriffen haben. Es ist wirklich schwer objektiv zu sagen, was ein Mangel ist und was eine Stärke ist. Java ist für mich unnötig ausführlich, einschränkend und von unzureichender Funktionalität, während andere Leute genau diese Merkmale als angenehme Eindeutigkeit, Sicherheit und Klarheit betrachten.
Während es diese Dinge sind, die mich persönlich dazu bringen, Java nicht zu verwenden, halte ich es nicht für eine gute Idee, die Dinge, die ich in Java vermisse, einfach hinzuzufügen. Es gibt eine Menge Sprachen, die ich gerne in der JVM laufen lasse, und Java näher an sie heranzuführen würde nur Javas Zweck zunichte machen.
Es ist eine Frage der Präferenz
Die Sache mit Java ist, dass es entworfen ist, um Sie davon abzuhalten, sich in den Fuß zu schießen. Eine edle Sache, aber mit all den Einschränkungen, die sie für Sie mit sich bringt, ist es nicht unwahrscheinlich, dass Sie über einen Ihrer sicheren Füße stolpern, sich zu Ihrer eigenen Sicherheit nicht daran festhalten können, dass Ihre Hände hinter Ihrem Rücken gefesselt sind und schließlich sterben. weil du dir den Schädel brechst. : D
In gewisser Weise war Java eine Antwort auf C ++, mit der Sie nicht nur sich selbst, sondern auch den Rest der Welt aufhängen können. Es ist alles dieses Seil, das es für Cowboys so attraktiv macht. All diese Freiheit und all diese Kraft.
Einfach gesagt, das ist wirklich nur eine Frage der Präferenz.
Aber ein Punkt ist, 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, richtig durchzudrehen und Ihre Kollegen zu verwirren:
Java hat sich aus diesem Grund entschieden, keine Operatorüberladung anzubieten. Dies verhindert natürlich, dass Benutzer ihren Code verschleiern, indem sie Funktionszeiger mit Listen multiplizieren. Gleichzeitig wird jedoch verhindert, dass andere Personen mit den üblichen Operatoren geometrische / algebraische Berechnungen durchführen können.
(v1 * v2 / scale) + (v3 * m)
ist wirklich viel klarer alsv1.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 entschied sich für die Garbage Collection, während Sie in C ++ wählen können. Sie können wirklich den ganzen Weg nach unten graben und sich der Hardware nähern. Sie können Daten dicht in Strukturen packen. Sie können dunkle Magie anwenden, z. B. die schnelle Quadratwurzel . Mithilfe von Vorlagen können Sie einige der kompliziertesten und kryptischsten Metaprogramme der Welt ausführen. Es bedeutet aber auch, dass Sie sich verirren und Stunden damit verbringen können, all das Chaos, das Sie erstellt haben, zu debuggen 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, schrittweise voranzukommen.
Obwohl Sie technisch gesehen nicht daran gehindert sind, hochmoderne Software mit Java zu schreiben, werden Sie feststellen, dass viele Entwickler eine große Leidenschaft dafür haben, großartige Software zu schreiben, Spaß zu haben und sich weiterzuentwickeln, und dabei über das hinausgehen, was Java als Sprache zu bieten hat.
Aber die Welt besteht nicht nur aus Menschen, die das nächste große Ding erschaffen , oder nur aus Menschen, die die Nutzung der ihnen übertragenen Macht nur so weit einschränken, wie sie sie kontrollieren. IMHO Java ist die perfekte Ergänzung für Menschen, die auf komfortable Weise stabile Ergebnisse erzielen möchten.
quelle
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 Heapspeichers) und erstellt eine umfangreiche Sammlung. Dies ist in Ordnung, wenn Sie keine zeitlichen Einschränkungen haben, aber wenn Verspätung ein Versagen 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 heutzutage wahrscheinlich schnell genug für die meisten Dinge. Und wenn Sie Monate damit verbringen, Ihre GC-Einstellungen und so weiter zu ändern, können Sie es möglicherweise so lange zum Laufen bringen, bis der Kunde Ihnen einen Scheck aushändigt.
quelle
3) Behobene Mängel.
Vor ein paar Jahren war Java sehr wütend. Die meisten Java-Programmierer sind Web- / Server-Programmierer und waren verrückt nach der Ausführlichkeit von Java. So wurden einige Sprachen wie Ruby populär und Java begann zu schwinden. Mit den neuen Annotationen und Frameworks wie Hibernate und Spring haben die Leute jedoch aufgehört, sich zu beschweren, und sind zurück zu Java gegangen.
4) Derzeitige Mängel
Die Hardware wird alle Multicore. Obwohl Java Multithreading ausführen kann, basiert es auf C, einer sequentiellen Sprache, und die Funktionalität für das Multithreading ist, gelinde gesagt, nicht elegant. Übrigens, das ist nicht nur eine Kritik an Java, sondern an so ziemlich allen Sprachen. Eine völlig andere Art, über Code nachzudenken, ist erforderlich. Vielleicht ist funktionale Programmierung der Weg der Zukunft.
quelle
Ich habe irgendwie auf diese Frage reagiert, weil sie irreführende und weitgehend irrelevante Antworten geben wird:
Jeder kann zustimmen, dass es schwierig wäre, AAA-Titel mit Java zu produzieren, und dass es keine konkreten Beispiele gibt, die mir bekannt sind. In Anbetracht der Natur von AAA, die eine Menge Dinge voraussetzen würde (da es sich wirklich um einen verwirrenden Begriff handelt, der aus dem Marketing stammt), ist es besser, stattdessen Folgendes zu fragen:
Die Antwort lautet " Ja, das können Sie. ". Der eigentliche Erfolgsteil der Gleichung basiert jedoch mehr auf Ihrer Beharrlichkeit und Ihrem Glück (oder der Einhaltung des Zeitgeists), liegt jedoch außerhalb des Rahmens dieser Website.
quelle
Ein gewisser Geschwindigkeitsbereich hängt von Compiler gegen Compiler ab. Nicht Sprache gegen Sprache. Die JIT-Kompilierung kann Vorteile bringen, da sie für die Spezifikationen des Computers optimiert werden kann, auf dem sie ausgeführt wird. Vergleichen Sie JIT-kompiliertes C ++ mit Java, um einen besseren Vergleich der "Äpfel zu Äpfeln" -Compiler zu erhalten.
Aber es gibt einige Dinge, bei denen die Java-Sprache selbst die eigene Leistung einschränkt.
Zuordnung auf dem Stapel. Java kann das nicht. Für kleine Klassen mit fester Größe in einer nicht rekursiven Lösung ist dies häufig ideal. Sie können auch eine Heap-Fragmentierung vermeiden.
nicht virtuelle Funktionen. Java kann das nicht. Alle Methodenaufrufe erhalten einen permanenten Treffer, auch wenn nicht geplant ist, dass sie überschrieben werden.
Wahrscheinlich noch ein paar andere Sachen, aber das ist alles, was ich mir vorstellen kann.
quelle
1) irrelevant und argumentativ zu booten.
Es können nicht nur wichtige Software-Teile in Java erstellt werden, sondern solche Systeme werden täglich ausgeliefert und führen mittlerweile die meisten großen Unternehmen der Welt.
2) ebenso.
Lesen Sie die JVM-Spezifikation und Sie wissen. Java war nie eine interpretierte Sprache.
3) ebenso.
Lesen Sie die 15-jährigen Versionshinweise. Es ist uns unmöglich herauszufinden, welche "Hauptmängel" Ihrer Meinung nach behoben werden müssen.
4) ebenso.
Der Hauptfehler, der behoben werden muss, ist das JCP, das dazu neigt, sich mit der Kernsprache und den Bibliotheken einzumischen, und zwar aus keinem anderen offensichtlichen Grund, als den Namen eines Somoenes auf ein JSR zu setzen, damit es ein Buch mit dem Hinweis "Sie waren die" schreiben kann Führer der JSR-666 ". Hoffentlich wird die Umstrukturierung des JCP durch Oracle dafür sorgen.
Sie scheinen hier nur einen Sprachkrieg auslösen zu wollen und Ihre Vorurteile gegen Java von anderen bestätigen zu lassen, weil Sie selbst keine wirkliche Rechtfertigung dafür finden können.
quelle