488 Stimmen

Laufzeit vs. Kompilierzeit

Was ist der Unterschied zwischen Laufzeit und Kompilierzeit?

582voto

Norman Ramsey Punkte 193087

Der Unterschied zwischen Compile-Zeit und Laufzeit ist ein Beispiel für das, was die schlaumeierigen Theoretiker die Phasenunterscheidung nennen. Es ist eines der schwierigsten Konzepte, besonders für Personen ohne viel Hintergrundwissen in Programmiersprachen. Um dieses Problem anzugehen, finde ich es hilfreich, zu fragen

  1. Welche Invarianzen erfüllt das Programm?
  2. Was kann in dieser Phase schief gehen?
  3. Wenn die Phase erfolgreich ist, was sind die Nachbedingungen (was wissen wir)?
  4. Was sind die Eingaben und Ausgaben, wenn vorhanden?

Compile-Zeit

  1. Das Programm muss keine Invarianzen erfüllen. Tatsächlich muss es nicht einmal ein wohlgeformtes Programm sein. Du könntest diesen HTML-Code dem Compiler geben und ihn scheitern sehen...
  2. Was kann zur Compile-Zeit schief gehen:
    • Syntaxfehler
    • Typechecking-Fehler
    • (Selten) Compiler-Abstürze
  3. Wenn der Compiler erfolgreich ist, was wissen wir?
    • Das Programm war wohlgeformt - ein sinnvolles Programm in welcher Sprache auch immer.
    • Es ist möglich, das Programm auszuführen. (Das Programm könnte sofort scheitern, aber zumindest können wir es versuchen.)
  4. Was sind die Eingaben und Ausgaben?
    • Die Eingabe war das zu kompilierende Programm, sowie jegliche Headerdateien, Schnittstellen, Bibliotheken oder anderen Voodoo, die es benötigte, um importiert zu werden, um kompiliert zu werden.
    • Die Ausgabe ist hoffentlich Assembler-Code oder relocatable Object-Code oder sogar ein ausführbares Programm. Oder wenn etwas schief geht, ist die Ausgabe eine Menge Fehlermeldungen.

Laufzeit

  1. Wir wissen nichts über die Invarianzen des Programms - sie sind das, was der Programmierer reingesetzt hat. Laufzeit-Invarianzen werden selten allein durch den Compiler durchgesetzt; er braucht Hilfe vom Programmierer.
  2. Was schief gehen kann sind Laufzeitfehler:

    • Division durch Null
    • Auf einen Null-Zeiger dereferenzieren
    • Kein Speicher mehr verfügbar

    Außerdem kann es Fehler geben, die vom Programm selbst erkannt werden:

    • Versuch, eine Datei zu öffnen, die nicht existiert
    • Versuch, eine Webseite zu finden und festzustellen, dass die angegebene URL nicht wohlgeformt ist
  3. Wenn die Laufzeit erfolgreich ist, beendet das Programm (oder läuft weiter) ohne Abstürzen.
  4. Eingaben und Ausgaben liegen ganz beim Programmierer. Dateien, Fenster auf dem Bildschirm, Netzwerkpakete, Jobs, die an den Drucker gesendet werden, was auch immer. Wenn das Programm Raketen abschießt, ist das eine Ausgabe und passiert nur zur Laufzeit :-)

15 Stimmen

Sehr gute Antwort für das, was es abdeckt (+1), jedoch gehst du nicht einmal auf die Meta-Programmieraspekte von Compile-Zeit vs. Laufzeit ein und das ist meiner Meinung nach der interessanteste Teil. Ich gebe zu, dass es außerhalb dessen liegen könnte, wonach der OP gesucht hat, da diese Antwort akzeptiert wurde.

5 Stimmen

Schön, wenn mich jemand danach in meinen Vorlesungen fragt, werde ich deine Antwort verwenden :-)

13 Stimmen

Das ist eine wirklich gute Antwort. Sie ist ziemlich klar und verständlich. Es ist nicht leicht, so klare Antworten in Google zu finden.

256voto

pufferfish Punkte 15359

Ich denke in Bezug auf Fehler und wann sie auftreten können.

Kompilierzeit:

string mein_wert = Console.ReadLine();
int i = mein_wert;

Einem String-Wert kann keine Variable vom Typ int zugewiesen werden, daher weiß der Compiler sicher zur Kompilierzeit, dass dieser Code ein Problem hat

Ausführungszeit:

string mein_wert = Console.ReadLine();
int i = int.Parse(mein_wert);

Hier hängt das Ergebnis davon ab, welcher String von ReadLine() zurückgegeben wurde. Einige Werte können zu einem int geparst werden, andere nicht. Dies kann nur zur Ausführungszeit bestimmt werden

102 Stimmen

Jetzt ist das etwas, das wir alle verstehen können. Keine allgemeinen technischen Müllwörter hier. Schön.

