2017-08-26 64 views
-4

只是好奇,想知道這是有可能在充分詮釋方式,其中編譯可以跳過如何繞過編譯階段

+0

是的......打開一個REPL會話並代碼。 –

回答

0

假設你指到Python的默認實現運行python程序運行python程序您不能跳過編譯

當您運行命令:

python <script-name>.py 

的Python(在一個非常廣泛和根本的意義上)執行下列操作步驟:

  1. Python中首先分析你代碼文件。結果是一個抽象語法 樹(又名AST)。
  2. AST然後傳遞給Python編譯器。 Python編譯器 爲Python虛擬機生成字節碼。
  3. 然後虛擬機執行代碼。

第二步在Python解釋器過程中至關重要。沒有它,你堅持使用AST,虛擬機沒有什麼可執行的。彙編是一個必要的過程。這不是可選的,它是強制性的

2

要完全回答這個問題,因爲它的模糊性,將需要比我有時間更仔細的答案,但備案:

  • CPython的執行編譯源模塊爲字節碼。
  • 當一個模塊是進口的,解釋查找編譯字節碼 文件比源更新,並使用它,如果發現
  • 否則解釋試圖寫入模塊的編譯的字節代碼 它會在未來的進口被發現 - 無法寫入文件是 不是錯誤。
  • 字節碼由解釋器的eval循環解釋,而不是 翻譯成機器碼。

其他實現具有其他特徵。

優化的Python的PyPy實現使用JIT技術將Python編譯爲可執行的機器代碼,但我不知道它是否會嘗試緩存JIT編寫的代碼。我懷疑這樣做是不明智的,因爲每次運行的優化很可能不同。

IronPython實現編譯爲.NET CLR字節碼,我相信這可以進一步優化。

Jython以Java虛擬機字節碼爲目標,並且許多JVM實現在每次運行的基礎上再次應用JIT技術。

+1

啊,好主意提到其他Python的實現。我也許錯誤地認爲OP只專指CPython。+1 –

+0

人們經常會這樣做,但問題可能在於緩存字節碼或編譯爲機器碼。 – holdenweb