Was ist der Unterschied zwischen Laufzeit und Kompilierzeit? [geschlossen]

8

Was ist eine Laufzeit? Ist es eine virtuelle Maschine, die halb kompilierten Code ausführt, der auf einem bestimmten Prozessor nicht ausgeführt werden kann. Wenn ja, was ist eine virtuelle Maschine? Ist es eine andere Software, die den halb kompilierten Code weiter in maschinenspezifischen Code übersetzt? Was ist, wenn wir über eine dieser Sprachen sprechen, die nicht auf Zwischencode kompiliert werden, sondern direkt in Maschinencode übersetzen / kompilieren? Was ist eine Laufzeit in dieser Situation? ist es die Hardware (CPU und RAM)?

Was ist der Unterschied zwischen Kompilierzeit und Laufzeit? Sind sie Phasen eines Software-Lebenszyklus? Ich meine, ein Programm ist ursprünglich ein Haufen Textdateien, richtig? Also kompilieren oder übersetzen Sie diese in eine Form von Daten, die dann entweder in den Speicher geladen und vom Prozessor ausgeführt werden können, oder wenn es sich um eine "verwaltete" Sprache handelt, dann würde eine weitere Kompilierung erforderlich sein, bevor sie auf Hardware ausgeführt werden kann. Was genau ist eine verwaltete Sprache?

Schließlich gibt es so etwas wie Debug-Zeit und was ist das?

Ich bin in meinem ersten Semester Informatik zu studieren, und es verwirrt mich wirklich, wie unlogisch Dinge gelehrt werden. "Information" wird mir in den Hals geschoben, aber wenn ich versuche, aus allem einen Sinn zu machen, indem ich alles in ein einziges System von klar definierten Komponenten und Beziehungen organisiere, bleibe ich stecken.

Vielen Dank im Voraus, Garrett

    
Garrett Biermann 07.04.2013, 22:11
quelle

3 Antworten

10

Die Art von Code, der für das menschliche Denken geeignet ist (wir nennen ihn "Quellcode"), muss mehrere Übersetzungsstufen durchlaufen, bevor er von der zugrunde liegenden Hardware (wie CPU oder GPU) physikalisch ausgeführt werden kann:

  1. Quellcode.
  2. [Optional] Zwischencode (wie .NET MSIL oder Java Bytecode).
  3. Maschinencode, der der Befehlssatzarchitektur entspricht.
  4. Der Mikrocode, der die logischen Gatter tatsächlich in Silizium dreht.

Diese Übersetzungen können in verschiedenen Phasen des "Lebenszyklus" des Programms durchgeführt werden. Zum Beispiel könnte eine bestimmte Programmiersprache oder ein bestimmtes Tool die Übersetzung von 1 zu 2 wählen, wenn der Entwickler "erstellt" "das Programm und übersetzen von 2 zu 3 , wenn der Benutzer es" ausführt "(was normalerweise von eine Software namens "virtuelle Maschine" 1 , die auf dem Computer des Benutzers vorinstalliert werden muss. Dieses Szenario ist typisch für "verwaltete" Sprachen wie C # und Java.

Oder es könnte von 1 direkt zu Build-Zeit in 3 übersetzt werden, wie es für "native" üblich ist. Sprachen wie C und C ++.

Die Übersetzung zwischen 3 und 4 erfolgt fast immer über die zugrunde liegende Hardware. Es ist technisch ein Teil der "Laufzeit", aber in der Regel abstrahiert und für den Entwickler weitgehend unsichtbar.

Der Begriff "Kompilierzeit" bezeichnet normalerweise die Übersetzung von 1 nach 2 (oder ) 3 ). Es gibt bestimmte Überprüfungen, die während der Kompilierung durchgeführt werden können, bevor das Programm tatsächlich ausgeführt wird, z. B. um sicherzustellen, dass die an eine Methode übergebenen Argumente mit den angegebenen Methodenmethoden übereinstimmen (vorausgesetzt, die Sprache ist "stark typisiert"). Je früher der Fehler aufgefangen wird, desto einfacher ist es zu beheben, aber dies muss mit der Flexibilität ausgeglichen werden, weshalb einige "Scripting" -Sprachen keine umfassenden Prüfungen zur Kompilierungszeit aufweisen.

Der Begriff "Laufzeit" bezeichnet normalerweise die Übersetzung von 2 (oder 3 ) Weg nach unten zu 4 . Es ist sogar möglich, direkt von 1 zur Laufzeit zu übersetzen, wie es bei so genannten "interpretierten Sprachen" der Fall ist.

Es gibt bestimmte Arten von Problemen, die zur Kompilierzeit nicht abgefangen werden können, und Sie müssen geeignete Debugging-Techniken verwenden (z. B. Debugger, Protokollierung, Profiler usw.), um sie zur Laufzeit zu identifizieren. Das typische Beispiel für einen Laufzeitfehler ist, wenn Sie versuchen, auf ein Element einer Sammlung zuzugreifen, das nicht vorhanden ist, das sich dann zur Laufzeit als Ausnahme manifestieren kann und eine Folge des Ausführungsablaufs ist, der für den Compiler zu komplex ist zur Kompilierzeit "vorhersagen".

Die "Debug-Zeit" ist einfach eine Laufzeit, während der Debugger an das laufende Programm angehängt ist (oder Sie überwachen das Debug-Protokoll usw.).

1 Verwechseln Sie das nicht mit virtuellen Maschinen, die nativen Code wie VMware oder Oracle VirtualBox ausführen sollen.

    
Branko Dimitrijevic 07.04.2013 22:48
quelle
4

Die Kompilierzeit und die Laufzeit beziehen sich normalerweise auf Prüfungen, wenn Fehler auftreten. Zum Beispiel werden in einer statisch typisierten Sprache wie C # die statischen Typprüfungen zur Kompilierzeit durchgeführt. Das bedeutet, dass Sie die Anwendung nicht kompilieren können, wenn Sie beispielsweise versuchen, einer int-Variablen eine Zeichenfolge zuzuweisen. Die Laufzeit bezieht sich andererseits auf die Zeit, zu der der Code tatsächlich ausgeführt wird. Zum Beispiel werden Ausnahmen immer zur Laufzeit ausgelöst.

Wie für virtuelle Maschinen und so; C # ist eine Sprache, die in die Common Intermediate Language (CIL oder IL) übersetzt wird. Das Ergebnis ist ein Code, der unabhängig davon ist, welche .NET-Sprache Sie verwenden (C # und VB.NET erzeugen beide IL). Das .NET Framework führt diese Sprache dann zur Laufzeit mit Just-in-time-Kompilierung aus. Sie können das .NET Framework als virtuelle Maschine sehen, die eine spezielle Subsprache für den Zielcomputercode ausführt.

Wie für die Debug-Zeit, glaube ich nicht, dass es so etwas gibt, da Sie das Programm beim Debuggen immer noch ausführen. Wenn überhaupt, würde Debug-Zeit Laufzeit mit einem angehängten Debugger sein. Aber Sie würden einen solchen Begriff nicht verwenden.

    
poke 07.04.2013 22:20
quelle
2

Kompilierzeit - Der Zeitraum, in dem ein Compiler versucht, einen Code zu kompilieren. Beispiel: "Der Compiler hat beim Kompilieren 3 Typfehler gefunden, die das Kompilieren des Programms verhindert haben."

Runtime - Der Zeitraum, in dem ein Programm ausgeführt wird. Beispiel: "Wir haben den Fehler erst zur Laufzeit erkannt, weil es sich um einen logischen Fehler handelte."

Run-Time und virtuelle Maschinen sind zwei getrennte Ideen - Ihre erste Frage ergibt keinen Sinn für mich.

Virtuelle Maschinen sind in der Tat Softwareprogramme, die "Objekt" [Java, C #, usw.] -Code in Byte-Code übersetzen, der auf einer Maschine ausgeführt werden kann. Wenn eine Sprache eine virtuelle Maschine verwendet, verwendet sie oft auch die Just-In-Time-Kompilierung - was bedeutet, dass die Kompilierungszeit und die Laufzeit im Wesentlichen zur gleichen Zeit stattfinden.

Umgekehrt werden kompilierte Sprachen wie C, C ++ normalerweise in Byte-Code kompiliert, bevor sie auf einer Maschine ausgeführt werden. Daher sind Kompilierzeit und Laufzeit vollständig voneinander getrennt.

Im Allgemeinen "verwaltete" Sprachen haben Garbage Collection (Sie manipulieren Speicher nicht direkt mit Zuweisungen und De-Allocation [Java und C # sind beide Beispiele]) und laufen auf irgendeinem Typ von virtueller Maschine.

    
Peter Geiger 07.04.2013 22:27
quelle