0 Stimmen

Für eine iPhone-App: Ist die Kompilierungszeit das erste Mal, dass der Code vom Entwickler in eine .app-Erweiterung kompiliert wird? oder passiert es bei jedem Start der App durch den Benutzer?

1 Stimmen

@Honig, es wird das erste Mal vom Entwickler in eine .app kompiliert.

113voto

Yuval Adam Punkte 155168

Kompilierungszeit: die Zeitspanne, in der Sie als Entwickler Ihren Code kompilieren.

Ausführungszeit: die Zeitspanne, in der ein Benutzer Ihre Software ausführt.

Brauchen Sie eine klarere Definition?

17 Stimmen

@BCS: Der OP hatte möglicherweise eine äußerst einfache Einführung in die Programmierung mit einer interpretierten oder Byte-Compile-dann-Ausführung-in-einem-Schritt-Sprache, sodass die Unterscheidung nie erforderlich war. Die Frage ist naiv, aber nicht dumm.

1 Stimmen

@dmckee: Ich denke, diese Antwort wäre nicht einmal nützlich für Ihren Benutzer, da sie keinen zusätzlichen Informationsgehalt als die originale Frage hat. Jeder, der die Frage stellt, die diese Antwort beantwortet, hat kein Geschäftsfeld (and I don't denke, dass der OP das gefragt hat).

0 Stimmen

Ich habe eine schnelle Frage. Wenn jemand sagt, dass ein typischer Laufzeitfehler durch Nullteilen entsteht, aber was ist, wenn Sie eine Variable haben, sagen wir int x = 3/0, aber Sie nichts mit dieser Variablen machen. Wir drucken es nicht oder tun etwas damit. Wird das trotzdem als Laufzeitfehler betrachtet?

25voto

M4N Punkte 92235

(bearbeiten: Das Folgende gilt für C# und ähnliche, stark typisierte Programmiersprachen. Ich bin mir nicht sicher, ob dir das hilft).

Zum Beispiel wird der folgende Fehler vom Compiler (zur Kompilierungszeit) erkannt, bevor du ein Programm ausführst, und führt zu einem Kompilierungsfehler:

int i = "string"; --> Fehler zur Kompilierungszeit

Andererseits kann ein Fehler wie der folgende nicht vom Compiler erkannt werden. Du erhältst einen Fehler/eine Ausnahme zur Ausführungszeit (wenn das Programm ausgeführt wird).

Hashtable ht = new Hashtable();
ht.Add("key", "string");
// der Compiler weiß nicht, was im Hashtable unter dem Schlüssel "key" gespeichert ist
int i = (int)ht["key"];  // --> Ausnahme zur Ausführungszeit

0 Stimmen

Ausnahmen. Hashtable war eine, aber ich fand den größten Schritt war von .net 1.1 zu .net 2.0, von ungetypten zu getypten Datensätzen (und jetzt linq) zu gehen. Der Versuch, ein defektes Formular mit einer zwielichtigen Datenbank zu debuggen, hat mich früher sehr traurig gemacht!

24voto

Die Übersetzung des Quellcodes in Ereignisse, die auf dem Bildschirm, der Festplatte oder im Netzwerk stattfinden, kann (ungefähr) auf zwei Arten erfolgen: Kompilieren und Interpretieren.

In einem kompilierten Programm (Beispiele sind C und Fortran):

  1. Der Quellcode wird in ein anderes Programm eingegeben (normalerweise Compiler genannt - verständlicherweise), das ein ausführbares Programm (oder einen Fehler) erzeugt.
  2. Das ausführbare Programm wird ausgeführt (durch Doppelklicken oder Eingeben seines Namens an der Befehlszeile).

Dinge, die im ersten Schritt passieren, heißen "Kompilierungszeit", Dinge, die im zweiten Schritt passieren, heißen "Laufzeit".

In einem interpretierten Programm (Beispiel MicroSoft Basic (auf DOS) und Python (denke ich)):

  1. Der Quellcode wird in ein anderes Programm eingegeben (normalerweise Interpret genannt), das es direkt "ausführt". Hier dient der Interpret als Zwischenschicht zwischen Ihrem Programm und dem Betriebssystem (oder der Hardware in wirklich einfachen Computern).

In diesem Fall ist der Unterschied zwischen Kompilierungszeit und Laufzeit eher schwieriger zu bestimmen und viel weniger relevant für den Programmierer oder Benutzer.

Java ist eine Art Hybrid, bei dem der Code in Bytecode kompiliert wird, der dann auf einer virtuellen Maschine läuft, die normalerweise ein Interpreter für den Bytecode ist.

Es gibt auch einen Zwischenfall, bei dem das Programm in Bytecode kompiliert und sofort ausgeführt wird (wie bei Awk oder Perl).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X