it-swarm.com.de

Was ist Portabilität? Wie ist Java portabler als andere Sprachen?

Ich frage mich, wie Java portabler ist als C, C++ und .NET und jede andere Sprache. Ich habe oft gelesen, dass Java aufgrund des Interpreters und der JVM portabel ist, aber die JVM verbirgt nur die architektonischen Unterschiede in der Hardware, oder? Wir würden immer noch verschiedene JVMs für verschiedene Maschinenarchitekturen benötigen. Was vermisse ich hier? Wenn also jemand eine Abstraktionsschicht für C für die gängigsten Architekturen schreibt, sagen wir das CVM, dann wird jedes C-Programm auf diesen Architekturen ausgeführt, sobald CVM installiert ist, nicht wahr?

Was genau ist diese Portabilität? Kann man .NET als portabel bezeichnen?

26
Hari Menon

Portabilität ist kein Schwarzweiß, ja oder nein. Portabilität ist, wie einfach man ein Programm nehmen und auf allen Plattformen ausführen kann, die man interessiert.

Es gibt einige Dinge, die dies beeinflussen. Eine ist die Sprache selbst. Die Java-Sprachspezifikation lässt im Allgemeinen die Implementierung weniger zu. Beispielsweise ist "i = i ++" in C und C++ nicht definiert, hat jedoch eine definierte Bedeutung in Java. Praktisch gesehen haben Typen wie "int" in Java eine bestimmte Größe (z. B.: int ist immer 32 Bit), während in C und C++ die Größe je nach Plattform und Compiler variiert. Diese Unterschiede allein hindern Sie nicht daran, tragbaren Code in C und C++ zu schreiben, aber Sie müssen viel fleißiger sein.

Ein anderes sind die Bibliotheken. Java verfügt über eine Reihe von Standardbibliotheken, die C und C++ nicht haben. Zum Beispiel Threading-, Netzwerk- und GUI-Bibliotheken. Bibliotheken dieser Art gibt es für C und C++, sie sind jedoch nicht Teil des Standards und die entsprechenden verfügbaren Bibliotheken können von Plattform zu Plattform stark variieren.

Schließlich ist noch die ganze Frage, ob Sie eine ausführbare Datei einfach auf die andere Plattform ablegen und dort arbeiten lassen können. Dies funktioniert im Allgemeinen mit Java, vorausgesetzt, es gibt eine JVM für die Zielplattform. (und es gibt JVMs für viele/die meisten Plattformen, die die Leute interessieren) Dies trifft im Allgemeinen nicht auf C und C++ zu. In der Regel benötigen Sie least eine Neukompilierung. Dies setzt voraus, dass Sie sich bereits um die beiden vorherigen Punkte gekümmert haben.

Ja, wenn ein "CVM" für mehrere Plattformen vorhanden wäre, würde dies C und C++ tragbarer machen - sozusagen. Sie müssen Ihren C-Code immer noch entweder auf tragbare Weise schreiben (z. B .: Nehmen Sie an, dass nichts anderes als die Norm angegeben ist) oder Sie schreiben an das CVM (sofern eine einheitliche Entscheidung getroffen wurde) alle diese Arten von Dingen auf allen Zielplattformen). Sie müssen auch auf die Verwendung von Nicht-Standard-Bibliotheken verzichten (kein Netzwerk, kein Threading oder GUI) oder für diese Zwecke in die CVM-spezifischen Bibliotheken schreiben. Wir sprechen also nicht wirklich davon, C und C++ tragbarer zu machen, sondern ein spezielles CVM-C/C++, das portabel ist.

Auch hier ist Portabilität kein Schwarz-Weiß-Ding. Auch bei Java kann es zu Inkompatibilitäten kommen. Die GUI-Bibliotheken (insbesondere AWT) waren für inkonsistentes Verhalten bekannt und alles, was Threads betrifft, kann sich anders verhalten, wenn Sie nachlässig werden. Im Allgemeinen ist es jedoch viel einfacher, ein nicht triviales Java-Programm zu verwenden, das auf einer Plattform geschrieben ist, und es auf einer anderen Plattform auszuführen, als dies mit einem in C oder C++ geschriebenen Programm der Fall ist.

39

Wie andere bereits gesagt haben, ist Portabilität eher ein unscharfes Konzept. Aus einer bestimmten Perspektive ist C tatsächlich mehr portierbar als Java. C macht nur sehr wenige Annahmen über die zugrunde liegende Hardware. Es wird nicht einmal angenommen, dass ein Byte 8 Bits enthält oder dass negative Zahlen durch das Zweierkomplement dargestellt werden sollten. Theoretisch sind Sie mit C einverstanden, solange Sie eine von Neumann-basierte Maschine und einen Compiler haben.

