Virtuelle Maschine vs Compiler

JavatarAang

Mitglied
Hallo liebe Leute,
ich bin gerade dabei mich mit der Grundgerüst der Java-Progammiersprache auseinanderzusetzen.

Das tolle an Java ist ja, dass es Plattformunabhängig ist. Quelltext in Bytecode(universal funkt. auf allen Betriebssystemen) letztendlich wird es durch die Virtuelle Maschine dann ausgeführt, da java für jedes Betriebssystem jeweiliges Virtuelle Maschine hat ist Sie Plattformunabhängig.

Ich hoffe dabei sind wir uns alle einig :)

Nun..
Wie ist das eigentlich bei C, C++ ?
Dort wird der Quellcode direkt in Maschinencode übersetzt dies passiert mittels einem Compiler.

Doch kann man für C und C++ nicht einfach das jeweilige Compiler installieren den man will (für das jeweilige Betriebssystem) ?
oder ist das zu aufwendig ?

Ich hoffe jemand von euch kann mir das aufklären..

Danke im voraus
 

mrBrown

Super-Moderator
Mitarbeiter
Doch kann man für C und C++ nicht einfach das jeweilige Compiler installieren den man will (für das jeweilige Betriebssystem) ?
oder ist das zu aufwendig ?

Du musst nicht nur die passenden Betriebsysteme und Compiler haben, sondern in den meisten Fällen auch Plattformspezifischen Code schreiben. (Das auf allen Betriebsystemen zu bauen ist heutzutage das geringste Problem, in vielen Fällen wird auch Java-Code auf allen Systemen gebaut und getestet)
Bei Java muss man nur in den seltensten Fällen Plattformspezifischen Code schreiben - eben weil alles plattformspezifische durch die JVM aufgelöst wird.

Und du musst nicht mehr eine Programm rausgeben, sondern X verschiedene davon - eben für jedes unterstütze System eins.
 
K

kneitzel

Gast
Also bei Java hat man im Framework eine sehr große Library und man ist dadurch genau darauf begrenzt. (Stimmt nicht ganz, es gibt auch JNI, aber damit wäre man auch nicht mehr Unabhängig vom Betriebssystem.)

Bei C/C++ gibt es so ein Framework nicht bzw. kaum. Egal was man macht: man braucht externe Libraries, die dann mit dem Linker eingebunden werden und die Plattform spezifisch sind. Aber hier gibt es sehr viel, dass überall gleich ist, d.h. so man nur Libraries verwendet, die überall vorhanden sind, reicht tatsächlich ein einfaches übersetzen aus....

Wenn man sich das im Detail ansieht, dann wird aber schnell deutlich: so einfach ist es dann doch nicht. Um gewisse Unterschiede abzufangen (die es selbst zwischen zwei Linux Systemen geben kann), gibt es dann ein großes Beiwerk an Tools, die das abfangen. Automake und co lassen da dann grüßen.

Aber ja: es gibt auch Crosscompiler, d.h. ich kann auf Linux auch Binaries für z.B. Windows erzeugen.

Vor und Nachteile sind auch klar:
Begrenzung auf VM ist hart, da wird Plattformnahe Entwicklung sehr Umständlich...
Aber Optimierung zur Laufzeit ist möglich. Der JIT Compiler kann also Code direkt für das System erstellen. Bei C oder C++ muss ich sagen, für welche CPU das sein soll. Sollen neue Befehle der neuen CPU genutzt werden oder nicht? (Spielt heute keine so große Rolle mehr, aber es gab mal eine Zeit von i386, i486, ... da war das existenziell.)
Geschwindigkeit spielt keine so große Rolle. Lediglich der erste Lauf von Code wird durch den JIT Compiler verlangsamt, aber später wird auch nur fertig übersetzter Code genutzt.

