Vergleich Javas und C ++

Das ist ein Vergleich der javanischen Programmiersprache mit dem C ++ Programmiersprache.

Designziele

Die Unterschiede zwischen dem C ++ und den javanischen Programmiersprachen können zu ihrem Erbe verfolgt werden, weil sie verschiedene Designabsichten haben.

  • C ++ wurde für die System- und Anwendungsprogrammierung entworfen, die C Programmiersprache erweiternd. In diese Verfahrensprogrammiersprache, die für die effiziente Ausführung, C ++ entworfen ist, hat Unterstützung für die statisch getippte objektorientierte Programmierung, das Ausnahme-Berühren, scoped Quellenmanagement und allgemeine Programmierung hinzugefügt, insbesondere. Es hat auch eine Standardbibliothek hinzugefügt, die allgemeine Behälter und Algorithmen einschließt.
  • Java wurde am Anfang als ein Dolmetscher geschaffen, um Systeme zu drucken, aber ist gewachsen, um Netzcomputerwissenschaft zu unterstützen. Sonne-Mikrosysteme haben es für die Basis ihres "HotJava" dünnen Kundensystems verwendet. Es verlässt sich auf eine virtuelle Maschine, um sicher und hoch tragbar zu sein. Es wird mit einer umfassenden Bibliothek gestopft, die entworfen ist, um eine ganze Abstraktion der zu Grunde liegenden Plattform zur Verfügung zu stellen. Java ist eine statisch getippte objektorientierte Sprache, die eine Syntax verwendet, die C ++ ähnlich ist, aber damit nicht vereinbar ist. Es wurde von Kratzer mit der Absicht entworfen, leicht zu sein, zu verwenden und zugänglich für ein breiteres Publikum.

Die verschiedenen Absichten in der Entwicklung von C ++ und Java sind auf verschiedene Grundsätze und Designumtausche zwischen den Sprachen hinausgelaufen.

Die Unterschiede sind wie folgt:

Spracheigenschaften

Syntax

  • Javanische Syntax hat eine Grammatik ohne Zusammenhänge, die durch einen einfachen LALR parser grammatisch analysiert werden kann. Syntaxanalyse C ++ ist mehr kompliziert. Zum Beispiel, ist eine Folge von Vergleichen, wenn Foo eine Variable ist, aber einen Gegenstand schafft, wenn Foo der Name einer Klassenschablone ist.
  • C ++ erlaubt Namespace-Niveau-Konstanten, Variablen und Funktionen. In Java müssen solche Entitäten einem gegebenen Typ gehören, und müssen deshalb innerhalb einer Typ-Definition, entweder eine Klasse oder eine Schnittstelle definiert werden.
  • In C ++ sind Gegenstände Werte, während in Java sie nicht sind. C ++ verwendet Wertsemantik standardmäßig, während Java immer Bezugssemantik verwendet. Um Bezugssemantik in C ++ zu erreichen, können entweder ein Zeigestock oder eine Verweisung verwendet werden.
  • In C ++ ist es möglich, einen Zeigestock zu einem const Typ zu erklären, um Kundencode davon abzuhalten, den Gegenstand zu modifizieren, der auf durch diesen Zeigestock angespitzt ist. Funktionen und Methoden können auch versichern, dass sie den Gegenstand nicht modifizieren werden, der auf durch einen Zeigestock angespitzt ist, indem er das "const" Schlüsselwort verwendet. Das macht Const-Genauigkeit geltend.
  • In Java wird Const-Genauigkeit durch die Semantik der Klasse beachtet, deren ein gegebener Gegenstand ein Beispiel ist. Kundencode wird gehindert, den inneren Staat eines Gegenstands zu ändern, wenn, und nur wenn jedes zugängliche Mitglied der Klasse etikettiert wird.
  • C ++ unterstützt Behauptungen; Java macht strukturierten Kontrollfluss geltend, und verlässt sich auf die Brechung, und setzen Sie Behauptungen fort, um einigen zur Verfügung zu stellen

