2010-02-17 96 views
34

我簡要閱讀了關於Maxine這是一個用Java編寫的開源JVM實現。這聽起來對我來說是圓形的如果java需要運行一個虛擬機,那麼虛擬機本身如何以Java編寫(VM代碼不需要運行的虛擬機,等等)。如何用Java編寫JVM

編輯:好的,所以我看到我忽略了Java不必在虛擬機中運行的事實。那麼如何解釋如何在LISP中編寫LISP編譯器?或者這應該成爲一個新的問題?

+1

不是Bjarne Stroustroup用C++編寫的第一個C++編譯器(當它仍被稱爲「C with Classes」時)?我認爲這更令人印象深刻,因爲C++不是一種解釋型語言,但需要編譯器! – Matthias 2010-02-17 08:47:39

+1

這正是我不明白的:) – kji 2010-02-17 08:49:34

+5

New Dragon Book,第一版(遠離錯誤發生的第二版)解釋了編譯器引導。 – 2010-02-17 08:55:36

回答

14

您認爲Java需要虛擬機is incorrect to begin with

+1

java *語言*可能不需要VM,但術語「java」涵蓋的不僅僅是語言,還包括VM。 – skaffman 2010-02-17 08:36:33

+0

而Maxine似乎至少需要JDK1.6 JVM才能運行。 – Thilo 2010-02-17 08:39:07

+0

@kji:我想我錯了。似乎Maxine會編譯爲本地可執行文件,因此在創建Maxine之後不需要JDK JVM(我相信它仍然需要類庫)。 – Thilo 2010-02-17 08:49:44

1

Java代碼可以直接編譯爲機器代碼,以便不需要虛擬機。

0

你可以看看引導編譯器的成熟方法。我認爲它開始於70年代...

6

您需要引導用Java編寫的JVM的JVM可能不需要太多功能(如垃圾回收和JIT),可能非常簡單。所有更高級的功能都可以用Java實現(這似乎正是Maxine的要點,在JVM技術中嘗試新想法)。另外,Maxine確實包含C代碼,我猜想它構成了一個最小的運行時環境,用於讓Maxine的其餘部分進入。我認爲有趣的位(JIT編譯器,垃圾收集)然後在Java中完全實現。

+0

很好的解釋,謝謝 – kji 2010-02-17 08:46:04

+0

沒有。 Maxine中的C代碼更像數據定義語言,它實際上並沒有實現任何有趣的功能。操作系統期望某些結構以特定的方式在內存中進行佈局,並且C編譯器知道如何執行此操作,所以Maxine使用C來正確地佈局這些結構。但是隻有少數地方使用C:一個最小的啓動器,它將VM映像加載到內存中,將加載地址寫入映像內的特定位置,然後跳轉到另一個特定位置。調試器,因爲Maxine使用OS的C調試工具。 – 2010-02-17 10:03:42

+0

JNI的低級部分,因爲JNI的全部內容都是與C集成的。而且,線程的低級部分,因爲Maxine使用本地線程,這些線程在系統間非常不同。 – 2010-02-17 10:05:25

0

這是有點 'whooaoaa人,這怎麼行???' - 但我認爲你正在描述被稱爲'自託管'的現象:

語言(或工具鏈/平臺)不是以自我託管的形式出現 - 它們是以現有平臺爲基礎開始的:在某一時刻,它們變得足夠功能以允許編寫程序來理解它本身碰巧寫入的語法。

在經典的AWK書中有一個很好的例子,它介紹了一個可以解析的AWK程序(一個簡化版本)其他AWK程序:請參閱下面的鏈接。

「美麗的代碼」中有另一個例子,它有一個可以解析Javascript的Javascript程序。我想這件事情要記住 - 如果你有一個用Java編寫的JVM,因此可以運行Java字節代碼:運行Java JVM本身的JVM必須本地託管(也許這個JVM是用'C'編寫,然後編譯成機器代碼):最終在任何一個自託管程序的情況下都是如此 - 在某個地方。

所以,這個祕密被刪除 - 因爲在某些時候,有一個原生的機器代碼程序運行在一切之下。

它有點相當於能夠用英語本身來描述英語(等)語言......也許......

http://www.amazon.co.uk/AWK-Programming-Language-Alfred-Aho/dp/020107981X/ref=sr_1_fkmr0_3?ie=UTF8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Abeautiful+code&keywords=beautiful+code&ie=UTF8&qid=1266397435

http://en.wikipedia.org/wiki/Self-hosting

2

我看了一下上週瑪克辛和想知道同樣的:)

從瑪克辛documentation

1建設啓動鏡像

現在讓我們來構建一個[啓動鏡像]。在 這一步,瑪克辛主機JVM 上運行配置一個原型,然後 編譯它自己的代碼和數據 創建爲 目標平臺的可執行程序。

2運行瑪克辛

現在瑪克辛將自己編制, 我們可以作爲一個標準的Java虛擬機上運行它。 max vm命令處理類和庫路徑的詳細信息 ,並且 提供了一個類似於 標準java launcher命令的接口。

0

我知道這個帖子已經過時了,但是我想我可能會在討論中加點點,因爲它們是錯過的點。所以未來的讀者可能會覺得這有幫助

我想知道大家是否錯過了這裏的觀點。您幾乎可以用任何語言編寫大多數編譯器,解釋器或虛擬機。當使用C編寫C編譯器時,需要使用C編譯器來編譯新的編譯器。但是,輸出是在指定平臺上運行的本機代碼。僅僅因爲JVM是使用在JVM上運行的語言編寫的,並不意味着輸出必須導致在JVM上運行的代碼。例如,你可以用Java編寫C,Basic,Pascal編譯器甚至彙編器。在這種情況下,您將需要JVM來創建編譯器或彙編程序,但一旦創建完成,如果初始代碼導致本機代碼,則可能不再需要JVM。另一種方法是編寫一個翻譯器,它接受一種輸入語言並將其轉換爲本地機器語言,以便用A語言編寫程序,然後編譯成語言B,然後編譯爲機器碼。在微控制器領域,你會看到很多。有人想用Basic或Java編寫程序,以便編寫Basic/Java編譯器爲現有的C編譯器生成C代碼。然後將生成的C代碼編譯爲提供本機Basic/Java編譯器的機器語言。這種方法通常比直接在機器代碼中編寫Basic/Java編譯器更簡單。很多年前,我寫了BasicA和GWBasic程序,生成彙編代碼到6800和Z80微型計算機。我的觀點是,輸出不需要與輸入或目標相同。 I.E.僅僅因爲你用Java編寫JVM並不意味着最終結果必須在Java JVM下運行。