我簡要閱讀了關於Maxine這是一個用Java編寫的開源JVM實現。這聽起來對我來說是圓形的如果java需要運行一個虛擬機,那麼虛擬機本身如何以Java編寫(VM代碼不需要運行的虛擬機,等等)。如何用Java編寫JVM
編輯:好的,所以我看到我忽略了Java不必在虛擬機中運行的事實。那麼如何解釋如何在LISP中編寫LISP編譯器?或者這應該成爲一個新的問題?
我簡要閱讀了關於Maxine這是一個用Java編寫的開源JVM實現。這聽起來對我來說是圓形的如果java需要運行一個虛擬機,那麼虛擬機本身如何以Java編寫(VM代碼不需要運行的虛擬機,等等)。如何用Java編寫JVM
編輯:好的,所以我看到我忽略了Java不必在虛擬機中運行的事實。那麼如何解釋如何在LISP中編寫LISP編譯器?或者這應該成爲一個新的問題?
您認爲Java需要虛擬機is incorrect to begin with。
Java代碼可以直接編譯爲機器代碼,以便不需要虛擬機。
你可以看看引導編譯器的成熟方法。我認爲它開始於70年代...
您需要引導用Java編寫的JVM的JVM可能不需要太多功能(如垃圾回收和JIT),可能非常簡單。所有更高級的功能都可以用Java實現(這似乎正是Maxine的要點,在JVM技術中嘗試新想法)。另外,Maxine確實包含C代碼,我猜想它構成了一個最小的運行時環境,用於讓Maxine的其餘部分進入。我認爲有趣的位(JIT編譯器,垃圾收集)然後在Java中完全實現。
很好的解釋,謝謝 – kji 2010-02-17 08:46:04
沒有。 Maxine中的C代碼更像數據定義語言,它實際上並沒有實現任何有趣的功能。操作系統期望某些結構以特定的方式在內存中進行佈局,並且C編譯器知道如何執行此操作,所以Maxine使用C來正確地佈局這些結構。但是隻有少數地方使用C:一個最小的啓動器,它將VM映像加載到內存中,將加載地址寫入映像內的特定位置,然後跳轉到另一個特定位置。調試器,因爲Maxine使用OS的C調試工具。 – 2010-02-17 10:03:42
JNI的低級部分,因爲JNI的全部內容都是與C集成的。而且,線程的低級部分,因爲Maxine使用本地線程,這些線程在系統間非常不同。 – 2010-02-17 10:05:25
請參閱bootstrapping。
這是有點 'whooaoaa人,這怎麼行???' - 但我認爲你正在描述被稱爲'自託管'的現象:
語言(或工具鏈/平臺)不是以自我託管的形式出現 - 它們是以現有平臺爲基礎開始的:在某一時刻,它們變得足夠功能以允許編寫程序來理解它本身碰巧寫入的語法。
在經典的AWK書中有一個很好的例子,它介紹了一個可以解析的AWK程序(一個簡化版本)其他AWK程序:請參閱下面的鏈接。
「美麗的代碼」中有另一個例子,它有一個可以解析Javascript的Javascript程序。我想這件事情要記住 - 如果你有一個用Java編寫的JVM,因此可以運行Java字節代碼:運行Java JVM本身的JVM必須本地託管(也許這個JVM是用'C'編寫,然後編譯成機器代碼):最終在任何一個自託管程序的情況下都是如此 - 在某個地方。
所以,這個祕密被刪除 - 因爲在某些時候,有一個原生的機器代碼程序運行在一切之下。
它有點相當於能夠用英語本身來描述英語(等)語言......也許......
我看了一下上週瑪克辛和想知道同樣的:)
從瑪克辛documentation:
1建設啓動鏡像
現在讓我們來構建一個[啓動鏡像]。在 這一步,瑪克辛主機JVM 上運行配置一個原型,然後 編譯它自己的代碼和數據 創建爲 目標平臺的可執行程序。
2運行瑪克辛
現在瑪克辛將自己編制, 我們可以作爲一個標準的Java虛擬機上運行它。 max vm命令處理類和庫路徑的詳細信息 ,並且 提供了一個類似於 標準java launcher命令的接口。
我知道這個帖子已經過時了,但是我想我可能會在討論中加點點,因爲它們是錯過的點。所以未來的讀者可能會覺得這有幫助
我想知道大家是否錯過了這裏的觀點。您幾乎可以用任何語言編寫大多數編譯器,解釋器或虛擬機。當使用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下運行。
這是關於自舉託管虛擬機的一篇很好的論文。這不是Java,但JavaScript,但原則是相同的。
Bootstrapping a self-hosted research virtual machine for JavaScript: an experience report
注意的是,雖然的Bootstrap自主機編譯器和的Bootstrap自託管虛擬機有些相似,我相信他們沒有提出確切的同樣的挑戰。
不是Bjarne Stroustroup用C++編寫的第一個C++編譯器(當它仍被稱爲「C with Classes」時)?我認爲這更令人印象深刻,因爲C++不是一種解釋型語言,但需要編譯器! – Matthias 2010-02-17 08:47:39
這正是我不明白的:) – kji 2010-02-17 08:49:34
New Dragon Book,第一版(遠離錯誤發生的第二版)解釋了編譯器引導。 – 2010-02-17 08:55:36