Java hat die JVM, was hat C?

15

Ich weiß, dass C einen Compiler hat, aber was bestimmt die Ausführungsleistung?

Was passiert, wenn der Code in einem if else -Block nur alle ifs anstelle von if elses enthält? Was bestimmt, dass alle ifs ausgeführt werden? In Java wäre es die JVM, aber in C, was ist die Sache mit dem Ausführungs-Compiler?

Vogelscheuche
quelle
16
Eine nützliche Nuance zu lernen ist, dass Sprachen nur Sprachen sind. Sie können einen Compiler erstellen, der C-Code verwendet und beispielsweise in der JVM ausgeführt wird.
Telastyn
10
+1. Das ist eine sehr gute Frage. Ich würde es nicht für seine Ignoranz ablehnen - es ist ein Wunder, dass Java-Studenten dies nicht fragen.
Djechlin
Sie können Java auch in Maschinencode kompilieren und die JVM vermeiden ...
AK_
2
Auch: Programmiersprache! = Framework! = Laufzeitbibliothek! = Compiler! = Just in Time Compiler! = Interperter
AK_

Antworten:

17

In Java führt die virtuelle Maschine Ihren Code aus, aber C-Compiler generieren Code, den die reale Maschine ausführt. Um genau zu sein, wird Ihr Programm in beiden Fällen in echten Maschinencode konvertiert. Bei Java gibt es jedoch einen mittleren Schritt beim Kompilieren in JVM-Bytecode.

Java-Programme werden also von der JVM beim Laden in echte Anweisungen konvertiert, wohingegen C-Programme vom Compiler bereits vor der Ausführung in echte Anweisungen konvertiert werden.

Vrostu
quelle
20
Es gibt Compiler, die Java verwenden und Maschinencode erzeugen. Zum Beispiel Excelsior Jet . Es gibt auch Interpeter für C ( Picoc ), die niemals Code erzeugen, den eine reale Maschine ausführt. Sprachen sind Sprachen. Implementierungen sind Implementierungen. Die beiden zu verwechseln, kann für die Menschen verwirrend sein.
6

Abgesehen von Maschinencode gibt es keine Programmiersprache, die direkt auf der Hardware ausgeführt wird, in dem Sinne, dass Sie den wörtlichen Quelltext nicht eingeben können. Alle realen Implementierungen müssen übersetzen das Quellprogramm in die Sprache der „Maschine“.

Bei einigen Implementierungen wird es statisch übersetzt. Wir bezeichnen diese Implementierungen normalerweise als "kompiliert". Für andere wird es in eine Zwischenform übersetzt, die dann dynamisch übersetzt wird, wenn das Programm ausgeführt wird. Wir bezeichnen diese Implementierungen normalerweise als "interpretiert". Dazwischen gibt es eine Fülle von Möglichkeiten, und selbst viele moderne CPUs übersetzen dynamisch als Teil ihres Ausführungskerns.

Selbst wenn Ihr Programm lange vor der Ausführung statisch kompiliert wird, kommt es selten vor, dass der kompilierte Code direkt auf dem Bare-Metal-Computer ausgeführt wird, ohne dass dies unterstützt wird. Das Betriebssystem bietet eine virtuelle Maschine für User-Space-Programme, die häufig Funktionen wie die Illusion bereitstellt, dass Sie eine CPU für sich alleine haben. Die Illusion eines flachen Speicherplatzes, der größer sein könnte als der physische RAM, der an die Maschine angeschlossen ist, wird sogar als "virtueller Speicher" bezeichnet.

Darüber hinaus gibt es eine virtuelle C-Maschine, auch wenn Sie in C programmieren! Es wird traditionell als "C-Laufzeit" oder kurz CRT bezeichnet.

Da C meistens weit im Voraus direkt in Assembly- / Maschinencode übersetzt wird (auf einigen Plattformen kann es auch Thread-Code geben , der als Teil der virtuellen Maschine betrachtet werden kann), muss die virtuelle Maschine in der Regel nur den Start und die Ausführung übernehmen Herunterfahren.

Beim Start werden in der Regel der Stack und der Heap eingerichtet. Das Betriebssystem stellt diese selten zur Verfügung, und es ist Aufgabe der Programmiersprache, sie dem Programmierer zur Verfügung zu stellen. Auf einigen Plattformen wird möglicherweise die Signalverarbeitung initialisiert, der "Haupt" -Thread wird in einer Umgebung mit mehreren Threads eingerichtet, globale Konstruktoren werden ausgeführt, wenn nicht die Wahrscheinlichkeit besteht, dass das Programm mit C ++ - Code verknüpft wurde, und dynamisch verknüpfte Bibliotheken werden verarbeitet Möglicherweise ist eine gewisse Verarbeitung erforderlich, um argc / argv und envp einzurichten. Schließlich übergibt CRT die Kontrolle an main.

Beim Herunterfahren können viele Betriebssysteme einen Prozess unsauber beenden, sodass beim Herunterfahren nicht viel getan werden muss. Die Hauptsache ist, atexit () -Aufrufe für den Fall zu verarbeiten, dass das Programm sauber beendet wird.

Pseudonym
quelle
2
Die C-Laufzeit und die JVM sind völlig verschiedene Biester. Das CRT ist nur eine Bibliothek.
DeadMG
Ich habe die Antwort bearbeitet, um die Dinge etwas klarer zu machen. JVM und VirtualBox sind übrigens auch ganz andere Biester.
Pseudonym
@Pseudonym: eigentlich nicht. Okay, VirtualBox ist ein Virtualizer, während die typische JVM ein Emulator ist. Wenn Sie jedoch zB VirtualBox durch QEmu in Ihrem Satz ersetzen, sind die beiden tatsächlich gleich.
Jörg W Mittag