5

我已經用Ruby編程了一段時間,只是Ruby的標準MRI實現,但我一直對我聽到的其他實現感到好奇。語言怎樣才能被自身解釋(比如Rubinius)?

我前幾天在讀Rubinius,一篇用Ruby編寫的Ruby解釋器。我試圖在不同的地方查找它,但我很難搞清楚這是如何工作的。我從來沒有太多的編譯器或語言寫作經驗,但我真的很想弄明白。

一種語言究竟能夠自己來解釋?編譯中有一個基本步驟,我不明白這有意義嗎?有人可以向我解釋這一點,就像我是一個白癡(因爲這不會離得太遠)

回答

8

它比你想象的更簡單。

Rubinius不是100%用Ruby寫的,只是大部分。

http://rubini.us/

流行的語言,如C和Java的一個大的方面是,大部分提供給程序員的功能是寫在語言本身。 Rubinius的目標是將Ruby添加到該列表中。 Rubyists可以更輕鬆地爲語言添加功能,修復錯誤並瞭解語言是如何工作的。 儘可能Rubinius是用Ruby編寫的。哪裏不可能(還),它是C++。

+0

這就是Rubinius的情況,還是所有自解釋的編譯器都有一點涉及其他語言的東西來讓事情開始? – joeellis 2010-05-30 14:26:32

+0

Rubinius並不孤單。 我認爲你在後續評論中提出的問題是一個更深層的話題。所以,我不會直接回答它,而是會在wikipedia上提供關於編譯器的文章。 http://en.wikipedia.org/wiki/Compiler 具體而言,對於這個問題,請查看「編譯」和「編譯器輸出」部分。 – jefflunt 2010-05-31 01:36:06

1

假設你正在使用的語言是一些語言,比如Lisp的,但它並不重要。 (可能是C++,Java,Ruby,任何東西。)

那麼你有一個Lisp的實現。調用這個實現Imp(只是一些名字是IMPlementation的縮寫)。由於Imp本身就是一個程序,你的電腦可以運行它。現在你編寫你自己的用Lisp編寫的Lisp實現,並把它稱爲Circ。 Circ只是一個從Lisp代碼編譯的程序(或者如果你願意的話)。你的代碼是這樣編寫的,它可以讀取文件,解析它(將其處理成有意義的數據),並對數據進行處理。這是什麼東西?在Circ的情況下,它執行數據。

但是它是如何做到的?

嗯,假設一個簡單的例子,Circ讀入和解析的代碼就像做了一些數學計算和輸出結果一樣簡單。 Circ將代碼處理成易於使用的數據(對於像Lisp這樣的語言來說,它很容易開始,但這超出了這一點)並將其存儲起來。在Lisp中,您可以編寫代碼來緊縮數字,因此爲Circ編寫的代碼也可以這樣做,因爲它是用Lisp編寫的。所以處理後的數據會被插入一些額外的處理代碼中......瞧!你有數字結果!然後你的Circ程序輸出結果。

同樣的事情可以用比簡單的數學更復雜的事情來完成。事實上,您可以編譯/解釋該語言的其他方面。編寫足夠的這些「其他方面」並將它們粘合在一起,您將得到一個用Lisp編寫的Lisp編譯器。

由於編譯器是由Imp編譯的,它可以由您的機器運行,並presto!你完成了。

+0

我認爲你有點錯過了這一點。是的,如果imp是編譯器,我可以編譯另一個編譯器,用戶可以在他的機器上運行它(但如果imp編譯的程序需要某些運行時環境,circ-compiler的用戶也需要安裝imp-runtime) 。然而,如果imp和circ是解釋器,任何想要使用循環解釋器的人都必須首先安裝imp解釋器,然後運行他的lisp應用程序,通過使用imp解釋circ和circ來解釋應用程序。如果Rubinius的情況是這樣,那麼沒有人會使用它。 – sepp2k 2010-05-30 11:07:34

+0

哦,我明白了。認爲OP在問一個稍微不同的問題。 – 2010-05-30 16:39:40

2

在Rubinius的情況下,虛擬機是用C++編寫的並且處理所有低級別(操作系統相關)的東西和基本操作。 VM有它自己的字節碼格式(就像JVM也有自己的字節碼格式一樣),當Rubinius啓動時,它啓動執行字節碼的VM。 然而,與C(MRI)或Java(JRuby)相比,Rubinius的標準庫(它是Ruby語言的一部分)中的大部分都是在Ruby中實現的。另外,Rubinius字節碼編譯器也是用Ruby編寫的。 所以是的,在一開始的某個時候,他們不得不使用標準的Ruby解釋器(MRI)來引導Rubinius。但是這不應該是這樣的情況(儘管我不確定自從構建系統使用rake以來是否還需要它)。

4

您正在尋找的概念是編譯器引導

基本上自舉裝置在語言X編寫編譯器(或解釋器),用於語言X。這可以通過手動編寫基本的編譯器(即在Assembly中編寫C編譯器)或使用不同的高級語言來完成。

瞭解更多關於引導wikipedia。格雷格關於元圓評估者的回答也強烈推薦,包括SICP中的相關章節。