Virtuelle Maschine vs Compiler

Bitte aktiviere JavaScript!
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
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
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.
 
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.
 
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.
 
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.
 
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. (...)"
 
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.
 
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..
 
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.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben