2015-05-09 55 views
2

我的意思是說,有沒有一種語言或者可以設計一種語言,以便所有的高級編程語言都可以編譯成這種中間語言?是否可以創建一個通用的中級編程語言?

這是排除機器語言。

+1

這還不清楚。而且可能以意見爲基礎,因爲沒有「高層次」的客觀定義。例如LLVM計數? –

+0

@OliverCharlesworth我明確表示,它不能是機器語言。 – KthProg

+1

LLVM不是機器語言,因爲沒有本機運行它的機器。 –

回答

4

每個通用語言Turing-complete是一種通用編程語言。

如果任何一種語言的程序可以編譯爲另一種語言的程序,那麼兩種語言(或機器)被認爲是圖靈等價物。一種語言是圖靈完備的,如果它是圖靈相當於一個圖靈機。

有幾個早期的努力來形式化計算的概念;一個是圖靈機,另一個是拉姆達算法,另一個是一般遞歸函數類。 Alonzo Church和Alan Turing證明,所有這三種形式化都是圖靈等價的;任何圖靈機的程序都可以編譯爲lambda演算,反之亦然,lambda演算或圖靈機可以實現任何一般的遞歸函數,反之亦然。

Church-Turing thesis假設可以在任何正式系統中表達的任何計算都可以轉換爲可以在圖靈機上運行的程序;或者等價地,可以在無類型的lambda演算中表達,或者是基於上述等價性的一般遞歸。

這僅僅是一個假設,不能被正式證明,因爲沒有辦法正式描述受其約束的計算類別(沒有通過將它們定義爲可由圖靈機),但是從來沒有任何提出的計算模型不可能用圖靈機來計算。

因爲您可以用幾乎任何通用語言編寫圖靈機(或lambda演算的實現)的模擬器,並且同樣可以將這些語言編譯爲運行在圖靈機上的程序,但幾乎所有通用語言圖靈完成。

但是,有一些語言不是圖靈完整的;正則表達式就是一個例子。它們可以用圖靈機模擬,但它們不能反過來模擬圖靈機。

請注意,這些都不能提高效率或訪問主機系統資源;只是可以表達相同的計算,並且最終會提供相同的答案。有一些語言是圖靈完成的,其中有一些問題cannot be computed at the same asymptotic efficiency as in other languages。有些語言提供對文件系統,I/O,網絡等外部資源的訪問,而另一些語言只允許在內存中進行計算,但在任何Turing完成的語言中,都可以添加API或操縱內存的方法允許它訪問這些外部資源,所以缺乏對系統資源的訪問不是一個根本的限制,只是實施的限制。

作爲一個更實際的問題,有幾種語言被設計爲可移植的,作爲編譯目標的中間語言。 LLVM IR是一個常用的例子,C--是另一個例子。另外,語言運行時的任何字節碼都是這樣操作的,JVM是許多語言的編譯目標,CLR是另一種語言。最後,許多語言都編譯爲C語言,因爲C編譯器已經廣泛使用,並且代碼比機器代碼更具可移植性。

最近,隨着網絡和JavaScript成爲各種瀏覽器中可用的語言的出現,JavaScript已成爲編譯的熱門目標,無論是用於編譯爲JavaScript的語言,如CoffeeScriptDart,還包括最初設計用於編譯爲機器代碼的現有語言,通過像Emscripten這樣的項目。認識到這一用法,人們一直在努力指定一個JavaScript子集,並使用更嚴格的規則(稱爲asm.js),它爲編譯提供了更好的目標,同時仍允許相同的代碼向後兼容常規JavaScript引擎,不知道任何關於asm.js.

+0

所以你說所有的圖靈完整語言都可以編譯成對方? – KthProg

+0

@KthProg:任何圖靈等效系統都可以模擬任何其他圖靈等價系統。 –

+0

@OliverCharlesworth突然之間,你也知道答案。儘管你可能會低估並試圖以基於意見的方式來解決這個問題。 – KthProg

相關問題