Eine moderne Rezension von Java [geschlossen]


58

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.

  1. 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)

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

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

  4. 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.



4
Ich mag die Tatsache, dass etwas, das 10 Jahre alt ist, nicht mehr modern ist.
Cwallenpoole

4
Java sieht viel anders , wenn man es als Rahmen / Plattform statt nur eine Sprache anzuzeigen. Möglicherweise ist das Problem, dass der Name im Wesentlichen "Java" für beide ist.
Joe Internet

1
Nur als Kontrastpunkt - Minecraft hat kürzlich 3 Millionen Verkäufe getätigt. Ich glaube nicht, dass Javas angebliche Mängel das Spiel so sehr beeinträchtigt haben, dass der Umsatz stark beeinträchtigt wird.
Michael K

3
Absolut jede Sprache ist "auf die eine oder andere Weise" unterlegen. Per Definition.
SK-logic

Antworten:


62

ein. Wie ist Javas Geschwindigkeit heute im Vergleich zu C ++?

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 # Dictionaryin (0,45 ms auf meinem Computer) im Vergleich zu einem Äquivalent ausgeführt werden kannstd::unordered_mapwas 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.

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

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.

c. In welchen Bereichen ist Java, wenn überhaupt, langsamer als C ++? (zB Zahlen, Grafiken oder einfach alles)

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.

Wird Java jetzt als kompilierte oder interpretierte Sprache betrachtet?

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.

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

Automatisches Ein- und Auspacken ist das einzige, was ich kenne. Die Generika lösen einige Probleme, aber bei weitem nicht viele.

Was sind einige der 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 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.


10
Sie scheinen einige Missverständnisse darüber zu haben, wie moderne JITs funktionieren. Ansonsten gute Informationen.
Sean McMillan

7
"Noch wichtiger ist, dass es so ziemlich nur zwei große verwaltete Systeme gibt, die JVM und die CLR" - ähm, Python? Rubin? Smalltalk? LISP ? Alle verwenden Garbage Collectors, es fehlt eine Zeigerarithmetik, und AFAIK verfügt über mindestens eine Implementierung, die auf Bytecode basiert.
Michael Borgwardt

3
@Michael: Als ich das letzte Mal nachgesehen habe, sind zumindest Python und Ruby ziemlich schwer in das "interpretierte" Lager gefallen. Die am häufigsten verwendeten Implementierungen kompilieren Bytecode weder in einer separaten Phase vor, noch enthalten sie JITs. Smalltalk oder LISP werden nicht verwendet, aber ich bin mir nicht sicher, ob ich sie in das "Major" -Camp stecken soll - und ich habe auch noch nie von einem Smalltalk oder LISP JIT gehört.
DeadMG

19
+1 nette Antwort. Endlich jemand, der versteht, warum Java immer langsamer ist als C ++.
Jeffythedragonslayer

2
Zeigen sich bei einem dieser Punkte Probleme mit der realen Leistung (accexdotal oder benchmarked)? Ist es für die meisten Benutzer erkennbar? Zu sagen, dass Sprache X 0,25% schneller ist als Sprache Y, bedeutet nicht, dass Sprache Y langsam ist. Sprechen Sie bei Videospielen überstrapazierte Konsolen oder gehören dazu auch PC-Spiele?
TheLQ

34

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.


12
Java-Generika sind nicht einmal mit C ++ - Vorlagen vergleichbar. Java-Templates sind syntaktische Zucker, die bei der Typprüfung zur Kompilierungszeit hilfreich sind. C ++ - Vorlagen sind ein Turing-vollständiges Codegenerierungssystem.
Kevin Cline

10
+1 für Ausführlichkeit. Es gibt es mit COBOL für langatmige, bedeutungslose Syntax. Mit all dem "try" "catch" und mit all dem extrem langen Objektnamen = new ExteremlyLongClassName () -Typcode kann es eine ziemliche Herausforderung sein, herauszufinden, was ein Teil des Codes tatsächlich zu tun versucht.
James Anderson

1
@Mark: Ich persönlich finde diese Antwort ein unlesbares Durcheinander und würde so etwas gerne nicht mehr sehen. Antworten sollten Antworten sein, keine Diskussionen.
Michael Borgwardt