Was hier übrigens nicht wirklich mit reinspielt, was oft genannt wird: Managed Systeme. Also der Garbage Collector und so. Ja, C/C++ haben keinen GC, aber das nur, weil es nicht gewünscht ist. In einem C++ Buch hat Herbert Schildt (ja, ich glaube, dass Buch war auch von ihm, auch wenn ich ihnen auch eher mit der Java Reference in Verbindung bringe) in einem Kapitel einmal aufgezeigt, wie einfach ein GC entwickelt werden kann, so man das möchte.
Aber C++ geht einen anderen Weg und mit aktuellen Standards ist es damit auch nicht mehr möglich, Speicher nicht frei zu geben (bzw. der Compiler meckert dann halt).

Was ich übrigens deutlich besser finde ist .Net. Da hat man die komplett gekapselte VM vermieden. Da hat man nur ein Layer mit dem JIT Compiler und dank P/Invoke kann auf alles zugegriffen werden. Dadurch kann man relativ einfach Plattform spezifischen Code schreiben so notwendig (Teilweise ist dies halt notwendig). Aber es ist auch Open Source und unabhängig von Plattformen. Aber Vergleich .net zu Java ist nicht das eigentliche Thema, daher gehe ich da nicht im Detail weiter drauf ein.

So viel einfach einmal von meiner Seite.
 

White_Fox

Top Contributor
Also damit ich es letztendlich richtig verstanden habe. Je nach Betriebssystem unterscheidet sich auch der Quellcode den ich schreibe (C,C++) ? :O nevermind.
Schaue dir z.B. mal die Pfadseparatoren von Windows und Linux an. Das eine benutzt eni '/' und das anderen '\'. In Java behandelt man das mit einem File.Pathseparator, für C ist mir da nichts bekannt (was allerdings nicht viel heißen will, C nutze ich höchstens für Mikrocontroller).

C, C++ und Java sind halt völlig unterschiedliche Werkzeuge um völlig unterschiedliche Probleme zu lösen. C ist nach Assembler eine der hardwarenächsten Sprachen. Damit kannst du auf Registerebene Bits einzeln hin und herschubsen. Das kann manchmal hilfreich oder gar notwendig sein.

Wenn du allerdings mal versuchst eine GUI in C umzusetzen wirst du ganz schnell bemerken, warum man sowas besser nicht in C macht.
 

mrBrown

Super-Moderator
Mitarbeiter
Schaue dir z.B. mal die Pfadseparatoren von Windows und Linux an. Das eine benutzt eni '/' und das anderen '\'. In Java behandelt man das mit einem File.Pathseparator, für C ist mir da nichts bekannt (was allerdings nicht viel heißen will, C nutze ich höchstens für Mikrocontroller).
In Java kann man immer '/' nutzen, die JVM übersetzt das passend ;)
Den Separator sollte man nur zum Anzeigen von Pfaden nutzen, wenns Nutzerfreundlich sein soll.
 

M.L.

Top Contributor
Das tolle an Java ist ja, dass es Plattformunabhängig ist.
Also das Prinzip "Write Once, Run Everywhere" haben andere Sprachen besser umgesetzt...
Doch kann man für C und C++ nicht einfach das jeweilige Compiler installieren den man will (für das jeweilige Betriebssystem) ?
oder ist das zu aufwendig ?
Das geht schon, aber siehe Von Null auf Firmware mit PlatformIO : "(...)Vor allem im Bereich C/C++ sieht man sich als Entwickler mit Herausforderungen am unteren Teil des Entwicklungsstacks konfrontiert: Cross-Compiler und Linker, Bibliotheken, Include-Pfade sowie Build-/Flash-Werkzeuge wollen ausgewählt und installiert werden, und zwar vielfach abhängig von der unterliegenden Hardware. (..)Da ist es gut, wenn man ein Werkzeug hat, das sich um diese Zusammenstellung der Werkzeuge kümmert. (...)"
 
K

kneitzel

Gast
Welche denn, und in welchen Punkten?
Also die Frage ist durchaus berechtigt.

Also ich sehe viele Vorteile bei .Net und PowerShell. Alleine schon, dass die Elemente eben nicht so abgekapselt sind wie in Java / der Java Virtual Machine. So sind die ganzen Libraries halt relativ universell.

