爲什麼具有動態類型語言的程序通常會被解釋而不是編譯?口譯員和動態類型語言
回答
簡而言之:他們像豌豆和胡蘿蔔一起去。
編譯與解釋和語言輸入基本上是分開的擔憂,因爲你可以有所有可能的排列。另一方面,選擇編譯和不爲語言設計選擇動態類型的「原因」通常是相同的:性能。選擇動態輸入和解釋的「原因」也有些相關。
這不是一條硬性規定。你總是可以混合起來。例如,您可以編譯Perl和Lisp,並解釋C.
每動態類型語言的定義...
一種編程語言是說當其大部分類型檢查在運行時執行如在編譯時不是被動態類型。在動態類型中,值有類型,但變量不是;也就是說,一個變量可以指任何類型的值。
這就是說,它變得很難知道什麼向編譯程序下來,因爲它可以在運行時更改。從這裏維基百科的另一個摘錄...
動態類型允許構造是 一些靜態類型檢查會拒絕 爲非法。例如,可以執行任意 數據作爲代碼的函數。 此外,動態類型更好 容納過渡代碼和 原型設計,諸如允許 佔位符數據結構(模擬 對象),以在 地方一個完整的數據結構 (通常爲 實驗的目的透明地使用和測試)。
我覺得這個答案仍然不完整,但我希望它指出你在正確的方向。也許這裏的其他人可以擴展這一點。
檢查類型一次實際上是什麼使「編譯器」(〜型檢查器)。
當類型是「動態」時,不能「編譯」(檢查一次類型)。
正如其他人所指出的,語言不會被編譯或解釋。它們只是需要翻譯的規則,大部分都是解釋和編譯的實現。即便如此,當許多「解釋器」在各地都是jitting時,很難談論解釋與編譯,並且如果源文件更改,某些「編譯器」很樂意按需編譯。
也許最好將實現分類爲完全預編譯或按需編譯。如果我們使用這些類別,則打破完整預編譯的一件事是eval function。這可能比動態類型對實現有更多的影響。如果你有一個eval函數,你需要支持按需編譯。
通常編譯的Lisp代碼。 Common Lisp編程語言已經在支持編譯的ANSI標準中進行了描述。 ANSI標準描述了編譯代碼的功能,描述了優化的各個方面,描述了編譯過程的各個方面等等。
Common Lisp的解釋器存在,但不太常用。
常見的Lisp實現通常可以自由地混合不同的執行模式。幾乎所有的都有一個編譯器。一些只有一個編譯器。
編譯幾乎所有的實現都具有增量模式,因此可以交互使用。所有可以編譯的文件。有些具有「塊編譯」模式來編譯文件組。
你正在觀察一個非因果關係:
- 動態類型和解釋相關,因爲兩者很容易實現。
- 靜態打字和編輯相關,因爲兩者都有利於可預測的良好性能。
編譯器通常改進到動態類型的語言,試圖提高性能(因爲性能往往很差)。例如,下面是在編寫第一個編譯器之前解釋了一些主要的動態類型語言的時間:Lisp(1958-1962),Mathematica(1988-2004),Lua(1993-2004),Python(1991-2002)和Javascript(1995-2009)。相比之下,OCaml(1996)和F#(2001)等語言首先作爲編譯器發佈。
- 1. 泛型類型,編譯器和動態語言
- 2. 動態類型語言中的類型
- 3. 動態類型語言中的文檔
- 4. 以動態語言檢查類型
- 5. 用動態類型語言重構
- 6. 類型斷言和接口
- 7. 動態類型語言和遠程方法調用
- 8. Prolog是一種無類型的語言嗎? Prolog和動態類型語言有什麼區別?
- 9. .NET和動態語言
- 10. 設計模式列表僅適用於靜態類型語言,但不適用於動態類型語言?
- 11. 在動態類型語言中切換case語句
- 12. 動態編程語言解釋器中的類/結構成員
- 13. 在靜態類型語言D中使用動態類型輸入
- 14. Yii語言源語言和翻譯
- 15. Kivy,KV語言的動態類
- 16. 語言間自動編譯
- 17. 靜態類型語言的類型在運行時決定?
- 18. 瞭解解釋動態語言中的類型檢測
- 19. 動態類型語言中的快速屬性查找?
- 20. 以動態類型語言(如Ruby)命名變量
- 21. 值得動態類型語言的所有批評?
- 22. 如何處理動態語言中的錯誤參數類型?
- 23. 如何在動態類型語言中描述函數參數?
- 24. 如何用動態類型語言指定參數類型,即Python?
- 25. 選擇語言和翻譯
- 26. ZF語言和翻譯
- 27. 是不需要聲明變量類型的弱語類型或動態類型示例的語言的質量
- 28. EXJS中的語言環境和動態多語言支持6
- 29. 動態日期格式取決於語言和語言環境
- 30. 是否有靜態類型的語言可用於JVM和CLR?
你想要什麼語言? – TomaszK 2010-12-08 21:29:19
@TomasxK:怎麼樣:Erlang,Lisp,Lua,Prolog,Ruby和其他有翻譯的人。 – 2010-12-08 21:32:47
他們不一定;許多Common Lisp系統編譯爲本地代碼。另外,你對「解釋」與「編譯」的定義是什麼? Python和Java在哪裏呢? – 2010-12-08 21:33:38