Was ist der Unterschied zwischen "Schreiben einer spezifischen JRE für jede Plattform" für Java-Entwickler und "Schreiben eines C ++ - Compilers für jede Plattform" für C ++ - Entwickler?
Was ist der Unterschied zwischen "Schreiben einer spezifischen JRE für jede Plattform" für Java-Entwickler und "Schreiben eines C ++ - Compilers für jede Plattform" für C ++ - Entwickler?
Antworten:
Java wird einmal kompiliert und überall ausgeführt. C ++ wird irgendwo einmal kompiliert.
"Schreiben einer spezifischen JRE für jede Plattform" ist etwas, das Sie nicht jedes Mal tun. Sie müssen die JRE nur einmal auf eine neue Plattform portieren. Diese Aufgabe wird in der Regel vom Hauptbetreuer / den Entwicklern des Programms und / oder der Plattform ausgeführt. Bei der Entscheidung, wer und wie die JRE portiert werden soll, können viele Faktoren ins Spiel kommen. Unter anderem hängt es von der Lizenz ab, unter der es veröffentlicht wurde (ich habe gehört, Java ist Open Source, also kann es wohl jeder machen). Die witzige Anekdote, Steve Jobs, machte vor etwa einem Jahr eine große Sache, weil er sich nicht um die Portierung von Java auf Mac kümmern wollte .
Es geht nicht darum, wie oder wer die JRE portiert, sondern darum, dass nach der Portierung jede Java-Anwendung theoretisch problemlos auf der neuen Maschine ausgeführt werden sollte. In diesem Sinne bildet die JRE eine Abstraktionsschicht, die die Maschine vollständig verbirgt und eine einfache Portierung ermöglicht.
Die Realität sieht jedoch nicht immer so aus. Ich werde nicht so weit gehen, Portabilität als "Mythos" zu bezeichnen, aber es ist wahr, dass es nicht so perfekt ist. Beispielsweise hat Java ein Paket namens JNI
"Write Once Run Anywhere", mit dem native Aufrufe unter Umgehung der JRE gesendet werden können, wodurch die perfekte nahtlose Portabilität verhindert wird, die Java-Fans gerne als "Write Once Run Anywhere" bezeichnen.
Wie in den Kommentaren erwähnt, unterscheidet sich C ++ hinsichtlich der Portabilität. Einerseits ist es eine kompilierte Sprache, und diese Binärdateien sind fast immer plattformspezifisch. Daher werden ausführbare C ++ - Dateien (anders als Java) niemals portierbar sein. Andererseits kann es manchmal ausreichen, den Compiler zu portieren. Die Community hat festgestellt, dass durch Portierung des Compilers sowie einiger Kernbibliotheken der Sprache Quellcodes (und nicht Binärdateien) portierbar sein könnten.
C ++ wird jedoch häufig in kritischen Systemen wie Compilern, Kerneln, Echtzeitsystemen, eingebetteten Systemen usw. verwendet. Ein Aspekt von C ++ auf "niedriger Ebene" ist nicht zu übersehen, wenn es um Portabilität geht.
Es ist nicht nur die Sprache - es sind die Bibliotheken.
Sowohl Java als auch C ++ bieten plattformübergreifende Bibliotheken. Java bietet eine reichhaltigere Auswahl.
Der Unterschied besteht darin, dass Java auf jeder Plattform ausgeführt werden kann, ohne dass eine Neukompilierung erforderlich ist. Einen C ++ - Compiler für jede Plattform zu haben, ist überhaupt nicht dasselbe.
Alle Antworten, die mit "Der Unterschied ist ..." oder etwas sehr Ähnlichem beginnen, sind grundsätzlich falsch (Entschuldigung, aber so ist das Leben). Es gibt wirklich zwei getrennte Unterschiede zwischen den beiden.
Eines (was schon oft erwähnt wurde) ist, dass ein kompiliertes Java-Programm auf jeder kompatiblen Java-Implementierung ausgeführt werden kann (oder sollte), sodass Sie ein Java-Programm auch nach dem Kompilieren von einer Plattform auf eine andere verschieben können, ohne es erneut zu kompilieren . C ++ erfordert (zumindest normalerweise) eine Neukompilierung für jede Zielplattform.
Das andere ist, dass Java (zumindest Versuche) sicherstellt, dass alles korrekt geschriebene Java portierbar ist. Zumindest theoretisch sollten Sie keinen Code schreiben können, der nicht portierbar ist.
Mit C ++ können Sie einige Dinge tun, die nicht portabel sind. Der C ++ - Standard enthält "Warnungen" zu vielen Dingen, die nicht portierbar sind (z. B. zu dem Hinweis, dass Sie implementierungsdefiniertes oder undefiniertes Verhalten erhalten), aber er versucht nicht unbedingt, Sie davon abzuhalten, dies überhaupt zu tun . Wenn Sie beispielsweise ein Betriebssystem für Hardware schreiben möchten, die einen PCI-Bus verwendet, müssen Sie wahrscheinlich den PCI-Konfigurationsspeicher lesen / schreiben. Dies ist natürlich nicht auf Systeme ohne PCI-Bus übertragbar, aber wenn Sie ein Betriebssystem für Hardware mit einem PCI-Bus schreiben, ist dies ziemlich notwendig. C ++ erlaubt es, obwohl es offensichtlich nicht portabel ist.
Sie haben die Räumlichkeiten falsch verstanden. Java- Programme sind sehr portabel, da die JVM ein Standardverhalten bietet, das garantiert gleich ist. C ++ - Programme haben eine weniger standardisierte Umgebung, die näher an der tatsächlichen Hardware liegt. Daher muss das Programm in der Lage sein, die verschiedenen plattformspezifischen Details zu verarbeiten - wie Größe eines Int, Wortausrichtung usw. usw. usw.
Die JVM selbst ist nicht sehr portabel. Es ist eine Herkulesaufgabe, eine leistungsstarke JVM auf eine andere Plattform oder CPU-Architektur zu portieren.
Der Unterschied besteht darin, dass Java-Programme (kein Akronym) in einer Form verteilt werden können, die auf jedem Computer mit installierter JVM ausgeführt werden kann. C ++ wird jedoch normalerweise entweder als Quellcode, der sehr benutzerfreundlich ist, oder als Bündel von Programmen verteilt von verschiedenen Binärdateien für verschiedene Plattformen.
Einer der Gründe, warum Java als portabel gilt, besteht darin, dass es spezifische Regeln für die Bewertung von arithmetischen Ausdrücken gibt und Implementierungen davon abhält, diese auf andere Weise zu bewerten, selbst wenn eine Bewertung in der vorgeschriebenen Weise einen langsameren Code erfordern würde als eine genauere Bewertung Mode.
Zum Beispiel gegeben
long thing1(int x) {
return (x+1)-1L;
}
double thing2(int x, float y) {
return x/y;
}
Die Werte von thing1(2147483647)
und thing2(1123456700,11234567.0f)
müssen -2147483649L bzw. 99.9999923706054688 sein, obwohl die arithmetisch korrekten Werte 2147483647L und 100.0 sind und obwohl auf einigen Plattformen der Code zum Generieren der numerisch falschen Ergebnisse langsamer als der Code zum Generieren der korrekten Werte ist Ergebnisse (auf einigen 64-Bit-Plattformen würde das Erzwingen des Umbruchverhaltens nach (x + 1) einen zusätzlichen Befehl erfordern, und auf der 8x87-Plattform würde das Erzwingen der Rundung des Werts von 1123456700 auf a float
einen zusätzlichen Befehl erfordern, verglichen mit dem einfachen Laden es direkt zu einem Register mit erweiterter Genauigkeit).
(int)
für den (x+1)
Unterausdruck des ersten Beispiels auf float
den x
Parameter des zweiten Beispiels einzuengen, aber natürlich habe ich die Sprache nicht entworfen .
Der Arbeitsaufwand für die Hilfsmittel ist in der Tat ähnlich, der Unterschied liegt woanders. Sobald ein C ++ - Programm für eine Plattform kompiliert wurde, müssen Sie es erneut kompilieren, wenn Sie es auf einer anderen Plattform verwenden möchten. Wenn ein Java-Programm kompiliert wurde, können Sie es auf eine andere Plattform mit einer Laufzeitumgebung verschieben, ohne es erneut kompilieren zu müssen.
Bei der Beantwortung des Titels "Ist Portabilität ein Mythos?" Anstelle von "Was ist besser an Portabilität, Java oder C ++?" Werde ich sagen, dass teilweise Portabilität möglich ist, aber vollständige Portabilität ist ein Mythos.
Ich bestehe darauf, zu schreiben, und das gilt auch für diese Frage: Entwickler arbeiten nicht mehr nur mit Programmiersprachen, sondern mit vollständigen Programmierframeworks.
Zu diesen Frameworks gehören Bibliotheken, Datenbanken und grafische Oberflächen.
Welche Programmiersprache oder welches Programmierframework ist portabler?
Nun, es kommt darauf an, welche App du verwendest. versucht zu erreichen.
Die Sache ist, dass "Sie" nicht die JRE schreiben, sondern den Java-Code, der auf einer JRE ausgeführt wird. „Sie“ schreiben Sie den C ++ Code, können Änderungen erfordern Sie , bevor es auf einer anderen Plattform kompilieren.
Viele Leute vergessen oder berücksichtigen die Realität von Java nicht, wenn sie sagen, dass "es 100% portabel ist" oder solche Ausdrücke.
So gut wie alle großen Unternehmen / Softwarehäuser hatten in der jüngeren Vergangenheit mindestens eine hausgemachte Java-Implementierung mit einer zugehörigen JRE und einige haben diese immer noch gepflegt. Microsoft, IBM und Apple hatten beispielsweise alle ihre eigene Java-Version, die ihre eigene Version widerspiegelte Eigene Ideen und Überlegungen, wohin die Branche und solche Sprache gehen soll.
Wie ist das für "tragbar"? Ein JRE, wo immer Sie abbiegen.
Dabei spielt es keine Rolle, was Sun / Oracle getan hat.
Ein Beispiel dafür, warum Java-Code in Bezug auf die Portabilität nicht wirklich weit von C und C ++ entfernt ist, sind die GUIs und die Grafikserver. Apple hatte eine nicht standardisierte Implementierung des GUI-Frameworks für sein eigenes JRE. Infolgedessen gab es viele Kopfzerbrechen und Doppelarbeit für alle, die eine GUI mit Java für Apple-Maschinen erstellen / portieren wollten und im Grunde gezwungen waren, mit Quarz umzugehen (wie ist das in Bezug auf "Hebel" und Hochsprachen?).
Manchmal spiegeln sogar die am häufigsten verwendeten Wörter nicht wirklich die Bedeutung wider, die die Leute ihnen normalerweise geben. Für mich ist der Begriff "Portabilität" in der Java-Welt eher wie "Ausblick" im gesunden Menschenverstand. In wirtschaftlicher und finanzieller Hinsicht gibt es einen besseren Ausblick für Sie, wenn Sie Java anstelle anderer Sprachen einsetzen (zumindest zu dem Zeitpunkt, als Java geboren wurde), weil Sie bereits eine Menge Arbeit auf einer Seite erledigt haben (Sie erhalten eine JRE für alles Das kann als "Computer" bezeichnet werden. Ihre Codebasis ist wahrscheinlich portabel. Sie benötigen weniger Ressourcen, um Ihr Programm zu portieren. Es spielt keine Rolle, ob es sich um Geld, Zeit oder Arbeitskräfte handelt. Es ist eine geringere Schwelle im Vergleich zu anderen Technologien und das ist, wofür Java ist, es senkt diese Schwelle.
Dies gilt natürlich, wenn Sie die Voraussetzungen von Java akzeptieren, dh eine virtuelle Maschine mit Garbage Collection, die im Vergleich zu Muttersprachen mehr Ressourcen verbraucht, wenn Sie wirklich das Maximum aus Ihrer CPU oder Serverfarm herausholen möchten Denken Sie nicht, dass Sie Java einsetzen können, es sei denn, Sie haben nur wenig Ressourcen oder Ihr Unternehmen ist wirklich klein.
Ich muss immer noch eine einzige nicht-triviale Java-Anwendung finden, die nur eine Version für jede Code- oder Funktionszeile enthält (auch bekannt als ohne plattformspezifische Komponenten) und die zu 100% auf alle wichtigen JREs portierbar ist.