Aber das hat natürlich auch Nachteile, denn so eine Kapselung in eine VM kann man evtl. auch als Sandbox sehen. So wird man aus einer Java VM (ohne Installation von JNI Teilen) kaum eine Lücke in einem System ausnutzen können. Security kann ja nie schaden :)

Ansonsten gibt es natürlich massiv Unterschiede zu Script-Sprachen, wobei ich da jetzt nicht sicher bin, was es da an JIT Compilern gibt und so. Aber da graut es mir als Software Entwickler immer etwas, aber das liegt einfach nur an der Qualität von Code, der von vielen abgeliefert wird. (Das geht aber in jeder Sprache. Damals als KDE raus kam, war das entsetzlich: Viele, die keine Ahnung von Software Entwicklung hatten, haben plötzlich Software schreiben wollen ... Das war ein Beweis, dass es überall geht ...)

Derzeit sehe ich aber an Java nichts wirklich gravierend schlimmes. Die Sprache entwickelt sich gut. Aber ich bin auch schon zu Kotlin gewechselt (und wieder zurück) ... was dann etwas zeigt, dass man zum einen halt die Plattform (JVM, verfügbare Libraries) sehen muss und die Sprache (Java, Kotlin, ...)

Java hat halt den Ansatz bezüglich Application Server. Das sind große Moloche, bei denen Server Seitig sich Java gut aufgebaut hat. Die Frage ist aber, in wie weit dies nicht abgelöst wird durch Microservices und so. Das war z.B. von Anfang an mit der Ansatz bei .Net. Da gab es dann das Windows Communication Framework und man konnte mit minimalen Mitteln Services erstellen oder konsumieren. Aber das ohne Wertung. Ich selbst schätze Spring und möchte es nicht missen. Es unterstützt halt schon. Aber die Komplexität lässt sich nicht leugnen und da rennt man dann in manches Problem rein, das schwer zu analysieren ist.
 

JavatarAang

Mitglied
Was hier übrigens nicht wirklich mit reinspielt, was oft genannt wird: Managed Systeme. Also der Garbage Collector und so. Ja, C/C++ haben keinen GC, aber das nur, weil es nicht gewünscht ist. In einem C++ Buch hat Herbert Schildt (ja, ich glaube, dass Buch war auch von ihm, auch wenn ich ihnen auch eher mit der Java Reference in Verbindung bringe) in einem Kapitel einmal aufgezeigt, wie einfach ein GC entwickelt werden kann, so man das möchte.

Ich habe gedacht bei c und c++ muss man mit dem GC immer handeln, so hat das zumindest mein Prof. Mir damals erklärt..
 
K

kneitzel

Gast
Ich habe gedacht bei c und c++ muss man mit dem GC immer handeln, so hat das zumindest mein Prof. Mir damals erklärt..
Also die Aussage kann ich nicht nachvollziehen. Denn die Systeme haben keinen Garbage Collector, also kein Stück Software, das schaut, welche Speicherbereiche nicht mehr zugegriffen werden können. Aber hat der Dozent einfach die Speicherverwaltung selbst als GC angesehen und das Anfordern / Freigeben als handeln... Aber da muss man dann evtl. genau nachhaken, was wer als genaue Definition nimmt.