Tatsächlich wird ein in C geschriebenes "Hallo Welt" -Programm auf viel mehr Plattformen funktionieren als ein in Java geschriebenes "Hallo Welt" -Programm. Sie könnten wahrscheinlich das gleiche "Hallo Welt" -Programm für ein PDP-11 und ein iPhone verwenden.

Die Realität ist jedoch, dass die meisten realen Programme viel mehr als nur "Hallo Welt" ausgeben. Java gilt als portabler als C, da in der Praxis das Portieren von C-Programmen aus der realen Welt auf andere Plattformen wesentlich aufwändiger ist als in der Realität -world Java Programme.

Dies liegt daran, dass die C-Sprache wirklich ANSI-C ist, was eine äußerst universelle Sprache ist. Es gibt keine Unterstützung für Netzwerkprogrammierung, Threading oder GUI-Entwicklung. Sobald Sie also ein Programm schreiben, das eines dieser Dinge enthält, müssen Sie auf eine weniger portable Erweiterung von C wie Win32 oder POSIX oder was auch immer zurückgreifen.

Bei Java werden Netzwerkprogrammierungs-, Threading- und GUI-Tools jedoch durch die Sprache definiert und in jede VM -Implementierung integriert.

Trotzdem denke ich, dass viele Programmierer auch die Fortschritte, die modernes C/C++ in Bezug auf die Portabilität in diesen Tagen gemacht hat, unterschätzen . POSIX leistet einen wichtigen Beitrag zum plattformübergreifenden Threading. In C++ bietet Boost Netzwerk- und Threading-Bibliotheken, die im Grunde genommen genauso portabel sind wie alles andere in Java. Diese Bibliotheken haben einige plattformspezifische Besonderheiten, Java jedoch auch.

Im Wesentlichen basiert Java auf jeder Plattform mit einer VM -Implementierung, die Bytecode vorhersagbar interpretiert, und C/C++ basiert auf Bibliotheken, die plattformspezifischen Code unter Verwendung des Präprozessors (#ifdefs). Beide Strategien ermöglichen plattformübergreifendes Threading, Networking und GUI-Entwicklung. Es ist einfach so, dass Java hinsichtlich der Portabilität schnellere Fortschritte gemacht hat als C/C++. Die Sprachspezifikation Java hatte fast vom ersten Tag an Threading-, Netzwerk- und GUI-Entwicklung, während die Boost-Netzwerkbibliothek erst um 2005 herauskam und erst 2011 mit C++ 11 das übliche portable Threading war in C++ enthalten.

21
Charles Salvia

Wenn Sie ein Java-Programm schreiben, wird es auf allen Plattformen ausgeführt, auf denen JVM geschrieben ist (Windows, Linux, MacOS usw.).

Wenn Sie ein C++ - Programm schreiben, müssen Sie es speziell für jede Plattform kompilieren.

Nun heißt es, das Motto von Java "Einmal schreiben, überall laufen" ist ein Mythos. Dies trifft für Desktop-Apps, die eine Interaktion mit vielen nativen Ressourcen erfordern, nicht ganz zu, aber jede JavaEE-Anwendung kann auf jeder Plattform ausgeführt werden. Momentan arbeite ich an Windows und andere Kollegen arbeiten an Linux - ganz ohne Probleme.

(Eine weitere Sache, die mit Portabilität zu tun hat, ist JavaEE (Enterprise Edition). Man sagt, dass mit JavaEE-Technologien geschriebene Anwendungen auf jedem JavaEE-zertifizierten Anwendungsserver laufen. Dies gilt jedoch mindestens bis JavaEE6. ( siehe hier ))

7
Bozho

Portabilität ist ein Maß für den Aufwand, mit dem ein Programm in einer anderen Umgebung als dem Ursprungsort ausgeführt werden kann.

Sie können jetzt darüber debattieren, ob eine JVM unter Linux eine andere Umgebung ist als unter Windows (ich würde mit Ja argumentieren), aber es bleibt die Tatsache, dass in vielen Fällen null Aufwand anfällt, wenn Sie einige wenige Ausschläge vermeiden.

Das CVM, über das Sie sprechen, ist in hohem Maße das, was die POSIX-Bibliotheken und die Laufzeitbibliotheken zu bieten versuchen. Es gibt jedoch große Implementierungsunterschiede, die die Hürden überwinden lassen. Im Fall von Microsoft und Apple ist dies sicherlich beabsichtigt, um zu verhindern, dass Entwickler Produkte auf konkurrierenden Plattformen veröffentlichen.

Auf der .NET-Seite können Sie, wenn Sie sich an das halten, was Mono bietet, eine Open-Source-.NET-Implementierung, die ungefähr die gleiche Portabilität wie Java bietet. Da Mono jedoch deutlich hinter den Windows-Versionen liegt, ist dies keine beliebte Wahl . Ich weiß nicht, wie beliebt das für serverbasierte Entwicklung ist, bei der ich mir vorstellen kann, dass es weniger um ein Problem geht.

5
Peter Tillemans

Java ist aus Sicht des Entwicklers portierbar: In Java geschriebener Code kann in jeder Umgebung ausgeführt werden, ohne dass eine Neukompilierung erforderlich ist. C ist nicht portabel, da es nicht nur in vielen Fällen an ein bestimmtes Betriebssystem gebunden ist, sondern auch nach dem Kompilieren immer an eine bestimmte Hardwarearchitektur gebunden ist. Gleiches gilt für C++. .Net ist portabler als C/C++, da es ebenfalls auf einer virtuellen Maschine basiert und daher zur Kompilierzeit nicht an eine bestimmte Hardwarearchitektur gebunden ist, sondern auf Windows-Maschinen (offiziell) beschränkt ist. 

Sie sind richtig, die JVM ist plattformspezifisch (muss es sein!), Aber wenn Sie sagen, dass Java portabel ist, sprechen Sie vom Standpunkt des Entwicklers aus, und Java-Entwickler schreiben die JVM nicht. Sie verwenden sie: - ).

