2015-04-27 81 views
1

Google's Python Class讀取使用Python解釋器時,是否使用了編譯器?

Python是一種動態的,解釋(字節碼編譯)語言

我知道一個解釋是什麼,知道什麼是字節碼,但兩人似乎在一起並不合適。在doing some reading之後,它變得更清楚一點,基本上Python源代碼在解釋之前自動編譯;但出現了一些新問題。

使用Python Interpreter時是否沒有編譯?如果是這樣,什麼時候?例如,如果您只是在命令行輸入代碼,並且每次按Enter時都會運行代碼,那麼編譯器何時有機會完成其工作?

在鏈接

另外質疑以上,@delnan給出了一個編譯器的一個非常廣泛的定義

編譯器是更普遍的是,在一個 編程語言中的程序轉換成在一程序的程序另一種編程語言 ...的JIT編譯器編譯爲本地機器代碼在運行時

我想我的問題是:什麼是一個解釋器和編譯器自動的區別?爲了細化這個問題,如果編譯Python,爲什麼不編譯所有的機器代碼(或彙編,因爲我知道編寫能夠生成純機器代碼的編譯器很困難)?

+0

你是什麼意思的自動編譯器? – igon

+0

@igon我的紅色Python有一個編譯器,但我在創建用Python編寫的程序時肯定已經明確地使用它。 「Python有一個編譯器!你只是沒有注意到它,因爲它會自動運行。」來自http://programmers.stackexchange.com/questions/136942/why-doesnt-python-need-a-compiler。我的觀點是,這不會和翻譯一樣嗎? – Celeritas

回答

1

也許最好忘記語義,並試着學習Cpython實際上在做什麼。當您調用Cpython二進制文件時,它會執行一些操作。一般而言,您可以期望將您編寫的代碼轉換爲bytecode instructions的序列。這是人們有時會參考python代碼的「編譯」階段。這是一種更緊湊,更高效的方式來告訴口譯員要做什麼而不是手寫代碼。通常,python會緩存這些文件以便在.pyc文件中重複使用(如果關聯的.py文件較新,則只能重新生成)。您可以將python字節碼視爲python虛擬機可以運行的一組指令 - 從很多方面來說,這與Java獲得的內容並不完全相同。當人們談論編譯語言時(例如C),編譯器的工作就是將您的代碼轉換爲一組將直接在您的計算機硬件上運行的指令。 Cpython和Java等語言具有額外的間接級別(例如虛擬機)。虛擬機直接在計算機的硬件上運行,並負責解釋域特定的語言。

與標準的「編譯」語言(例如CFortran)相比,這個階段真的很輕量級,而python並沒有做很多「傳統」編譯器會做的檢查(例如類型檢查)。它幾乎只檢查語法,並使用the peephole optimizer進行一些非常簡單的優化。

相關問題