2016-09-04 214 views
6

我讀過解釋器逐行運行代碼,並且如果有的話同時報告錯誤並停止進一步的執行。 因此,在蟒蛇,認爲文件ex1.pypython解釋器如何在下面的代碼中逐行運行代碼?

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

現在根據翻譯的工作,解釋將運行第一線即它打印Hello World,然後再顯示在下一行的語法錯誤(線逐行工作)。因此,預期成果是:

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

但實際產量 -

12variable = 'bye' 
     ^
SyntaxError: invalid syntax 

爲什麼不打印Hello World在第一?

+0

你從哪裏讀到的? –

+0

我最初在我的計算機基礎知識書中已經閱讀過它。 – dlp96

回答

5

這取決於你如何運行Pythoninterpréter。如果你給它一個完整的源文件,它將首先解析整個文件並在執行任何指令之前將其轉換爲字節碼。但是,如果你通過線餵它線,它將解析,並通過集團執行代碼集團:

  • python script.py:解析完整的文件
  • python < script.py:解析和集團執行

的後者通常是交互式或通過GUI外殼使用它的方式,如idle

2

因爲你對翻譯的理解是錯誤的。儘管您所描述的行爲可能會出現一部分錯誤,但對於許多(大多數)錯誤而言,這並不常見。

如果解釋器可以構建它認爲是有效的程序,但在運行時出現錯誤,那麼您正在描述的內容將會發生。

由於您指出的情況是一種語法錯誤,它會阻止正在構建的有效程序的行爲與您看到的一樣。

+0

這是什麼意思解釋器逐行執行代碼?這是否意味着它一次解析一行並執行該行,或者它一次只解析一行,如果沒有任何語法錯誤,則移至下一行進行解析,然後解析完整個文件後執行字節碼規定在任何行中都沒有任何錯誤? – dlp96

+1

它解析整個程序。如果遇到阻止創建有效字節碼的錯誤,則會在該階段引發錯誤,並且程序的任何行都不會運行。如果它設法構建它認爲是該程序的有效字節碼版本,那麼它將運行該程序。如果遇到運行時錯誤,則會引發錯誤並停止在遇到錯誤的行處執行程序。 – jwpfox

5

Python是一種完全解釋的語言,這是一個神話。當CPython運行腳本時,會解析源代碼(這是它會捕獲語法錯誤的地方),並在執行任何操作之前將其編譯爲字節碼(有時這些緩存在您的目錄中作爲.pyc文件)。在這方面,Python與Java或C#並不完全不同,它不會花費太多時間進行任何優化,並且我相信字節碼一次只能解釋一條指令,而不是被JIT編譯爲機器代碼(除非你正在使用類似PyPy的東西)。

0

我的理解是這樣:

的Python運行後線代碼行是在字節碼狀態。

這個東西和編譯(在其他語言如C++中)的區別在於,每次運行腳本時都必須執行這個解釋過程。

Python解釋器每次運行腳本時都會解釋代碼。

在C++中編譯程序,您可以執行它,無需再次編譯它,除非您想更改系統。