Bearbeiten @ Raze2Dust Zur Beantwortung Ihrer Frage. Ja du könntest. Sie könnten Java plattformspezifisch machen, indem Sie einen Compiler schreiben, der Maschinencode anstelle von Bytecode generiert. Aber, wie einige andere Kommentare vermuten lassen, warum sollten Sie das tun? Sie müssen einen Interpreter erstellen, der den kompilierten Code auf dieselbe Weise wie die JVM auf Operationen abbildet. So lang und kurz ist, Sie könnten es definitiv tun, aber warum sollten Sie?

3
Chris Thompson

Java bietetthreeverschiedene Arten der Portabilität:

Quellcode-Portabilität: Ein gegebenes Java-Programm sollte unabhängig von der zugrunde liegenden CPU, dem Betriebssystem oder dem Java-Compiler identische Ergebnisse liefern.

Portabilität der CPU-Architektur: Die aktuellen Java-Compiler erzeugen Objektcode (Byte-Code genannt) für eine CPU, die noch nicht vorhanden ist. Für jede echte CPU, auf der Java-Programme ausgeführt werden sollen, "führt" ein Java-Interpreter oder eine virtuelle Maschine den J-Code aus. Bei dieser nicht vorhandenen CPU kann derselbe Objektcode auf jeder CPU ausgeführt werden, für die ein Java-Interpreter vorhanden ist.

OS/GUI-Portabilität: Java löst dieses Problem, indem es eine Reihe von Bibliotheksfunktionen (in Java-Bibliotheken wie awt, util und lang enthalten) bereitstellt, die mit einem imaginären Betriebssystem und einer imaginären GUI kommunizieren. So wie die JVM eine virtuelle CPU darstellt, bieten die Java-Bibliotheken eine virtuelle OS/GUI. Jede Java-Implementierung stellt Bibliotheken bereit, die dieses virtuelle OS/GUI implementieren. Java-Programme, die diese Bibliotheken verwenden, stellen die erforderlichen Betriebssystem- und GUI-Funktionen relativ einfach bereit.

Siehe diesen link

2
Gaurava Agarwal

Sie fragen, ob man eine "C-VM" schreiben könnte. Nicht genau. "Java" ist ein großer Begriff, der von Sun für viele Dinge verwendet wird, einschließlich der Programmiersprache und der virtuellen Maschine. "C" ist nur eine Programmiersprache: Es ist Sache des Compilers, des Betriebssystems und der CPU, welches Format die resultierende Binärdatei haben soll.

C wird manchmal als tragbar bezeichnet weil die Laufzeit nicht angegeben wird. Die Leute, die Ihren Compiler geschrieben haben, konnten Dinge auswählen, die für diese Plattform sinnvoll sind. Der Nachteil ist, dass C niedrig genug ist und sich die Plattformen so unterscheiden, dass es für C-Programme üblich ist, auf einem System gut zu funktionieren und auf einem anderen überhaupt nicht.