2
+1 Für das Überladen des Bedieners sehen viele Leute einen kleinen Nachteil, für mich einen großen. Und natürlich Vorlagen, aber fast jeder betrachtet sie als wichtig.
Chris sagt Reinstate Monica

2
C ++ - Templates sollten nicht vollständig sein - das geschah aufgrund ihres Designs aus Versehen. Dennoch ist es gelegentlich nützlich: Suchen Sie nach der Metaprogrammierung für C ++ - Vorlagen.
Kommensturm

11
  1. In Bezug auf die Leistung;
    1. Bei der Ausführungsgeschwindigkeit von reinem Code entspricht Java in etwa unkompliziertem C ++. Java verwendet jedoch in der Regel viel mehr Speicher - teilweise, weil es GC-basiert ist, teilweise, weil beim Design mehr auf Einfachheit und Sicherheit als auf Effizienz geachtet wird. Aufgrund von Cache-Problemen führt mehr Arbeitsspeicher zu einer geringeren Geschwindigkeit. Im Vergleich zu hochoptimiertem C ++ viel niedriger.
    2. Wenn Sie davon ausgehen, dass ein AAA-Titel an der Grenze des Möglichen mit der aktuellen Hardware funktionieren muss, nein. Zumindest nicht auf der Client-Seite. Ich würde wetten, dass einige AAA-Titel Java bereits für Teile der Backend-Infrastruktur verwenden.
    3. Alles, wo Sie mit großen Datenmengen und C ++ arbeiten, kann optimiert werden, um auf Cache-freundliche Weise darauf zuzugreifen.
  2. Es wird zu Bytecode kompiliert und zur Laufzeit JIT-kompiliert. Compiled vs. Interpreted ist eine falsche, veraltete Zweiteilung.
  3. & 4. Es gibt zu viele Dinge, um sie alle aufzulisten, und bei den meisten wird es Meinungsverschiedenheiten geben.

3
Zu sagen, Java verbraucht viel Speicher, weil es GC-basiert ist, ist fast so, als würde man sagen, ein 18-Rad-Fahrzeug verbraucht viel Benzin, weil es 18 Räder hat. Ich weiß so gut wie nichts über Java, aber ich vermute, das Problem ist, dass die Laufzeit aufgebläht ist und zu viele Dinge zwischengespeichert werden, weniger wahrscheinlicher semantischer Müll und überhaupt kein Fehler im Garbage Collection-Ansatz.
Joey Adams

3
Auf der naheliegendsten Ebene bedeutet Garbage Collection, dass es eine Verzögerung zwischen dem Ausfall eines Objekts und der tatsächlichen Rückgewinnung des Speicherplatzes durch den Garbage Collector gibt. In einer manuell verwalteten Umgebung kann der Speicherplatz sofort freigegeben werden, wenn das Objekt nicht mehr verwendet wird. Die Verzögerung bedeutet, dass die Umgebung mit der Speicherbereinigung mehr Speicher benötigt. Und in der Regel ist die Leistung umso besser, je mehr Speicher verwendet werden kann, da dadurch der GC-Overhead verringert wird.
Michael Borgwardt

1
@MichaelBorgwardt Vielleicht möchten Sie erwähnen, dass die Geschwindigkeit Zeit benötigt, da die meisten JVMs jedes Mal von vorne beginnen müssen. Profilinformationen aus früheren Läufen werden nicht wiederverwendet.

11

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

ein. Wie ist Javas Geschwindigkeit heute im Vergleich zu C ++?

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.

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. 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). .