Habe aber gerade mal nachgesehen: "The Art of C++" von Herbert Schildt hat in Kapitel 2 einen einfachen Garbage Collector beschrieben. Und hier meint Garbage Collector eben ein Stück Software, das prüft, ob auf irgendwas noch zugegriffen werden kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing Virtuelle Tastatur mit Accents Allgemeine Java-Themen 9
R Virtuelle Serielle Schnittstellen mit RXTX Allgemeine Java-Themen 2
S Virtuelle Datei erstellen Allgemeine Java-Themen 9
D virtuelle Würmer - formelle Fehlerbeseitigung Allgemeine Java-Themen 5
B virtuelle Datei Allgemeine Java-Themen 6
S Virtuelle Klasse in Java Allgemeine Java-Themen 3
D Suche "virtuelle Tastatur" Allgemeine Java-Themen 3
G Virtuelle Dateien Java? Allgemeine Java-Themen 2
P Virtuelle Tastatur Allgemeine Java-Themen 5
Buroto Best Practice Such Filter Maschine Allgemeine Java-Themen 8
berserkerdq2 IJVM, ich tue auf meinen Stack 100 und 120 rein, danach subtrahiere ich, macht die Maschine 100-120 oder 120-100? Allgemeine Java-Themen 8
I Java virutelle Maschine Allgemeine Java-Themen 12
G Methodenaufrufe wie state maschine Allgemeine Java-Themen 4
G Java Maschine? Allgemeine Java-Themen 12
Oneixee5 Compiler-Warnungen Allgemeine Java-Themen 23
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
S CMD Compiler Error Allgemeine Java-Themen 13
J Java AOT Compiler Allgemeine Java-Themen 3
C Compiler programmieren Allgemeine Java-Themen 13
D Java Compiler code referencen Allgemeine Java-Themen 0
C System.out.print("") Compiler Fehler Allgemeine Java-Themen 2
B Java Compiler und JRE Allgemeine Java-Themen 22
M JAR Dateien nur mit Compiler Level 1.6 ausführbar Allgemeine Java-Themen 8
T Compiler Problem... Allgemeine Java-Themen 7
B Test$1.class mit dem javac compiler Allgemeine Java-Themen 7
K event dispatch thread fehler. Compiler meckert nicht aber der Interpreter? Warum?? Allgemeine Java-Themen 11
M AWT AWT "Compiler" Allgemeine Java-Themen 5
S Anschauen was der Compiler macht..? Allgemeine Java-Themen 5
A Java Compiler Allgemeine Java-Themen 4
A AspectJ Compiler nicht im CLASSPATH? Allgemeine Java-Themen 4
S [ANT] compiler wird nicht gefunden Allgemeine Java-Themen 6
V Boxing und Unboxing compiler warnings Allgemeine Java-Themen 6
J Enum Problem: compiliert nicht mit Sun's compiler. Allgemeine Java-Themen 2
O JNI Compiler Problem Allgemeine Java-Themen 2
C Java Compiler und Multiplikation konstanter Faktoren Allgemeine Java-Themen 2
F Kommunikation zw 2 Java-Programmen mit unterschiedl Compiler Allgemeine Java-Themen 13
T Java Compiler Allgemeine Java-Themen 8
K Compiler Fehler definieren/beeinflussen? Allgemeine Java-Themen 5
T Compiler für Rückschritt Java5 -> Java2 Allgemeine Java-Themen 3
F javac compiler Allgemeine Java-Themen 2
I Compiler level - ant Allgemeine Java-Themen 7
B Suche einen guten Compiler Allgemeine Java-Themen 23
S Java Compiler spinnt oder auch nicht ? Allgemeine Java-Themen 5
S Microsoft Standard Compiler Allgemeine Java-Themen 19
W Compiler findet Pakete nicht. Allgemeine Java-Themen 2
7 Applet funktioniert einzig und allein im Compiler Allgemeine Java-Themen 12
M downloadproblem Jikes compiler Allgemeine Java-Themen 2
M Probleme mit Cross-Compiler Allgemeine Java-Themen 3
D Compiler Warnung, Generics, Eclipse 3.1 Allgemeine Java-Themen 6
V String[] wird nicht als Rückgabetyp vom Compiler akzeptiert! Allgemeine Java-Themen 6
M GNU Java Compiler unter Windows? Allgemeine Java-Themen 4
G Compiler Exception auf JTextArea umleiten Allgemeine Java-Themen 4
R Wo kriege ich einen JIT-Compiler her? Allgemeine Java-Themen 6
G Java.lang.Compiler Allgemeine Java-Themen 3
R FastJavac Compiler Allgemeine Java-Themen 2
I Problem mit Compiler? Allgemeine Java-Themen 2
N Compiler (javac) funktioniert nicht... Bitte hilfe! Allgemeine Java-Themen 3
R Compiler spinnt !?!? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben