8

爲什麼具有動態類型語言的程序通常會被解釋而不是編譯?口譯員和動態類型語言

+0

你想要什麼語言? – TomaszK 2010-12-08 21:29:19

+0

@TomasxK:怎麼樣:Erlang,Lisp,Lua,Prolog,Ruby和其他有翻譯的人。 – 2010-12-08 21:32:47

+0

他們不一定;許多Common Lisp系統編譯爲本地代碼。另外,你對「解釋」與「編譯」的定義是什麼? Python和Java在哪裏呢? – 2010-12-08 21:33:38

回答

5

簡而言之:他們像豌豆和胡蘿蔔一起去。

編譯與解釋和語言輸入基本上是分開的擔憂,因爲你可以有所有可能的排列。另一方面,選擇編譯和不爲語言設計選擇動態類型的「原因」通常是相同的:性能。選擇動態輸入和解釋的「原因」也有些相關。

這不是一條硬性規定。你總是可以混合起來。例如,您可以編譯Perl和Lisp,並解釋C.

0

每動態類型語言的定義...

一種編程語言是說當其大部分類型檢查在運行時執行如在編譯時不是被動態類型。在動態類型中,值有類型,但變量不是;也就是說,一個變量可以指任何類型的值。

這就是說,它變得很難知道什麼編譯程序下來,因爲它可以在運行時更改。從這裏維基百科的另一個摘錄...

動態類型允許構造是 一些靜態類型檢查會拒絕 爲非法。例如,可以執行任意 數據作爲代碼的函數。 此外,動態類型更好 容納過渡代碼和 原型設計,諸如允許 佔位符數據結構(模擬 對象),以在 地方一個完整的數據結構 (通常爲 實驗的目的透明地使用和測試)。

我覺得這個答案仍然不完整,但我希望它指出你在正確的方向。也許這裏的其他人可以擴展這一點。

-8

檢查類型一次實際上是什麼使「編譯器」(〜型檢查器)。

當類型是「動態」時,不能「編譯」(檢查一次類型)。

2

正如其他人所指出的,語言不會被編譯或解釋。它們只是需要翻譯的規則,大部分都是解釋和編譯的實現。即便如此,當許多「解釋器」在各地都是jitting時,很難談論解釋與編譯,並且如果源文件更改,某些「編譯器」很樂意按需編譯。

也許最好將實現分類爲完全預編譯按需編譯。如果我們使用這些類別,則打破完整預編譯的一件事是eval function。這可能比動態類型對實現有更多的影響。如果你有一個eval函數,你需要支持按需編譯。

1

通常編譯的Lisp代碼。 Common Lisp編程語言已經在支持編譯的ANSI標準中進行了描述。 ANSI標準描述了編譯代碼的功能,描述了優化的各個方面,描述了編譯過程的各個方面等等。

Common Lisp的解釋器存在,但不太常用。

常見的Lisp實現通常可以自由地混合不同的執行模式。幾乎所有的都有一個編譯器。一些只有一個編譯器。

編譯幾乎所有的實現都具有增量模式,因此可以交互使用。所有可以編譯的文件。有些具有「塊編譯」模式來編譯文件組。

3

你正在觀察一個非因果關係:

  • 動態類型和解釋相關,因爲兩者很容易實現。
  • 靜態打字和編輯相關,因爲兩者都有利於可預測的良好性能。

編譯器通常改進到動態類型的語言,試圖提高性能(因爲性能往往很差)。例如,下面是在編寫第一個編譯器之前解釋了一些主要的動態類型語言的時間:Lisp(1958-1962),Mathematica(1988-2004),Lua(1993-2004),Python(1991-2002)和Javascript(1995-2009)。相比之下,OCaml(1996)和F#(2001)等語言首先作爲編譯器發佈。