回答
幾乎沒有口譯員真的直接解釋代碼 - 它的效率太低了。幾乎所有的解釋器都使用一些可以輕鬆執行的中間表示。此外,可以對此中間代碼執行小型優化。
Python還存儲了這個代碼,這對下次執行代碼具有巨大的優勢:Python不必再解析代碼;解析是編譯過程中最慢的部分。因此,字節碼錶示相當大地減少了執行開銷。
即使我的TRS-80上的舊MS BASIC使用了一種非常簡單的編碼方案:只要我輸入或編輯了一行,BASIC關鍵字就被摺疊爲單個字節。 – 2009-07-27 17:46:39
@DavidThornley:1980年代的許多計算機都使用MS-Basic的衍生產品,它將關鍵字轉換爲記號,但是保留了文本形式的數字和變量名稱,因此必須計算它們的值或在運行時查看它們。 Atari BASIC做了更多的處理,建立一個變量表並用索引替換它們的名字。它還將數字轉換爲BCD浮點數。只有字符串文字和評論被存儲爲文本。這樣的事情可能會讓Atari BASIC超越其他,除了每行的編號被存儲爲二進制,但GOTO的目標...... – supercat 2014-01-29 16:59:52
...被存儲爲BCD浮點,所以每個GOTO都需要一個BCD到二進制的轉換。不過,有趣的是,Atari BASIC的作者將程序轉換爲解析表示,而不是簡單地用關鍵詞替換關鍵詞。 – supercat 2014-01-29 17:01:34
因爲直接從字節碼解釋更快。首先,它避免了需要進行練習。
因爲您可以編譯爲.pyc
一次並從中解釋很多次。
因此,如果您多次運行腳本,只會產生一次解析源代碼的開銷。
一遍又一遍地重新解析和分析源代碼,而不是僅僅執行一次(通常在第一個import
上),顯然是一個愚蠢和毫無意義的浪費。
我非常懷疑,原因是性能,儘管這是一個很好的副作用。我會說,認爲圍繞某種高級彙編語言構建的虛擬機比在某些源代碼字符串中查找和替換文本更實用是很自然的。
編輯:
好了,顯然,誰沒有把在我的崗位-1票不留一個合理的評論,說明知之甚少虛擬機(運行時環境)。
雖然有一個小的效率方面是它(可以字節碼存儲在磁盤上或在存儲器中),其主要是工程:它允許分開解釋解析。解析器通常是令人討厭的生物,充滿了邊緣情況,不得不遵守隱祕的規則,比如只使用適量的預測和解決移位減少問題。相比之下,解釋非常簡單:它只是一個使用字節碼操作碼的大開關語句。
- 1. 1. Java不是編譯語言,但是它是解釋語言。怎麼樣? (因爲我們在運行之前將代碼編譯爲字節碼)
- 2. 爲什麼java解釋代碼是否可以編譯它?
- 3. 爲什麼此代碼與免費的monad解釋器編譯?
- 4. 在編譯器將其轉換爲字節碼之前,是否可以從jython中找到java源代碼?
- 5. 語言在網絡從源代碼解釋字節碼與
- 6. 將Java源代碼翻譯爲字節碼時的優化
- 7. 解釋爲networkx代碼python
- 8. 將源代碼從ARMv5編譯爲ARMv6
- 9. 我應該使用什麼工具將Java字節碼反編譯爲Java源代碼?
- 10. 爲什麼我無法在手機上編譯源代碼?
- 11. 爲什麼在編譯時刪除u-boot源代碼?
- 12. 在編譯之前修改Gradle構建的Groovy源代碼
- 13. 在NetBeans和Ant中編譯之前過濾源代碼
- 14. 在ubuntu中編譯/編譯源代碼
- 15. 在執行之前攔截python解釋器代碼
- 16. 此代碼爲什麼編譯失敗?
- 17. 這段代碼爲什麼要編譯?
- 18. 這個C代碼爲什麼編譯?
- 19. 爲什麼不編譯這個代碼?
- 20. 這段代碼爲什麼不編譯?
- 21. ASP.NET嘗試編譯註釋的代碼行。爲什麼?
- 22. python字節碼解釋器實現
- 23. 從源代碼編譯內核。錯誤解釋。
- 24. 爲什麼下面的代碼在VS2010中成功編譯?
- 25. 將源代碼轉換爲Java字節碼的實用程序是什麼
- 26. 在編譯之前用Python代碼進行原型設計
- 27. 如何將Java源代碼轉換爲字節代碼?
- 28. 提前編譯代碼和本機編譯代碼之間的區別是什麼
- 29. 像Python一樣,可以將Ruby編譯爲字節碼嗎?
- 30. 爲什麼這個代碼不能在打字稿中編譯?
聽起來像給我作業。 – 2009-05-20 14:08:42