2016-09-04 35 views
6

Przeczytałem, że interpreter uruchamia linię kodu po linii i zgłasza błąd w tym samym czasie i zatrzymuje dalszą realizację. Tak w Pythonie, należy rozważyć plik ex1.py,W jaki sposób interpreter python uruchamia linię kodu po linii w poniższym kodzie?

print "Hello world" 
12variable = 'bye' 
print 12variable 

Teraz w zależności od warunków eksploatacji tłumacza, interpreter będzie uruchomienie pierwszej linii tj wypisuje hello world, a potem pokazać błąd składni w następnej linii (linia praca w linii). Stąd oczekiwany wynik to:

Hello world 
12variable = 'bye' 
     ^
SyntaxError: invalid syntax 

Ale rzeczywista moc jest -

12variable = 'bye' 
     ^
SyntaxError: invalid syntax 

Dlaczego nie drukuje Hello World na pierwszym?

+0

Gdzie to przeczytałeś? –

+0

Przeczytałem o tym początkowo w mojej książce podstaw komputerowych. – dlp96

Odpowiedz

5

To zależy od sposobu uruchomienia interpretera Pythona. Jeśli podasz mu pełny plik źródłowy, najpierw przeanalizuje cały plik i przekształci go na bajt przed wykonaniem jakiejkolwiek instrukcji. Ale jeśli karmisz go wiersz po wierszu, będzie analizować i wykonać kod blok za blokiem:

  • python script.py: analizowania pełny plik
  • python < script.py: analizowania i wykonanie przez blok

Drugi to zazwyczaj sposób, w jaki używasz go interaktywnie lub przez powłokę GUI, taką jak idle.

2

Ponieważ Twoje zrozumienie interpretatora jest błędne. O ile możliwe jest zachowanie, które opisujesz, dla podzbioru błędów, to nie jest tak często w przypadku wielu (większości?) Błędów.

Jeśli tłumacz może skonstruować to, co uważa za poprawny program, ale wystąpił błąd w czasie wykonywania, wtedy to, co opisujesz, będzie miało miejsce.

Ponieważ wskazany przypadek jest błędem składni, który uniemożliwia skonstruowanie poprawnego programu, zachowanie jest takie, jakie jest widoczne.

+0

Co to znaczy, że interpreter wykonuje linię kodu po linii? Czy to oznacza, że ​​parsuje jedną linię naraz i wykonuje linię, czy też parsuje po prostu jedną linię naraz i jeśli nie ma żadnego błędu składniowego, przechodzi do kolejnej linii, aby parsować, a następnie po przeanalizowaniu całego pliku, wykonuje kod bajtowy pod warunkiem, że nie wystąpił żaden błąd w żadnej linii? – dlp96

+1

Analizuje cały program. Jeśli napotka błąd, który uniemożliwia utworzenie prawidłowego kodu bajtowego, wówczas generuje błąd na tym etapie, a wiersze programu nigdy nie są uruchamiane. Jeśli uda mu się skonstruować to, co uważa za poprawną wersję kodu bajtowego programu, uruchamia program. Jeśli napotkany zostanie błąd środowiska wykonawczego, zgłoszony zostanie błąd i program zostanie zatrzymany w wierszu napotkanym błędu. – jwpfox

5

To mit, że Python jest w pełni zinterpretowanym językiem. Kiedy CPython uruchamia skrypt, kod źródłowy jest przetwarzany (tutaj przechwytuje błędy składni) i kompilowany do kodu bajtowego (czasami są one buforowane w katalogu jako pliki .pyc), zanim cokolwiek zostanie wykonane. Pod tym względem Python nie różni się zasadniczo od Javy lub C#, ponieważ nie spędza dużo czasu na optymalizacjach i uważam, że kod bajtowy jest interpretowany jako jedna instrukcja na raz, zamiast być JITed na kod maszynowy (chyba że używasz czegoś takiego jak PyPy).

0

Rozumiem to w ten sposób:

Python uruchamia linię kodu po linii po Jest w stanie kodu bajtowego.

Różnica między tą rzeczą a kompilacją (w innych językach, takich jak C++) polega na tym, że musisz wykonać ten proces interpretacji za każdym razem, gdy uruchamiasz skrypt.

Interpreter języka Python interpretuje kod przy każdym uruchomieniu skryptu.

W C++ kompilujesz program i możesz go wykonać bez konieczności kompilowania go, chyba że chcesz zmienić system.