Ich habe gerade angefangen, Java zu lernen und bin verwirrt über das Thema Plattformunabhängigkeit.
Bedeutet "unabhängig" nicht, dass Java-Code auf jedem Computer ausgeführt werden sollte und keine spezielle Software installiert werden muss? Die JVM muss jedoch in der Maschine vorhanden sein.
Zum Beispiel benötigen wir den Turbo C Compiler, um C / C ++ - Quellcode zu kompilieren und dann auszuführen. Die Maschine muss den C-Compiler haben.
Könnte jemand bitte, was gemeint ist, wenn Java als "plattformunabhängig" beschrieben wird?
java
cross-platform
Gelassenheit
quelle
quelle
.exe
Datei. Es erfordert höchstens eine Laufzeitbibliothek (in einer.dll
Datei), nicht den gesamten CompilerAntworten:
In der Regel ist der kompilierte Code genau der Befehlssatz, den die CPU benötigt, um das Programm "auszuführen". In Java ist der kompilierte Code ein exakter Befehlssatz für eine "virtuelle CPU", die auf jeder physischen Maschine gleich funktionieren muss.
In gewisser Weise entschieden die Designer der Java-Sprache, dass die Sprache und der kompilierte Code plattformunabhängig sein sollten. Da der Code jedoch letztendlich auf einer physischen Plattform ausgeführt werden muss, entschieden sie sich dafür, den gesamten plattformabhängigen Code einzufügen die JVM.
Diese Anforderung für eine JVM steht im Gegensatz zu Ihrem Turbo C-Beispiel. Mit Turbo C erzeugt der Compiler plattformabhängigen Code, und es ist keine JVM erforderlich, da das kompilierte Turbo C-Programm direkt von der CPU ausgeführt werden kann.
Mit Java führt die CPU die plattformabhängige JVM aus. Diese ausgeführte JVM führt dann den plattformunabhängigen Java-Bytecode aus, vorausgesetzt, Sie verfügen über eine JVM, auf der sie ausgeführt werden kann. Sie könnten sagen, dass Sie beim Schreiben von Java-Code nicht programmieren, dass der Code auf der physischen Maschine ausgeführt wird, sondern den Code, der auf der Java Virtual Machine ausgeführt werden soll.
Der einzige Weg, wie all dieser Java-Bytecode auf allen virtuellen Java-Maschinen funktioniert, besteht darin, dass ein ziemlich strenger Standard für die Funktionsweise von virtuellen Java-Maschinen geschrieben wurde. Dies bedeutet, dass unabhängig davon, welche physische Plattform Sie verwenden, der Teil, in dem der Java-Bytecode mit der JVM verbunden ist, garantiert nur in eine Richtung funktioniert. Da alle JVMs genau gleich funktionieren, funktioniert derselbe Code überall genau gleich, ohne neu kompiliert zu werden. Wenn Sie die Tests nicht bestehen können, um sicherzustellen, dass sie identisch sind, dürfen Sie Ihre virtuelle Maschine nicht als "Java Virtual Machine" bezeichnen.
Natürlich gibt es Möglichkeiten, die Portabilität eines Java-Programms zu beeinträchtigen. Sie könnten ein Programm schreiben, das nach Dateien sucht, die nur auf einem Betriebssystem gefunden werden (z. B. cmd.exe). Sie können JNI verwenden, mit dem Sie kompilierten C- oder C ++ - Code effektiv in eine Klasse einfügen können. Sie können Konventionen verwenden, die nur für ein bestimmtes Betriebssystem funktionieren (z. B. die Annahme, dass ":" Verzeichnisse trennt). Sie müssen Ihr Programm jedoch garantiert nie für einen anderen Computer neu kompilieren, es sei denn, Sie tun etwas ganz Besonderes (wie JNI).
quelle
Bevor Sie ins Detail gehen, müssen Sie zunächst verstehen, was Plattform bedeutet. Die Plattform besteht aus der Computerhardware (hauptsächlich Architektur des Mikroprozessors) und dem Betriebssystem. Plattform = Hardware + Betriebssystem
Alles, was plattformunabhängig ist, kann auf jedem Betriebssystem und jeder Hardware ausgeführt werden.
Java ist plattformunabhängig, sodass Java auf jedem Betriebssystem und jeder Hardware ausgeführt werden kann. Die Frage ist nun, wie es plattformunabhängig ist.
Dies liegt an der Magie des Byte-Codes, der vom Betriebssystem unabhängig ist. Wenn der Java-Compiler Code kompiliert, generiert er den Bytecode und nicht den nativen Code der Maschine (im Gegensatz zum C-Compiler). Dieser Bytecode benötigt nun einen Interpreter, um auf einem Computer ausgeführt zu werden. Dieser Interpreter ist JVM. JVM liest also diesen Bytecode (der maschinenunabhängig ist) und führt ihn aus. Unterschiedliche JVM wurden für unterschiedliche Betriebssysteme entwickelt und Bytecode kann auf unterschiedlichen Betriebssystemen ausgeführt werden.
Im Falle von C oder C ++ (Sprache, die nicht plattformunabhängig ist) generiert der Compiler die EXE-Datei, die vom Betriebssystem abhängig ist. Wenn wir diese EXE-Datei auf einem anderen Betriebssystem ausführen, wird sie nicht ausgeführt, da diese Datei vom Betriebssystem abhängig ist und daher nicht kompatibel ist das andere Betriebssystem.
Schließlich macht ein vom Betriebssystem unabhängiger Byte-Code die Java-Plattform unabhängig.
quelle
Dies bedeutet, dass der Java-Programmierer (theoretisch) keine Maschinen- oder Betriebssystemdetails kennen muss. Diese Details sind vorhanden und werden von der JVM und den Klassenbibliotheken verarbeitet. Im Gegensatz zu C können Java-Binärdateien (Bytecode) häufig auf völlig andere Systeme verschoben werden, ohne sie zu ändern oder neu zu kompilieren.
quelle
Nein, es ist umgekehrt. Weil Sie die virtuelle Maschine verwenden, wird das Java-Programm unabhängig.
Die virtuelle Maschine ist nicht unabhängig. Sie müssen eine installieren, die speziell für Ihren Systemtyp entwickelt wurde. Die virtuelle Maschine erstellt eine unabhängige Plattform über dem Betriebssystem.
quelle
Die JVM ist eine "simulierte Maschine", die auf verschiedenen Systemen installiert werden kann. Auf diese Weise kann derselbe Java-Code auf verschiedenen Systemen ausgeführt werden, da er auf der JVM und nicht auf dem Betriebssystem selbst basiert.
Das heißt, dies ermöglicht es dem Programmierer, mit dem virtuellen System (JVM) zu kommunizieren und dessen Funktionen anstelle der spezifischen Maschinen- und Betriebssystemfunktionen zu nutzen. Da Java nur auf JVM basiert, ist es plattformunabhängig (wenn auf der Plattform JVM installiert ist).
Kurz gesagt, Java ist als solches nicht plattformunabhängig, sondern erfordert eine JVM-Installation für alle Systeme, auf denen es ausgeführt werden soll. Es kann jedoch auf allen Systemen ausgeführt werden, auf denen die JVM installiert ist.
quelle
Java ist plattformunabhängig, da es über JVM (Java Virtual Machine) verfügt. Lassen Sie es uns anhand eines Beispiels aus dem wirklichen Leben veranschaulichen. Nehmen wir an, Sie sind für Ihre Familienmitglieder frei. Aber wieso?
Weil du sie gut kennst und sie dich auch kennen. Aber Sie sind nicht frei für meine Familienmitglieder. Weil du sie nicht kennst und sie dich auch nicht kennen. Aber wenn ich dein Freund bin und dich meinen Familienmitgliedern vorstellen kann, kannst du frei mit ihnen sprechen.
In ähnlicher Weise, wenn Sie ein Code sind und ich eine JVM bin. Außerdem ist Ihre Familie die Windows-Plattform und meine die Linux-Plattform. Wenn Sie ein C oder eine andere plattformabhängige Sprache waren, kennen Sie nur Ihre Familienmitglieder und umgekehrt. Deshalb kennt nur die Plattform, auf der Sie geschrieben wurden, diesen Code und wird ihn unterstützen. Aber wenn Sie ein JAVA-Code sind und wenn Sie zu meiner Familie kommen, nämlich. die Linux-Plattform und wenn Sie mich dort finden, JVM, dann kann ich Sie meiner Familie vorstellen, der Linux-Plattform, und Sie werden in der Lage sein, mit ihr zu interagieren.
Für plattformabhängige Sprachen steht ihnen kein Freund wie JVM zur Verfügung, um sich einer Plattformfamilie vorzustellen. So ist Java plattformunabhängig. :) :)
quelle
Die JVM abstrahiert von der konkreten Plattform. Ihr Programm basiert nur auf der JVM. Da die JVM für verschiedene Plattformen wie Windows und Linux verfügbar ist, ist Ihr Programm plattformunabhängig (aber von JVM abhängig).
quelle
In c / c ++ wird der Quellcode (c-Programmdatei) nach der Kompilierung mit einem Compiler direkt in nativen Maschinencode konvertiert (was für einen bestimmten Computer verständlich ist, auf dem Sie den Code kompilieren). Daher kann der kompilierte Code von c / c ++ nicht auf einem anderen Betriebssystem ausgeführt werden.
Aber im Fall von Java: Die Quelldatei von Java (.java) wird mit dem JAVAC-Compiler (in JDK vorhanden) kompiliert, der den Bytecode (.class-Datei) bereitstellt, der für jede auf einem Betriebssystem installierte JVM (Physical System) verständlich ist. .
Hier benötigen wir unterschiedliche JVM (die plattformabhängig ist) für verschiedene Betriebssysteme, auf denen wir den Code ausführen möchten, aber die .class-Datei (kompilierter Code / Zwischencode) bleibt gleich, da sie für jede installierte JVM verständlich ist auf jedem Betriebssystem.
In c / c ++: Nur der Quellcode ist maschinenunabhängig. In Java: Sowohl der Quellcode als auch der kompilierte Code sind plattformunabhängig.
Dies macht Java Platform (Maschine) unabhängig.
quelle
Java ist nicht plattformunabhängig, selbst ist eine Plattform, die auf dieser Plattform basiert. Java-Apps werden ausgeführt, aber die Java-Plattform selbst ist plattformabhängig
quelle
1:jvm
(dh Java Virtual Machine) ist eine Sammlung von Programmen, die viele Dateien enthält, die verschiedene Funktionsdateien bereitstellen, die in einem Ordner (dh Sammlungen von Programmen im mittleren Format) wie aufgerufen vorhanden sindpackages
.jvm
Es hilft, nicht überladen zu werden,o/s
wenn es hilft, nur die.class
Dateien oder Java-Anwendungen nur für sich selbst auszuführen. Es hilft, das Gleichheitsformat nach der Kompatibilität durch den Java-Compiler auf ein mittleres Format zu bringen und dann die Darstellung des Bytecodes (.class-Datei) bereitzustellen ist nicht spezifisch füro/s
undprocessor
.2: jvm macht den Bytecode zur
.exe
Datei, damit der Prozessor ihn verständlich macht, und zeigt die Speicherzuordnung für alle Funktionen an, nachdem der frm-Bytecode empfangen wurde.3: jvm gibt auch die Speicherzuordnung vom RAM frei, nachdem die Steuerung ihre Ausführung abgeschlossen hat.
quelle
JVM ist os-abhängig. für jedes os JVM anders.
".class" ist für alle JVMs gleich. Daher versteht jede JVM diese ".class" -Dateidaten.
Windows-abhängige JVM geben Windows-abhängige Anweisungen an Windows Linux-abhängige JVM geben Linux-abhängige Anweisungen an Linux.
das ist wie bei anderen Betriebssystemen. Java läuft also auf jedem Betriebssystem.
Deshalb ist Java unabhängig.
quelle
In einfachen Worten:
Die Programmiersprache Java ist plattformunabhängig.
JVM ist plattformabhängig
quelle
Java ist nicht plattformunabhängig, da es auf der JVM ausgeführt wird. Sie erhalten jedoch Plattformunabhängigkeit durch Programmierung auf einem einzelnen abstrakten Computer, der auf den meisten gängigen Betriebssystemplattformen (und einigen eingebetteten Appliances) konkrete Erkenntnisse aufweist.
Eine verwandte Idee ist die in vielen Betriebssystemen vorhandene Hardwareabstraktionsschicht, mit der dasselbe Betriebssystem auf unterschiedlicher Hardware ausgeführt werden kann.
In Ihrer ursprünglichen Frage entspricht Turbo C dem Javac-Programm, und die JVM ist das OS / HAL.
quelle
Mit Java können Sie Quellcode unter Windows kompilieren und der kompilierte Code (genauer gesagt Bytecode) kann auf jeder Plattform ausgeführt (interpretiert) werden, auf der eine JVM ausgeführt wird. Ja, Sie benötigen eine JVM, aber die JVM kann jeden kompilierten Code ausführen. Der kompilierte Code ist plattformunabhängig .
Mit anderen Worten, Sie haben sowohl die Portabilität des Quellcodes als auch die Portabilität des kompilierten Codes.
Die Maschine muss keinen C-Compiler haben, die Maschine muss eine plattformspezifische Binärdatei verwenden. Mit C oder C ++ ist der kompilierte Code für jede Architektur spezifisch und plattformunabhängig .
Mit anderen Worten, mit C / C ++ haben Sie die Portabilität des Quellcodes (mit etwas Disziplin), aber nicht die Portabilität des kompilierten Codes: Sie müssen für jede Architektur in plattformspezifische Binärdateien neu kompilieren.
quelle
JVM wird plattformabhängig sein.
Aber was auch immer es erzeugen wird, es wird plattformunabhängig sein. [was wir als Bytecode oder einfach als Klassendatei bezeichnet haben]. Aus diesem Grund wird Java als plattformunabhängig bezeichnet.
Sie können dieselbe Klassendatei auch auf einem Mac unter Windows ausführen, es ist jedoch JRE erforderlich.
quelle
Bytecode ist nicht plattenformunabhängig, sondern seine JVM, die Bytecode unabhängig macht. Bytecode ist nicht der Matchine-Code. Bytecodes sind kompakte numerische Codes, Konstanten und Referenzen (normalerweise numerische Adressen), die das Ergebnis der Analyse und semantischen Analyse von Dingen wie Typ, Umfang und Verschachtelungstiefe von Programmobjekten codieren. Sie ermöglichen daher eine viel bessere Leistung als die direkte Interpretation des Quellcodes. Der Bytecode muss vor der Ausführung interpretiert werden, was immer vom JVM-Interpreter durchgeführt wird.
quelle
Nur eine Randnotiz zur Diskussion über JVM und JIT Compilation. Dies ist das gleiche Prinzip wie bei C # und der CLR und zu einem gewissen Grad in Python. Wenn jemand sagt, dass der Code "direkt auf Hardware" ausgeführt wird, was tatsächlich in den bereits kompilierten Anweisungen zutrifft, kann er die Optimierung nutzen Auf der Maschine / CPU wird es ausgeführt. Selbst wenn die anfängliche Kompilierung eines Moduls ziemlich langsam ist, wird der ausgeführte Code beim nächsten Ausführen dieses Moduls mit nativer Geschwindigkeit ausgeführt und somit sozusagen direkt auf der Hardware ausgeführt.
quelle
Java ist in Bezug auf Java-Entwickler plattformunabhängig. Dies gilt jedoch nicht für Endbenutzer, die eine plattformabhängige JVM benötigen, um Java-Code ausführen zu können. Grundsätzlich wird beim Kompilieren von Java-Code ein Bytecode generiert, der normalerweise plattformunabhängig ist. Daher muss der Entwickler einen einzelnen Code für die gesamte Plattformserie schreiben. Dieser Vorteil bringt jedoch Kopfschmerzen für Endbenutzer mit sich, die JVM installieren müssen, um diesen kompilierten Code auszuführen. Diese JVM ist für jede Plattform unterschiedlich. Somit wird die Abhängigkeit nur für den Endbenutzer wirksam.
quelle
Javac - Compiler, der Quellcode in Bytecode konvertiert. JVM - Interpreter, der Bytecode in Maschinensprachencode konvertiert.
Wie wir wissen, ist Java eine kompilierte ** r & ** Interpreter- basierte Sprache. Sobald der Java-Code, auch als Quellcode bekannt, kompiliert wurde, wird er in nativen Code namens BYTE CODE konvertiert, der portabel ist und problemlos auf allen Betriebssystemen ausgeführt werden kann. Der generierte Bytecode wird grundsätzlich im Hexa-Dezimalformat dargestellt . Dieses Format ist auf jeder Plattform gleich, sei es Solaris Workstation oder Macintosh, Windows oder Linux. Nach der Kompilierung liest der Interpreter den generierten Bytecode und übersetzt ihn entsprechend dem Hostcomputer. . Bytecode wird von Java Virtual Machine interpretiert, die mit allen von uns installierten Betriebssystemen verfügbar ist. Um Java-Programme auf eine neue Plattform zu portieren, müssen lediglich der Interpreter und einige der Bibliotheksroutinen portiert werden.
Ich hoffe es hilft!!!
quelle
Wenn wir C-Quelldaten kompilieren, wird nativer Code generiert, der vom aktuellen Betriebssystem verstanden werden kann. Wenn wir diesen Quellcode auf das andere Betriebssystem verschieben, kann er vom Betriebssystem aufgrund des nativen Codes nicht verstanden werden. Dies bedeutet, dass die Darstellung von Betriebssystem zu Betriebssystem geändert wird. Daher sind C oder C ++ plattformabhängig.
Im Falle von Java erhalten wir nach der Kompilierung Bytecode anstelle von nativem Code. Wenn wir den Bytecode ausführen, wird er mit Hilfe von JVM in nativen Code konvertiert und dann ausgeführt.
Java ist also plattformunabhängig und C oder C ++ ist nicht plattformunabhängig.
quelle
Gute Frage, aber wenn der Quellcode von einem Compiler in nativen Zwischenbytecode geändert wird, in dem er das Programm in den Bytecode konvertiert, indem er die Fehler nach der gesamten Überprüfung auf einmal angibt (falls gefunden), und das Programm dann einen Interpreter benötigt, der würde das Programm Zeile für Zeile überprüfen und es direkt in Maschinencode oder Objektcode ändern, und jedes Betriebssystem kann aus Sicherheitsgründen standardmäßig keinen Java-Interpreter haben, sodass Sie um jeden Preis jvm benötigen, um es auf dieser anderen Betriebssystemplattform auszuführen Unabhängigkeit, wie Sie hier sagten, bedeutet, dass das Programm unter jedem Betriebssystem wie Unix, Mac, Linux, Windows usw. ausgeführt werden kann. Dies bedeutet jedoch nicht, dass jedes Betriebssystem die Codes ohne ein JVM ausführen kann, das Spezifikation, Implementierung, und Instanz,Wenn ich voranschreite, indem ich die Konfiguration Ihres PCs so ändere, dass Sie einen Klassenlader haben, der sogar den Bytecode öffnen kann, können Sie auch Java-Bytecode, Applets usw. ausführen - von nimish :) Viel Glück
quelle
Wie passiert das?
ByteCode
Antwort : JVM kann gemäß dem zugrunde liegenden Betriebssystem lesen und reagieren, da die JVM mit dem Betriebssystem synchronisiert ist.Wir brauchen also JVM mit Sync with Platform.
Die Hauptsache ist jedoch, dass der Programmierer keine spezifischen Kenntnisse der Plattform kennen und seine Anwendung unter Berücksichtigung einer bestimmten Plattform programmieren muss.
Diese Flexibilität des Schreibprogramms in Java --- Kompilieren
ByteCode
und Ausführen auf jedem Computer (Ja, für die Ausführung muss Platform DEPENDENT JVM erforderlich sein) macht Java Platform Independent.quelle
Wenn wir eine Java-Datei kompilieren, wird die .class-Datei dieses Programms generiert. Diese .class-Datei enthält den Bytecode. Dieser Bytecode ist plattformunabhängig. Der Bytecode kann auf jedem Betriebssystem mit einer virtuellen Java-Maschine ausgeführt werden. Plattformunabhängigkeit betrifft nicht nur das Betriebssystem, sondern auch die Hardware. Wenn Sie Ihre Java-Anwendung auf einem 16-Bit-Computer ausführen, den Sie auf einem 32-Bit-Computer erstellt haben, müssen Sie sich nicht um die Konvertierung der Datentypen gemäß dem Zielsystem kümmern. Sie können Ihre App auf jeder Architektur ausführen und erhalten in jeder Architektur das gleiche Ergebnis.
quelle
Edit: Nicht ganz. Siehe Kommentare unten.
Java läuft auf nichts direkt. Es muss von einer JVM in Bytecode konvertiert werden.
Da JVMs für alle wichtigen Plattformen vorhanden sind, ist Java durch die JVM plattformunabhängig.
quelle