Wenn Sie die C-Sprache mit einer bestimmten ABI kombinieren, können Sie analog zur JVM ein VM definieren. Es gibt bereits ein paar Dinge wie diese:

  • Die "Intel Binary Compatibility Specification" ist ein Beispiel für eine solche ABI (die heute fast niemand verwendet).
  • "Microsoft Windows" könnte auch ein solches ABI sein (wenn auch ein riesiger und nicht näher spezifizierter), für den Wine ein VM ist, der Programme ausführt, die dafür geschrieben wurden
  • "MS-DOS", für das Dosemu eine VM ist
  • "Linux" ist heute eines der beliebtesten, dessen Programme von Linux selbst ausgeführt werden können, NetBSD oder FreeBSD
  • "PA-RISC", für den HPs Dynamo eine JIT-artige VM war

Alle diese C-VMs sind tatsächlich eine echte Maschine - niemand, AFAIK, hat jemals ein rein virtuelles C VM erstellt. Dies ist nicht überraschend, da C so konzipiert wurde, dass es effizient auf Hardware ausgeführt wird. Daher können Sie es auch auf einem System normal ausführen lassen. Wie HP gezeigt hat, können Sie immer noch eine JIT erstellen, um den Code effizienter auszuführen, selbst auf derselben Plattform.

2
Ken

Portabilität oder wie in Wikipedia geschrieben, Software Portability ist die Möglichkeit, dieselbe Software (denselben Code) in mehreren Umgebungen (Betriebssystemen) wiederzuverwenden. Die Java-JVM ist eine JVM, die auf allen Betriebssystemen ausgeführt werden kann, für die sie entwickelt wurde: Windows, Linux, Mac OS usw.

Unter .NET ist es möglich, Ihre Software auf verschiedene Plattformen zu portieren. Aus Wikipedia :

Das Design des .NET Frameworks Ermöglicht es, dass es theoretisch plattformunabhängig und somit plattformübergreifend kompatibel ist. Das heißt, ein Programm , Das zur Verwendung des Frameworks geschrieben wurde, sollte Ohne Änderung auf einem beliebigen Systemtyp Ausgeführt werden, für den das Framework Implementiert ist.

Und da Microsoft das .NET-Framework nie außerhalb von Windows implementiert hat und .NET als plattformunabhängig eingestuft hat, hat Mono die Ausführung von .NET-Anwendungen und das Kompilieren von Code für die Ausführung unter Linux ermöglicht.

Für Sprachen wie C++, Pascal usw. müssen Sie zu jedem Betriebssystem gehen und es auf dieser Plattform erstellen, um es auf dieser Plattform auszuführen. Die EXE-Datei in Windows ist nicht identisch mit der .so in Linux (dem Maschinencode), da beide unterschiedliche Bibliotheken verwenden, um mit dem Kernel zu kommunizieren, und jedes Betriebssystem über einen eigenen Kernel verfügt.

1
Buhake Sindi

Sie benötigen die JVM für verschiedene Architekturen, aber natürlich laufen Ihre Java-Programme auf auf dieser JVM . Sobald Sie eine JVM für eine Architektur haben, sind Ihre Java-Programme für diese Architektur verfügbar.

Ich kann also ein Java-Programm schreiben, es in Java-Bytecode (das ist architekturunabhängig) kompilieren und das heißt, ich kann es auf jeder JVM auf jeder Architektur ausführen. Die JVM abstrahiert die zugrunde liegende Architektur und mein Programm läuft auf einer virtuellen Maschine.

1
Brian Agnew

Die Idee ist, dass Java Sprache portierbar ist (oder genauer gesagt, der kompilierte Bytecode ist portabel). Sie sind richtig, dass für jedes VM eine bestimmte Implementierung für ein bestimmtes Hardwareprofil erforderlich ist. Sobald diese Anstrengungen unternommen wurden, wird der Java-Bytecode all auf dieser Plattform ausgeführt. Sie schreiben den Java/Bytecode einmal, und er kann auf einer beliebigen JVM ausgeführt werden. 

.NET ist ziemlich ähnlich, aber das Prinzip ist viel geringer. Die CLR ist analog zur JVM und hat einen eigenen Bytecode. Mono existiert auf * nix, aber Sie haben Recht, dass es nicht "offiziell" ist. 

1
Kirk Woll

WORE - Write Once Run überall

In der Realität ist dies auf die Plattformen beschränkt, die über eine JVM verfügen. Dies deckt jedoch die Mehrzahl der Plattformen ab, auf denen Sie bereitstellen möchten. Es ist fast auf halbem Weg zwischen einer interpretierten Sprache und einer kompilierten Sprache, um die Vorteile beider zu nutzen.

0
Codemwnci