c. In welchen Bereichen ist Java, wenn überhaupt, langsamer als C ++? (zB Zahlen, Grafiken oder einfach alles)

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 #

  • Eigenschaften , insbesondere automatische Eigenschaften. Sie erleichtern das Erstellen und Verwalten von Schnittstellen erheblich .
  • 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.
  • Typinferenz ( 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.
  • Teilklassen helfen wirklich dabei, automatisch generierten Code (etwa von einem GUI-Builder) vom programmierergeschriebenen Code zu trennen.
  • Werttypen , manchmal gibt es ein Argument für die Verwendung eines Lightweight structüber einer vollständigen Klasse.
  • Erweiterungsmethoden können Systeme komplex machen, wenn sie zu häufig verwendet werden. Sie eignen sich jedoch hervorragend, um die kanonische Methode zum Implementieren von Elementen für eine Klasse anzugeben, wenn dies erforderlich ist.
  • Typen ohne Vorzeichen , manchmal kann dieses zusätzliche Bit den Unterschied ausmachen. * 8 ')

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

  • Das Überladen von Bedienern ist groß, 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 Bediener offensichtlich tun sollte und dem, was er tatsächlich tut, führen.
  • Nullable-Werttypen schienen immer mehr Probleme zu bereiten, als sie wert waren.
  • Zugriff auf unsafeCode. 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.


1
Diese SO-Frage, die Sie verlinkt haben, die akzeptierte Antwort ist unglaublich, komisch falsch.
DeadMG


@ Mark: Vielleicht. Andererseits ist es wahrscheinlich genauso gut, es vollständig fallen zu lassen. Ich habe bereits eine eigene Antwort auf die gleiche Frage erhalten, daher ist es unwahrscheinlich, dass durch Hinzufügen von Kommentaren wirklich viel neues Wissen hinzugefügt wird.
Jerry Coffin

8

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.



Ja, ich hätte wahrscheinlich direkt auf diese Seite verlinken sollen.
bschaffer13

4

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:

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

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 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 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.


+1 Weil in C ++ nichts Sie daran hindert, Java-ähnlichen Code zu schreiben, und auch nichts Sie daran hindert, mehr als das zu tun. Es ist der Programmierer, der eine Sprache unsicher oder schwierig macht.
Chris sagt Reinstate Monica

0

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.


Die meisten modernen Müllsammler halten die Welt nicht auf.

-1

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.


1
Verrückt werden? Kaum zu glauben. Und anscheinend haben Sie sich die gleichzeitigen

-1

Ich habe irgendwie auf diese Frage reagiert, weil sie irreführende und weitgehend irrelevante Antworten geben wird:

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

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:

Ist es möglich, mit Java einen modernen Titel mit angemessenem Erfolg zu erstellen?

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.


-6

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.

  1. 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.

  2. 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.


2
Moderne JIT-Compiler können beide Fälle optimieren. Java (ab 6) verfügt über eine Stapelzuordnung: en.wikipedia.org/wiki/Escape_analysis . Bei nicht virtuellen Funktionen löst der JIT-Compiler virtuelle Methodenaufrufe, die nur an ein Ziel gesendet werden (und manchmal sogar eingebunden werden können), in nicht virtuelle Aufrufe auf.
Steven Schlansker

1
# 2 ist falsch: Jede anständige JIT-Markierung funktioniert als virtuell oder nicht virtuell, je nachdem, ob sie gerade überschrieben wird.
Amara

-16

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.


Ah, ich sehe, dass die Leute die Kriege bereits beginnen, indem sie jemanden abstimmen, der nicht Java verschmachtet. Gut gemacht, Leute!
Jwenting

10
Ich denke, der Grund für die Ablehnung ist eher die Tatsache, dass Ihre Antwort nicht wirklich eine ist.
Blubb

6
Diese Antwort ist nur Trolling. Das OP hatte eine gute, gut durchdachte Frage, die keine Garantie war. Dann kommen Sie mit "Lassen Sie sich Ihr Vorurteil gegen Java von anderen bestätigen, weil Sie selbst keine wirkliche Rechtfertigung dafür finden". Ja, -1. Oh und nein, ich hasse Java nicht, es ist meine derzeitige Lieblingssprache für viele Dinge
TheLQ

4
Das OP schrieb eine ziemlich gut zusammengestellte Frage und erhielt gut formulierte Antworten. Es ist wirklich nicht nötig, ihn zu beschuldigen, irgendetwas aufgewühlt zu haben.
Adam Lear

Ah, ich sehe Leute, die bereits Kriege beginnen, indem sie ernsthafte Fragen (und Antworten) zum Schimpfen nehmen und sich persönlich angegriffen fühlen. Schade, dass ich noch nicht abstimmen kann.
Chris sagt Reinstate Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.