2016-04-16 14 views
0

Java wird oft als portabler bezeichnet als andere kompilierte Sprachen, da die ausführbare Datei auf jeder Plattform mit einer JVM ausgeführt werden kann. Aber in C geschriebener Code kann auf jeder Plattform mit einem C-Compiler ausgeführt werden.Warum wird eine interpretierte Sprache als tragbarer angesehen?

Also, naiv, gibt es zwei Alternativen: machen Sie viele verschiedene Compiler für viele verschiedene Plattformen und übertragen Quellcode über ein Netzwerk für sagen, ein Applet, das Client-Seite kompiliert wird; oder machen Sie viele verschiedene virtuelle Maschinen, um auf vielen verschiedenen Plattformen zu laufen und das gleiche, ausführbare Programm oder Applets über Netzwerke zu übertragen.

Warum ist letzteres besser? Ich kann sehen, wie eine serverseitige Kompilierung wünschenswert ist, aber ich glaube, da steckt mehr dahinter. Ich weiß, dass es für Sun Microsystems weniger Arbeit war, JVMs für viele Plattformen als Compiler für viele Plattformen zu erstellen, aber das war sicherlich nicht die Hauptmotivation.

+0

Ihre Frage ist etwas verwirrend. Ich kann immer ein Java-Programm schreiben, das unter Linux läuft und unter Windows überhaupt nicht läuft. Portabilität ist ein Artefakt eines Programms, vorausgesetzt, dass auf einer Zielplattform eine geeignete 'Laufzeit' (eine virtuelle Maschine oder ein einfacher alter Linker/Loader) existiert, nein? –

+0

Beide Pragmas (Kompilierung oder Runtime-Engines) haben ihren eigenen Vorteil. – jogo

Antwort

1

Aber in C geschriebener Code kann auf jeder Plattform mit einem C-Compiler ausgeführt werden.

Nicht auf die gleiche Weise. Sie müssen es entweder auf dem Computer mit diesem spezifischen Compiler kompilieren oder benötigen einen Compiler, der Cross-Compiling durchführen kann. In beiden Fällen haben Sie eine größere Arbeitsbelastung.

Noch gibt es einige C-Code, der ziemlich portabel ist. Ein einfaches Programm, das nur die Grundrechenarten berechnet, ist ziemlich portabel, sogar in C, wenn Sie es auf verschiedene Plattformen kompilieren wollen.

Der zweite wichtige Unterschied ist die Plattform. Sobald Sie I/O verwenden oder Syscalls verwenden, wird Ihr Code plattformspezifisch, nur weil Sie direkt mit dem Host-System kommunizieren müssen. Eine interpretierte Sprache bietet eine einheitliche Plattform. Wenn meine Programme auf der JVM ausgeführt werden, wird sie nur ausgeführt, unabhängig davon, welches System der Host für die JVM ist. Wenn ich "native" Aufrufe an das Host-Betriebssystem verwende, muss ich die richtigen für jedes Betriebssystem verwenden - aber mit Java ist mein "Betriebssystem" die JVM.

Übrigens gibt es so genannten "portablen" C/C++ Code, aber es hängt auch von ähnlichen Konzepten wie der JVM ab. Wenn Sie Qt und ähnliche Bibliotheken verwenden, die auf mehreren Plattformen einheitliche APIs bieten, können Sie ziemlich portierbare C/C++ - Programme erstellen.

1

Die vielleicht maßgeblichsten Antwort, warum Java entwickelt wurde interpretiert werden kann in der whitepaper that announced the Java language back in 1995 finden:

1.2.3 Architektur Neutral und tragbare

Java-Technologie wurde entwickelt, Anwendungen zu unterstützen das wird in heterogenen Netzwerkumgebungen eingesetzt. In solchen Umgebungen müssen Anwendungen auf einer Vielzahl von Hardwarearchitekturen ausgeführt werden können. Innerhalb dieser Vielzahl von Hardwareplattformen müssen Anwendungen auf einer Vielzahl von Betriebssystemen ausgeführt werden und mit mehreren Programmiersprachenschnittstellen zusammenarbeiten. Um der Vielfalt der Betriebsumgebungen gerecht zu werden, generiert das Java Compiler TM -Produkt Bytecodes - ein architekturneutrales Zwischenformat, das entwickelt wurde, um Code effizient auf mehrere Hardware- und Softwareplattformen zu übertragen. Die interpretierte Natur der Java-Technologie löst sowohl das Binärverteilungsproblem als auch das Versionsproblem; Die gleichen Java-Programmiersprachen-Bytecodes werden auf jeder Plattform ausgeführt.

Architekturneutralität ist nur ein Teil eines wirklich tragbaren Systems. Die Java-Technologie macht Portabilität noch ein Stück weiter, indem sie die Grundsprache strikt definiert.Java-Technologie setzt einen Anteil am Boden und spezifiziert die Größen seiner grundlegenden Datentypen und das Verhalten seiner arithmetischen Operatoren. Ihre Programme sind auf jeder Plattform gleich - es gibt keine Inkompatibilitäten zwischen Datenarten in Hardware- und Softwarearchitekturen.

und

1.2.5 Ausgelegt, Threaded, und Dynamic

Das Java-Interpreter kann Java-Bytecode ausführt direkt auf jedem Rechner, an dem der Dolmetscher und Laufzeitsystem haben portiert. In einer interpretierten Plattform wie einem auf Java-Technologie basierenden System ist die Verknüpfungsphase eines Programms einfach, inkrementell und leichtgewichtig. Sie profitieren von viel schnelleren Entwicklungszyklen - Prototyping, Experimentieren und schnelle Entwicklung sind der Normalfall im Vergleich zu den traditionellen Schwergewicht Compilier-, Link- und Testzyklen.

Es ist auch erwähnenswert, dass die Java-API weit über die Standardbibliotheken für C oder C++ hinausgeht.

Beachten Sie, dass diese Perspektive etwas veraltet ist. Eine moderne Interpretation des Kompromisses zwischen A-priori- und Runtime-Compilation sollte zwar weitgehend noch korrekt sein, aber auch die zusätzlichen Optimierungsmöglichkeiten der Ausführungszeit-Statistik beinhalten und wahrscheinlich den Gebrauch des Wortes "interpreted" insgesamt vermeiden - zumindest wenn wir es etwas sind ernsthaft über die Leistung.