Zeitpunkt der Fehlererkennung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Stamp1t
User
Beiträge: 2
Registriert: Dienstag 29. August 2023, 12:08

Hallo, ich bin gerade bezüglich der verschiedenen Zeitpunkt der Fehlererkennung in Python verwirrt...
Erstmal für mein Verständnis:
Python übersetzt den geschriebenen Code erstmal in Bytecode und diese Zeit wird "Übersetzung" genannt. Danach folgt die zeilenweise Interpretation des Codes. Das ist dann die Runtime. Von einer strengen Kompilierung wie in Java kann man in Python nicht sprechen. Habe ich bis hier hin alles richtig verstanden?
Dann zu meinem nächsten Problem:
Ich verstehe nicht ganz, zu welchem Zeitpunkt in Python verschiedene Fehler erkannt werden.
Ein Syntax Error müsste doch beispielsweise bei der Übersetzung erkannt werden oder? Weil Python kann ja keinen grammatikalisch falschen Code übersetzen. In meinem Skript steht jedoch, dass Python Syntax Errors dann erkennt, wenn der Interpreter bei der fehlerhaften Zeile ankommt (und den Code bis dahin ausführt). Was davon stimmt nun?
Statisch-semantische sowie dynamisch-semantische Fehler müssten meinem Verständnis nach bei der Runtime erkannt werden, weil ja beispielsweise bei einem Zugriff auf eine undefinierte Variable kein grammatikalischer Fehler begannen wurde und somit der Code problemlos übersetzt werden kann.
Danke für jede Hilfe!
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du mit "strenger Kompilierung"?
Python übersetzt den Code automatisch vor der Ausführung, so dass kein separater Kompileraufruf nötig ist. Der entstandene Bytecode wird dann ähnlich wie bei Java interpretiert. Da der Bytecode keine Zeilen kennt, ist macht "zeilenweise Interpretation" keinen Sinn.
Ein syntaktisch falscher Code kann nicht übersetzt werden.
Bei dynamischen Sprachen können viele semantische Fehler erst zur Laufzeit erkannt werden, und auch hier macht "fehlerhafte Zeile" wieder keinen Sinn, denn der Bytecode kennt keine Zeilen.
Der Compiler speichert aber die Zeile und Spalte, welche zu welchem Bytecode übersetzt wurde, so dass Python bei Fehlermeldungen wieder die ursprüngliche Python-Datei laden kann und die passende Zeile dazu anzeigen kann.
Benutzeravatar
snafu
User
Beiträge: 6753
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ergänzend dazu: Dass bei einem SyntaxError keine Übersetzung stattfindet, sieht man auch daran, dass keine neue pyc-Datei erzeugt wird. Da kommt es somit gar nicht erst zur Laufzeit. Ist vielleicht etwas ungewohnt, wenn man von einer Sprache kommt, die Kompilierung und Ausführung für den Programmierer deutlicher voneinander trennt. Andererseits will man ja meistens Kompilieren und Ausführen unmittelbar im Anschluss. Insofern ist das schon ganz praktisch, hierfür nur einen Befehl benutzen zu müssen. und wenn sich nichts am Quellcode verändert hat, dann wird natürlich auch nicht erneut kompiliert (ähnlich wie bei anderen Sprachen).
Benutzeravatar
noisefloor
User
Beiträge: 3882
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

simples Beispiel: der folgende Code hat zwei Fehler

Code: Alles auswählen

print('running')
some_var = 1
if some_var
    print(foo)
Der fehlende Doppelpunkt bei if-Statement wird erkannt, bevor / während der Bytecode erzeugt wird und die Ausführung / Übersetzung wird abgebrochen. Wenn du da einen : hin machst wird der Code übersetzt, weil er formell ok ist. Zur Laufzeit erkennt der Python-Interpreter dann, dass `foo` nicht definiert ist und wirf eine Fehlermeldung.

Beim ersten Fehler erhältst du ein Fehlermeldung, beim 2. Fehler zur Laufzeit einen Stack-Trace mit Fehlermeldung. Daran kannst du (auch) erkennen, in welchem Schritt der Ausführung du gerade bist.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Stamp1t: Im Grunde ist nicht spezifiziert ob es eine Übersetzungsphase gibt oder wie die aussieht wenn es sie denn gibt, denn im Gegensatz zu beispielsweise Java ist der Bytecode ein Implementierungsdetail. Den muss es nicht geben, es könnte auch in einen AST übersetzt werden, der dann ausgeführt wird, oder tatsächlich eine zeilenweise Interpretation des Quelltextes zur Laufzeit. Das heisst wann ein Syntaxfehler erkannt werden muss, ist gar nicht so klar definiert.

Aber ich vermute mal wir reden von CPython, der konkreten, in C geschriebenen Implementierung, die man bei python.org bekommt‽ Dann gibt es eine Übersetzung in Bytecode, die sehr ähnlich der Übersetzung von Java in Bytecode ist. Ausgeführt wird dieser Bytecode, wo man dann aber nicht von zeilenweiser Interpretation sprechen kann. Der Bytecode hat noch Metainformation um im Fehlerfall zurückverfolgen zu können welche Quelltextzeile zu dem Bytecode geführt hat, aber dass das in der Regel sehr gut funktioniert, liegt nur daran, dass es wenig Optimierungen gibt, die auf den Bytecode angewandt werden, und dabei keine Transformationen vorkommen, die viel durcheinander bringen würden.

Man muss noch beachten wann übersetzt wird: automagisch beim (ersten) Import eines Moduls, das heisst das Programm läuft bereits wenn Module importiert werden. Vielleicht meintest Du das mit dem Unterschied zu Java. Denn ansonsten ist das so ziemlich analog was da passiert.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Benutzeravatar
Kebap
User
Beiträge: 696
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ich vermute, das Skript ist hier schlicht falsch oder ungenau, und meint gar nicht (spezifisch) "Syntax" Errors bei der Beschreibung der Fehlererkennung.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten