Frage zu Virtuellen Maschinen



  • Vorweg: Ich studiere kein Informatik, will es aber später einmal studieren. Ich interessiere mich jetzt nur schon mal im Groben für IT etc. Also nicht wundern, wenn meine Frage vielleicht etwas doof klingt. 😃

    Also, ich weiß, dass Java plattformunabhängig ist. Halt wegen dem Bytecode und so weiter. Was ich auch weiß ist, dass die JVM selber in C/C++ geschrieben ist. Aber ich stelle mir jetzt die Frage, warum ist c++ nicht plattformunabhängig wie java? Warum schreibt man nicht eine VM für C++, die den C++ Quellcode in einem C++Bytecode übersetzt? Dann hätte man diese Vorteile ja auch bei C++, oder nicht?

    Danke schon mal!



  • Also ich glaube, ich habe eine Antwort gefunden. Könnte es daran liegen, dass die Ausführung von Bytecode auf Kostem der Ausführungszeit geht. aber könnte man trotzdem für spezielle kleine Programme, die man in C++ geschrieben hat, dann trotzdem diese in Bytecode compilieren? Also hat man das dann generell bei C++ nicht gemacht, um die Ausführungszeit gering zu halten?



  • NeuInfo schrieb:

    Also, ich weiß, dass Java plattformunabhängig ist. Halt wegen dem Bytecode und so weiter. Was ich auch weiß ist, dass die JVM selber in C/C++ geschrieben ist.

    Es ist nicht plattformunabhängig wegen dem Bytecode, und die JVM hätte auch in einer anderen Sprache programmiert werden können. Du bringst da was durcheinander, informiere dich mal wie das mit der Plattformunabhängigkeit funktioniert. Dann wirst du sehen das deine Frage unsinnig ist und deshalb diese Antwort von mir. Das ist keine Beleidigung, doch um die Antwort zu verstehen musst du etwas mehr Ahnung haben, und wenn du die hast weißt du auch die Antwort die eigentlich echt einfach ist.



  • Die Performance ist sicher ein wichtiger Grund. Liegt aber nicht nur daran. C++ sind näher an der Maschine, in Java sind viele Sachen einfach versteckt und wegabstrahiert, die man in C++ benutzen kann und will.



  • Kasperle schrieb:

    NeuInfo schrieb:

    Also, ich weiß, dass Java plattformunabhängig ist. Halt wegen dem Bytecode und so weiter. Was ich auch weiß ist, dass die JVM selber in C/C++ geschrieben ist.

    Es ist nicht plattformunabhängig wegen dem Bytecode, und die JVM hätte auch in einer anderen Sprache programmiert werden können. Du bringst da was durcheinander, informiere dich mal wie das mit der Plattformunabhängigkeit funktioniert. Dann wirst du sehen das deine Frage unsinnig ist und deshalb diese Antwort von mir. Das ist keine Beleidigung, doch um die Antwort zu verstehen musst du etwas mehr Ahnung haben, und wenn du die hast weißt du auch die Antwort die eigentlich echt einfach ist.

    Beantworte die Frage oder lass es. Das was du hier vo ndir gibst ist nur Datenmüll, der den Signal-Rausch Abstand im Internet weiter verschlechtert. Gratuliere dazu!

    Also, ich weiß, dass Java plattformunabhängig ist. Halt wegen dem Bytecode und so weiter. Was ich auch weiß ist, dass die JVM selber in C/C++ geschrieben ist. Aber ich stelle mir jetzt die Frage, warum ist c++ nicht plattformunabhängig wie java? Warum schreibt man nicht eine VM für C++, die den C++ Quellcode in einem C++Bytecode übersetzt? Dann hätte man diese Vorteile ja auch bei C++, oder nicht?

    C++ an sich ist an keine Plattform gebunden. Erst der compilierte Code läuft dann nur noch auf einer Hardwareplattform (x86, ARM, ...)
    Soll heißen: C++ verfolgt ein anderes Prinzip. In C++ schreibt man den Code einmal für alle Plattformen und compiliert dann für jede Plattform separat.

    In Java passiert genau das gleiche, nur dass du nicht vollständig compilierst, sondern nur bis auf eine Zwischencodebasis. Erst am Zielrechner wird dieser Code weiter übersetzt sodass die "echte" CPU diesen Code ausführen kann. Alleine schon dieses compilieren zur Laufzeit verschlechtert die Performance. Mal abgesehen davon, dass C++ Compiler natürlich einen riesigen Vorteil haben: sie haben Zeit! Ob eine Datei nun in 1 oder 2 Sekunden übersetzt wird, ist relativ egal. Es bleibt also viel Zeit für Optimierungen.
    Diese Zeit bleibt einem Just-In-Time Compiler nicht. Von dem wird erwartet, dass der Code innerhalb kürzester Zeit zur Verfügung steht.

    Insgesamt sehe ich also keinen Grund für eine C++ Virtuelle Maschine. Wenn ich (warum auch immer???) unbedingt eine Virtuelle Maschine möchte, dann greife ich eben zu Java oder C#.



  • NeuInfo schrieb:

    Dann hätte man diese Vorteile ja auch bei C++, oder nicht?

    So toll sind diese Vorteile auch gar nicht. 'Compile once, runs everywhere' klappt ja wenn überhaupt auch nur auf ähnliche Geräten.
    Ein Desktop-Programm läuft auf einer Waschmaschine nunmal nicht!
    Selbst ähnliche Sachen wie Desktop-Handy gehen ohne weiteres nicht.



  • NeuInfo schrieb:

    Aber ich stelle mir jetzt die Frage, warum ist c++ nicht plattformunabhängig wie java? Warum schreibt man nicht eine VM für C++, die den C++ Quellcode in einem C++Bytecode übersetzt?

    Kann man sogar tun, wenn man seine Programme mit Visual C++ und /clr:pure übersetzt. Allerdings stellt sich bei näherem Hinsehen heraus, daß das gar nicht so einfach ist, weil ordentlicher CIL-Code verifizierbar sein sollte, damit die CLR Typsicherheit garantieren kann, und weil konventioneller C++-Code dieses Kriterium üblicherweise nicht erfüllt. Statt in C++ muß man also in C++/CLI programmieren, statt der STL muß man die STL/CLR nehmen, und C++-Fremdbibliotheken gehen meistens eh nicht.

    (Die Option /clr:pure wird in VC 2015 voraussichtlich deprecated, eben weil jeder vernünftige Mensch für sowas C# nimmt.)



  • Zunaechst einmal muss klargestellt werden, dass VM != langsam. Es spricht in der Tat nichts dagegen, C++ in eine Art Zwischencode zu uebersetzen und zur Laufzeit in Maschinencode zu uebersetzen. Das Problem hierbei ist nur, dass das kompilieren und optimieren Zeit benoetigt, was laengere Startup-Zeiten zur Folge hat. Der Code der dabei rauskommt, kann aber durchaus der selbe sein, den ein statischer Compiler produziert hat.

    LLVM ist das Backend vom Clang C++ Compiler und hat auch einen JIT. Mit Clang kann man C++-Code zu LLVM-Bitcode (entspricht dem Java Bytecode) kompilieren, der dann mithilfe dieses JITs ausgefuehrt werden kann. Macht nur niemand, weil man dann LLVM mit seiner App mitliefern muesste (waere dann das Aequivalent des JREs)

    Wie du siehst, ist das also alles kein grundsaetzliches Problem. Was Plattformunabhaengigkeit angeht, muss man, wie schon angesprochen von den anderen Usern, zwischen Plattformunabahaengigkeit der Sprache und der Binaries unterscheiden. Es gibt da naemlich Java als die Sprache und Java als die Plattform. Man kann genauso gut andere Sprachen (z.B. Scala, Groovy, ...) auf der Plattform Java laufen lassen, oder die Sprache Java fuer eine andere Plattform kompilieren. Genauso gibt es C++ die Sprache und mehrere "native" Plattformen.


Anmelden zum Antworten