2010-11-24 147 views
10

可能重複:
How can a language's compiler be written in that language?
implementing a compiler in 「itself」如何爲該語言的某種語言編寫編譯器?

我看着Rubinius,一個Ruby實現,編譯使用Ruby編寫的編譯成字節碼。我無法理解這一點。你如何在語言本身編寫一種語言的編譯器?看起來好像只是沒有任何東西的文本將它編譯成一個可執行文件,然後可以編譯用Ruby編寫的未來代碼。我只是在輸入那句話時感到困惑。任何人都可以解釋這個嗎?

+0

對不起,沒有看到那一個。 – jergason 2010-11-24 11:10:47

回答

16

爲了簡化:首先用另一種語言爲編譯器編寫編譯器。然後,你編譯編譯器,瞧!因此,你需要某種已經有編譯器的語言 - 但是由於有很多這樣的語言,你可以編寫Ruby編譯器(!)例如在C中,它將編譯Ruby編譯器,然後編譯Ruby程序,甚至可以編譯自己的更高版本。

當然,原始編譯器是用機器代碼編寫的,用於彙編的編譯編譯器,編譯器又編譯了編譯器,例如編譯器。 C或Fortran,它們編譯了......幾乎所有的編譯器。 Iterative development in action.

的過程稱爲bootstrapping - 可能命名男爵明希豪森的故事,他由他自己白手起家:)把自己拉了一個沼澤

0

那麼就可以做以下順序:

  1. 用任何語言編寫一個編譯器,C代表Ruby代碼。
  2. 現在您可以編譯Ruby代碼,您可以編寫一個編譯ruby代碼的編譯器,並使用您在步驟1中編寫的C編譯器編譯該編譯器。wahh這句話很奇怪!
  3. 從現在開始,你就可以編譯所有的Ruby代碼寫在2 :)

有興趣的編譯器! :)

0

編譯器只是將源代碼轉換爲可執行文件的東西。因此,它的內容無關緊要 - 它可以是編譯時使用的同一種語言,也可以是任何其他足夠強大的語言。

當您爲平臺的語言編寫編譯器時使用相同的語言編寫編譯器,但尚未爲您的實現語言編譯器。你的選擇是在另一個你有編譯器的平臺上編譯,或者用另一種語言編寫編譯器,然後用它編譯「真實」編譯器。

2

剛剛讀完這句話我感到困惑。

將編譯器視爲經常調用編譯器的翻譯器可能會有所幫助。它的目的是獲取人類可以讀取的源代碼並將其翻譯成計算機可以讀取的二進制代碼。就Rubinius而言,它讀取的代碼恰好是Ruby代碼,它將代碼轉換爲機器代碼(實際上是LLVM機器代碼,它本身會進一步編譯爲英特爾機器代碼,但這只是背景細節) 。 Rubinius本身可以用任何編程語言編寫。它恰好是用它編寫的同一種語言編寫的。

當然,您首先需要運行Rubinius,這很可能是一個普通的Ruby解釋器。但是,請注意,一旦您能夠在解釋器上運行Rubinius,您可以將它傳遞給自己的源代碼,並且它會創建並運行自己的編譯版本。這就是所謂的自舉,來自舊的短語,「通過引導拉動自己」。

最後一點:Ruby程序不能調用任意機器代碼。 Rubinius的那部分實際上是用C++編寫的。

0

這是一個兩個步驟:

  1. 寫在其他一些lanaguage像C的Ruby編譯器,假設一個Ruby編譯器還不存在
  2. ,因爲你現在有一個Ruby編譯器,你可以寫一個Ruby程序是一個(新的)Ruby編譯器

既然有人已經寫了一個Ruby編譯器(Matz),你「只」必須做第二部分。說起來容易做起來難。

0

答案爲止已經解釋瞭如何通過使用不同的編譯器來引導編譯器的全部。但是,還有一種替代方法:手工編譯編譯器。沒有理由爲什麼編譯器必須由機器執行,它也可以由人類執行。

+0

你能擴充這個答案嗎?你是在說人們用機器代碼寫東西,還是其他的東西? – 2010-11-24 23:18:09