</Code> goto </Code> artige Funktionalität. Einige commenters weisen darauf hin, dass diese etikettierten Fluss-Kontrollbehauptungen das einzelne Eigentum des Punkts des Ausgangs der strukturierten Programmierung brechen.

  • C ++ stellt auf niedriger Stufe Eigenschaften zur Verfügung, an denen Java Mangel hat. In C ++ können Zeigestöcke verwendet werden, um spezifische Speicherpositionen, eine Aufgabe zu manipulieren, die notwendig ist, um auf niedriger Stufe Betriebssystembestandteile zu schreiben. Ähnlich unterstützen viele C ++ Bearbeiter einen Reihenmonteur. In Java muss solcher Code in Außenbibliotheken wohnen, und kann nur durch die javanische Eingeborener-Schnittstelle mit einem bedeutenden oben für jeden Anruf zugegriffen werden.

Semantik

  • C ++ erlaubt Verzug-Werte für Argumente einer Funktion/Methode. Java tut nicht. Jedoch kann Methode-Überbelastung verwendet werden, um ähnliche Ergebnisse in Java zu erhalten.
  • Die minimale Kompilationseinheit in C ++ ist eine Funktion; die Kompilationseinheit in Java ist eine Klasse. In C ++ können Funktionen getrennt kompiliert werden.
  • C ++ erlaubt eine Reihe von impliziten Konvertierungen zwischen heimischen Typen, und erlaubt auch dem Programmierer, implizite Konvertierungen zu definieren, die benutzerbestimmte Typen einschließen. In Java sind nur sich erweiternde Konvertierungen zwischen heimischen Typen implizit; andere Konvertierungen verlangen ausführliche Wurf-Syntax.
  • Eine Folge davon ist dass, obwohl Schleife-Bedingungen (und die Ausgangsbedingung in) in Java und C ++ beide einen boolean Ausdruck, Code erwarten, der einen kompilieren Fehler in Java verursachen wird, weil es keine implizite schmäler werdende Konvertierung von der internen Nummer bis boolean gibt. Das ist handlich, wenn der Code ein Druckfehler dafür war. Und doch Strom C ++ erzeugen Bearbeiter gewöhnlich eine Warnung, wenn solch eine Anweisung innerhalb eines bedingten Ausdrucks durchgeführt wird.
  • Für vorübergehende Rahmen zu Funktionen, C ++ unterstützt sowohl Vorbeigehen-Verweisung als auch Vorbeigehen-Wert. In Java werden primitive Rahmen immer durch den Wert passiert. Klassentypen, Schnittstelle-Typen und Reihe-Typen werden Bezugstypen in Java insgesamt genannt, und Gegenstand-Verweisungen werden durch den Wert passiert.
  • Java eingebaute Typen ist einer angegebenen Größe und durch die Sprachspezifizierung definierter Reihe. In C ++ wird ein minimaler Wertbereich für eingebaute Typen definiert, aber die genaue Darstellung (Zahl von Bit) kann zu beliebigen heimischen Typen kartografisch dargestellt werden werden auf einer gegebenen Plattform unterstützt.
  • Zum Beispiel sind javanische Charaktere 16-Bit-Charaktere von Unicode, und Schnuren werden aus einer Folge solcher Charaktere zusammengesetzt. C ++ bietet sowohl schmale als auch breite Charaktere an, aber die wirkliche Größe von jedem ist Plattform-Abhängiger, wie die verwendete Codierung ist. Schnuren können von jedem Typ gebildet werden.
  • Das Runden und die Präzision von Schwimmpunkt-Werten und Operationen in C ++ sind Plattform-Abhängiger. Java stellt ein fakultatives strenges Schwimmpunkt-Modell zur Verfügung, das konsequente Ergebnisse über Plattformen, obwohl vielleicht auf Kosten des langsameren Zeitverhaltens versichert.
  • In C ++ können Zeigestöcke direkt als Speicheradresswerte manipuliert werden. Javanische Verweisungen sind Zeigestöcke, aber diese Verweisungen können sich nur auf Gegenstände und Reihe beziehen. Javanische Verweisungen erlauben direkten Zugang zu Speicheradressen nicht oder erlauben Speicheradressen, mit der Zeigestock-Arithmetik manipuliert zu werden. In C ++ kann man Zeigestöcke zu Zeigestöcken, Zeigestöcken zu ints bauen und verdoppelt sich, und Zeigestöcke zu willkürlichen Speicherpositionen. Javanische Verweisungen nur Zugriffsgegenstände und Reihe, nie Primitive, andere Verweisungen oder willkürliche Speicherpositionen.
  • In C ++ können Zeigestöcke zu Funktionen oder Methoden (Funktionszeigestöcke oder functors) hinweisen. Der gleichwertige Mechanismus in Java verwendet Gegenstand oder Schnittstelle-Verweisungen.
  • Durch den Gebrauch von Stapel-zugeteilten Gegenständen, C ++ unterstützt scoped Quellenmanagement, eine Technik, die verwendet ist, um Gedächtnis und andere Systemmittel automatisch zu führen, der deterministische Gegenstand-Zerstörung unterstützt. Und doch, scoped Quellenmanagement in C ++ kann nicht versichert werden; es ist nur ein Designmuster, und verlässt sich folglich auf die Anhänglichkeit von Programmierern. Java unterstützt automatisches Speichermanagement, das Müll-Sammlung verwendet, aber andere Systemmittel (Fenster, Nachrichtenhäfen, Fäden) müssen häufig ausführlich veröffentlicht werden, wenn der Müllmann nicht beschließen kann, dass sie nicht mehr verwendet werden.
  • C ++ zeigt Programmierer-definierten Maschinenbediener, der überlädt, der in Java nicht unterstützt wird. Die einzigen überlasteten Maschinenbediener in Java sind "" und "" Maschinenbediener, die Schnuren sowie leistende Hinzufügung verketten.
  • Java zeigt Standard-API-Unterstützung für das Nachdenken und dynamische Laden des willkürlichen neuen Codes.
  • C ++ unterstützt statische und dynamische Verbindung von Dualzahlen.
  • Java hat generics, dessen Hauptzweck ist, vor dem Typ sichere Behälter zur Verfügung zu stellen. C ++ hat Schablonen, die umfassendere Unterstützung für die allgemeine Programmierung zur Verfügung stellen.
  • Sowohl Java als auch C ++ unterscheiden zwischen heimischen Typen (diese sind auch bekannt als "grundsätzliche" oder "eingebaute" Typen), und benutzerbestimmte Typen (diese sind auch bekannt als "zusammengesetzte" Typen). In Java haben heimische Typen Wertsemantik nur, und zusammengesetzte Typen haben Bezugssemantik nur. In C ++ haben alle Typen Wertsemantik, aber eine Verweisung kann zu jedem Typ geschaffen werden, der dem Gegenstand erlauben wird, über die Bezugssemantik manipuliert zu werden.
  • C ++ unterstützt Mehrfachvererbung von willkürlichen Klassen. In Java kann eine Klasse auf nur eine Klasse zurückzuführen sein, aber eine Klasse kann vielfache Schnittstellen durchführen (mit anderen Worten, es unterstützt Mehrfachvererbung von Typen, aber nur einzelnes Erbe der Durchführung).
  • Java unterscheidet ausführlich zwischen Schnittstellen und Klassen. In C ++ machen Mehrfachvererbung und reine virtuelle Funktionen es möglich, Klassen zu definieren, die fast wie javanische Schnittstellen fungieren, tun mit einigen kleinen Unterschieden.
  • Java hat sowohl Sprache als auch Standardbibliotheksunterstützung für die Nebenläufigkeit. Das Schlüsselwort in Java stellt einfache und sichere Mutex-Schlösser zur Verfügung, um mehreingefädelte Anwendungen zu unterstützen. Java stellt auch robuste und komplizierte Bibliotheken für die fortgeschrittenere Nebenläufigkeitssynchronisation zur Verfügung. Nur bezüglich C ++ 11 ist dort ein definiertes Speichermodell für die Nebenläufigkeit in C ++. Es gibt auch Drittbibliotheken, um nach diesem Javas grob gleichwertige Unterstützung zur Verfügung zu stellen.
  • C ++ können Methoden als virtuelle Funktionen erklärt werden, was bedeutet, dass die Methode, genannt zu werden, durch den Laufzeittyp des Gegenstands bestimmt wird. Standardmäßig sind Methoden in C ++ nicht virtuell. In Java sind Methoden standardmäßig virtuell, aber können nichtvirtuell durch das Verwenden des Schlüsselwortes gemacht werden.
  • C ++ sind Enumerationen primitive Typen und unterstützen Konvertierung zu und Vergleich mit anderen Typen der ganzen Zahl. Javanische Enumerationen sind wirklich Beispiele einer Klasse (sie strecken sich aus

Quellenmanagement

  • Java bietet automatische Müll-Sammlung an. Das Speichermanagement in C ++ wird gewöhnlich durch Konstrukteure, destructors, und kluge Zeigestöcke getan. Der C ++ erlaubt Standard Müll-Sammlung, aber verlangt es nicht; Müll-Sammlung wird in der Praxis selten verwendet. Der erzwungene Gebrauch der automatischen Müll-Sammlung bedeutet, dass das Schreiben der Echtzeitsoftware in Java schwierig sein kann.
  • C ++ kann willkürliche Blöcke des Gedächtnisses zuteilen. Java teilt nur Gedächtnis durch den Gegenstand instantiation zu. (Bemerken Sie, dass in Java der Programmierer Zuteilung von willkürlichen Speicherblöcken vortäuschen kann, indem er eine Reihe von Bytes schafft. Und doch, javanische Reihe ist Gegenstände.)
  • Java und C ++ verwenden verschiedene Idiome für das Quellenmanagement. Java verlässt sich hauptsächlich auf die Müll-Sammlung, die nur Gedächtnis zurückfordern kann und ein letzter sein kann, hat nach anderen Mitteln geschossen, während sich C ++ hauptsächlich auf den RAII verlässt (Quellenerwerb Ist Initialisierung) Idiom. Das wird in mehreren Unterschieden zwischen den zwei Sprachen widerspiegelt:
  • In C ++ ist es üblich, Gegenstände von zusammengesetzten Typen als lokale Stapel-gebundene Variablen zuzuteilen, die zerstört werden, wenn sie aus dem Spielraum gehen. In Java werden zusammengesetzte Typen immer auf dem Haufen zugeteilt und vom Müllmann gesammelt (außer in virtuellen Maschinen, die Flucht-Analyse verwenden, um Haufen-Zuteilungen umzuwandeln, um Zuteilungen aufzuschobern).
  • C ++ hat destructors, während Java finalizers hat. Beide werden vor einem deallocation eines Gegenstands angerufen, aber sie unterscheiden sich bedeutsam. Ein C ++ der destructor des Gegenstands muss implizit (im Fall von Stapel-gebundenen Variablen) oder ausführlich angerufen zu deallocate der Gegenstand sein. Der destructor führt gleichzeitig gerade vor dem Punkt im Programm durch, an dem der Gegenstand deallocated ist. Gleichzeitige, koordinierte Uninitialisierung und deallocation in C ++ befriedigen so das RAII Idiom. In Java wird Gegenstand deallocation vom Müllmann implizit behandelt. Ein javanischer Gegenstand-finalizer wird asynchron eine Zeit angerufen, nachdem darauf zum letzten Mal zugegriffen worden ist, und bevor es wirklich deallocated ist, der nie geschehen kann. Sehr wenige Gegenstände verlangen finalizers; ein finalizer ist nur durch Gegenstände erforderlich, die versichern müssen, dass einige des Gegenstand-Staates vor deallocation - normalerweise Ausgabe von zum JVM äußerlichen Mitteln aufräumen. In Java muss sicherer gleichzeitiger deallocation von Mitteln ausführlich mit der Konstruktion des Versuchs/schließlich durchgeführt werden.
  • In C ++ ist es möglich, einen baumelnden Zeigestock - eine alte Verweisung auf einen Gegenstand zu haben, der bereits deallocated gewesen ist. Der Versuch, einen baumelnden Zeigestock zu verwenden, läuft normalerweise auf Programm-Misserfolg hinaus. In Java wird der Müllmann keinen Verweise angebrachten Gegenstand zerstören.
  • In C ++ ist es möglich, uninitialisierte primitive Gegenstände zu haben. Java macht Verzug-Initialisierung geltend.
  • In C ++ ist es möglich, einen zugeteilten Gegenstand zu haben, auf den es keine gültige Verweisung gibt. Solch ein unerreichbarer Gegenstand kann (deallocated) nicht zerstört werden, und läuft auf eine Speicherleckstelle hinaus. Im Gegensatz in Java wird ein Gegenstand nicht deallocated durch den Müllmann sein, bis es unerreichbar (durch das Benutzerprogramm) wird. (Bemerken Sie: Schwache Verweisungen werden unterstützt, die mit dem javanischen Müllmann arbeiten, um verschiedene Kräfte von reachability zu berücksichtigen.) Verhindert die Müll-Sammlung in Java viele Speicherleckstellen, aber Leckstellen sind noch unter einigen Verhältnissen möglich.

Bibliotheken

  • C ++ stellt Quer-Plattform-Zugang zu vielen in mit der Plattform spezifischen Bibliotheken normalerweise verfügbaren Eigenschaften zur Verfügung. Der direkte Zugang von Java zum heimischen Betriebssystem und den Hardware-Funktionen verlangt den Gebrauch der javanischen Eingeborener-Schnittstelle.

Durchlaufzeit

  • C ++ wird normalerweise direkt zum Maschinencode kompiliert, der dann direkt durch das Betriebssystem durchgeführt wird. Java wird normalerweise zum Byte-Code kompiliert, den das Java Virtuelle Maschine (JVM) dann entweder interpretiert oder JIT, kompiliert, um Code maschinell herzustellen, und führt dann durch.
  • Wegen seines zwanglosen Ausdrucksvollen niedrige Stufe C ++ können Spracheigenschaften (z.B ungehemmter Reihe-Zugang, rohe Zeigestöcke, das Typ-Witzeln) nicht während der Übersetzung oder ohne oben an der Durchlaufzeit zuverlässig überprüft werden. Zusammenhängende Programmierfehler können zu auf niedriger Stufe Pufferüberschwemmungen und Segmentationsschulden führen. Die Standardschablone-Bibliothek stellt Abstraktionen des höheren Niveaus (wie Vektor, Liste und Karte) zur Verfügung, um zu helfen, solche Fehler zu vermeiden. In Java können Fehler der niedrigen Stufe entweder nicht vorkommen oder werden durch den JVM entdeckt und zur Anwendung in der Form einer Ausnahme ausgegeben.
  • Die javanische Sprache verlangt spezifisches Verhalten im Fall von aus Reihe-Zugang, der allgemein Grenze-Überprüfung von Reihe-Zugängen verlangt. Das beseitigt eine mögliche Quelle der Instabilität, aber gewöhnlich, auf Kosten Ausführung zu verlangsamen. In einigen Fällen kann sich Bearbeiter-Analyse erweisen Grenzen überprüfen unnötig und beseitigen sie. C ++ hat kein erforderliches Verhalten für aus den Zugang der heimischen Reihe, so keine Grenze-Überprüfung für die heimische Reihe verlangend. C ++ Standardbibliothekssammlungen wie std:: Vektor, jedoch, Angebot fakultative Grenze-Überprüfung. In der Zusammenfassung ist javanische Reihe immer "sicher; streng beschränkt; haben Sie immer oben", während C ++ heimische Reihe "fakultativ oben haben; sind völlig zwanglos; sind potenziell unsicher."

Schablonen dagegen. Generics

Sowohl C ++ als auch Java stellen Möglichkeiten für die allgemeine Programmierung, Schablonen und generics beziehungsweise zur Verfügung. Obwohl sie geschaffen wurden, um ähnliche Arten von Problemen zu lösen, und ähnliche Syntax zu haben, sind sie wirklich ziemlich verschieden.

:

Verschieden

  • Java und C ++ verwenden verschiedene Techniken, um Code in vielfachen Quelldateien aufzuteilen. Java verwendet ein Paket-System, das den Dateinamen und Pfad für alle Programm-Definitionen diktiert. In Java importiert der Bearbeiter die rechtskräftigen Klassendateien. C ++ verwendet ein Kopfball-Dateiquellcodeeinschließungssystem, um Behauptungen zwischen Quelldateien zu teilen.
  • Kompilierte javanische Codedateien sind allgemein kleiner als Codedateien in C ++, weil Java bytecode gewöhnlich kompakter ist, als heimischer Maschinencode und javanische Programme nie statisch verbunden werden.
  • C ++ zeigt Kompilation eine zusätzliche Textaufbereitungsphase, während Java nicht tut. So fügen einige Benutzer eine Aufbereitungsphase zu ihrem hinzu, Prozess für die bessere Unterstützung der bedingten Kompilation gebaut.
  • Auf beiden Sprachen hat Reihe eine feste Größe. In Java ist Reihe erstklassige Gegenstände, während in C ++ sie bloß ein dauernder Lauf ihrer Grundgegenstände sind, die häufig auf das Verwenden eines Zeigestocks zu ihrem ersten Element und einer fakultativen Länge verwiesen sind. In Java sind Reihe-Gegenstände Grenze-kariert und enthalten Information über ihre eigene Länge, während in C ++ jede Subfolge als eine Reihe in seinem eigenen Recht behandelt werden kann. Sowohl C ++ als auch Java stellen Behälterklassen zur Verfügung (std:: Vektor und java.util. ArrayList beziehungsweise), die wiederbeträchtlich sind und ihre Größe versorgen.
  • Javas Abteilung und Modul-Maschinenbediener werden gut definiert, um zur Null zu stutzen. C ++ gibt nicht an, ob diese Maschinenbediener, die zur Null abgestutzt sind oder, "zu - Unendlichkeit stutzen".-3/2 wird immer-1 in Java sein, aber ein C ++ Bearbeiter kann entweder-1 oder-2, abhängig von der Plattform zurückkehren. C99 definiert Abteilung auf dieselbe Mode wie Java. Beide Sprachgarantie (wo a und b Typen der ganzen Zahl sind) das für den ganzen a und b (b! = 0). Der C ++ wird Version manchmal schneller sein, weil es erlaubt wird aufzupicken, welch auch immer Stutzungsweise zum Verarbeiter heimisch ist.
  • Die Größen von Typen der ganzen Zahl werden in Java definiert (interne Nummer ist 32 Bit, lange ist 64 Bit), während in C ++ die Größe von ganzen Zahlen und Zeigestöcken Bearbeiter und ABI Abhängiger innerhalb von gegebenen Einschränkungen ist. So kann sorgfältig geschriebener C ++ Code die Fähigkeiten des 64-Bit-Verarbeiters ausnutzen, während er noch richtig auf 32-Bit-Verarbeitern fungiert. Jedoch verlangt das Sorge und Anstrengung sicherzustellen, dass der C ++ Quellcode auf eine tragbare Weise geschrieben wird. Im Gegensatz bedeuten Javas feste Größen der ganzen Zahl, dass Programmierer-Fehler in dieser Beziehung nicht möglich ist, obwohl das eine Leistungsstrafe übernehmen kann, da javanischer Code das Verwenden einer Wortgröße eines willkürlichen Verarbeiters nicht führen kann.

Leistung

Zusätzlich zum Laufen eines kompilierten javanischen Programms müssen Computer, die javanische Anwendungen allgemein führen, auch das Java Virtuelle Maschine (JVM), während kompiliert, C ++ führen Programme können ohne Außenanwendungen geführt werden. Frühe Versionen Javas wurden um statisch kompilierte Sprachen wie C ++ bedeutsam überboten. Das ist, weil die Programm-Behauptungen dieser zwei nah zusammenhängenden Sprachen zu einigen Maschineninstruktionen mit C ++ kompilieren können, während sie in Mehrer-Byte-Codes kompilieren, die mehrere Maschineninstruktionen jeder, wenn interpretiert, durch einen JVM einschließen. Zum Beispiel:

Bestimmte Wirkungslosigkeit ist in die javanische Sprache selbst in erster Linie innewohnend:

  • Alle Gegenstände werden auf dem Haufen zugeteilt. Für Funktionen mit kleinen Gegenständen kann das auf Leistungsdegradierung als Stapel-Zuteilung, im Gegensatz, Kosten im Wesentlichen Null hinauslaufen. Jedoch ist dieser Vorteil obsoleted durch moderne JIT Bearbeiter, die Flucht-Analyse oder Flucht-Entdeckung verwerten, um Gegenstände auf dem Stapel zuzuteilen. Flucht-Analyse wurde im Orakel JDK 6 eingeführt.
  • Methoden sind standardmäßig virtuell. Das vergrößert ein bisschen Speichergebrauch durch das Hinzufügen eines einzelnen Zeigestocks zu einem virtuellen Tisch pro jeden Gegenstand. Es veranlasst auch eine Anlauf-Leistungsstrafe, da ein JIT Bearbeiter zusätzliche Optimierungspässe sogar für die De-Virtualisierung von kleinen Funktionen durchführen muss.
  • Viel, erforderliche sogar verwendende Standardbehälter zu werfen, veranlasst eine Leistungsstrafe. Jedoch werden die meisten dieser Würfe durch den JIT Bearbeiter statisch beseitigt, und die Würfe, die im Code gewöhnlich bleiben, kosten mehr als einen einzelnen Zentraleinheitszyklus auf modernen Verarbeitern dank der Zweigvorhersage nicht.
  • Reihe-Zugang muss sicher sein. Der Bearbeiter ist erforderlich, passende Reihe zu stellen, checkt den Code ein. Die naive Annäherung, jeden Reihe-Zugang mit einer Reihe-Kontrolle zu schützen, ist nicht effizient, so erzeugen die meisten JIT Bearbeiter Reihe-Kontrolle-Instruktionen nur, wenn sie nicht statisch beweisen können, dass der Reihe-Zugang sicher ist. Selbst wenn alle Laufzeitreihe-Kontrollen nicht statisch elidiert werden können, versuchen JIT Bearbeiter, sie aus inneren Schleifen zu bewegen, um die Leistungsdegradierung so niedrig zu machen, wie möglich.
  • Fehlen Sie vom Zugang zu auf niedriger Stufe Details hält den Entwickler davon ab, das Programm zu verbessern, wo der Bearbeiter unfähig ist, so zu tun. Programmierer können mit dem OS direkt verbinden, indem sie Code in C oder C ++ zur Verfügung stellen und diesen Code von Java mittels JNI nennen.

Im Gegensatz sind verschiedene Optimierungen in C ++ entweder zu schwierig oder unpraktisch, um durchzuführen:

  • Zeigestöcke machen Optimierung schwierig, da sie zu willkürlichen Daten hinweisen können. Jedoch in einigen Fällen ist das obsoleted, weil neue Bearbeiter eine strenge-aliasing Regel eingeführt haben und wegen der Unterstützung des C99 Schlüsselwortes einschränken.
  • Javanische Müll-Sammlung kann bessere Kohärenz des geheimen Lagers haben als der übliche Gebrauch von malloc/new für die Speicherzuteilung, weil seine Zuteilungen allgemein folgend gemacht werden. Dennoch bestehen Argumente, dass beide Verteiler ebenso den Haufen und keinen Ausstellungsstücke bessere Gegend des geheimen Lagers brechen.
  • Wegen des Mangels an der Müll-Sammlung in C ++ müssen Programmierer ihren eigenen Speicherverwaltungscode häufig in der Form bezugsaufgezählter kluger Zeigestöcke liefern.
  • Da der Code, der von verschiedenem concretisations derselben templated Klasse in C ++ erzeugt ist, nicht geteilt wird, kann der übermäßige Gebrauch von Schablonen zu bedeutender Zunahme der rechtskräftigen Codegröße führen.
  • Laufzeitkompilation kann an der Durchlaufzeit verfügbare Zusatzinformation potenziell verwenden, um Code effektiver wie der Verarbeiter zu verbessern, auf dem der Code durchgeführt wird. Jedoch wird dieser Anspruch veraltet als der grösste Teil modernsten C ++ effektiv erhoben Bearbeiter erzeugen vielfache Codepfade, um die vollen rechenbetonten geistigen Anlagen des gegebenen Systems zu verwenden
  • Laufzeitkompilation berücksichtigt aggressivere virtuelle Funktion inlining, als für einen statischen Bearbeiter möglich ist, weil der JIT Bearbeiter ganze Information über alle möglichen Ziele des virtuellen Anrufs hat, selbst wenn sie in verschiedenen dynamisch geladenen Modulen sind. Zurzeit verfügbare JVM Durchführungen haben kein Problem in inlining die meisten monomorphic, größtenteils monomorphic und dimorphe Anrufe, und Forschung ist im Gange zum Reihen-auch megamorphic Anrufe, dank des neuen rufen dynamische Erhöhungen an, die in Java 7 hinzugefügt sind. Inlining kann weitere Optimierungen wie Schleife vectorisation oder sich entfaltende Schleife berücksichtigen, auf eine riesige gesamte Leistungszunahme hinauslaufend.
  • Weil dynamische Verbindung durchgeführt wird, nach der Codegeneration und Optimierung in C ++ können Funktionsanrufe, die verschiedene dynamische Module abmessen, nicht inlined sein.
  • Weil Faden-Unterstützung von Bibliotheken in C ++, C ++ zur Verfügung gestellt wird, haben Bearbeiter keine Chance, Faden-zusammenhängende Optimierungen durchzuführen. In Java wird Faden-Synchronisation in die Sprache eingebaut, so kann der JIT Bearbeiter mit der Hilfe der Flucht-Analyse, leicht elidieren oder raue Schlösser, bedeutsam Leistung des Mehrgewindecodes verbessernd. Diese Technik wurde an der Sonne JDK 6 Aktualisierung 10 eingeführt und wird voreingenommene Blockierung genannt.

Offizieller Standard und Verweisung der Sprache

Sprachspezifizierung

Der C ++ wird Sprache durch ISO/IEC 14882, ein ISO Standard definiert, der durch den ISO/IEC JTC1/SC22/WG21 Komitee veröffentlicht wird. Die javanische Sprache wird durch die javanische Sprachspezifizierung, ein Buch definiert, das durch die Sonne (jetzt Orakel) veröffentlicht wird.

Die javanische Sprache entwickelt sich unaufhörlich durch einen Prozess genannt den javanischen Gemeinschaftsprozess, und die Programmiergemeinschaft in der Welt wird von einer Gruppe von Leuten und Organisationen - den javanischen Gemeinschaftsmitgliedern vertreten - der aktiv in die Erhöhung der Sprache, durch das Senden öffentlicher Bitten - der javanischen Spezifizierungsbitten beschäftigt ist - der formelle und öffentliche Rezensionen passieren muss, bevor sie in die Sprache integriert werden.

Im Gegensatz der C ++ hat programmierende Gemeinschaft diese Macht nicht, weil der C ++ Sprachspezifizierung durch ISO statisch definiert wurde.

Handelsmarken

"C ++" ist nicht eine Handelsmarke jeder Gesellschaft oder Organisation und ist von keiner Person im Besitz.

"Java" ist eine Handelsmarke von Sonne-Mikrosystemen (jetzt Orakel).

Außenverbindungen


Source is a modification of the Wikipedia article Comparison of Java and C++, licensed under CC-BY-SA. Full list of contributors here.
JSP / Kiefer (E-Mail-Kunde)
Impressum & Datenschutz