有沒有什麼基於C++或者scala的比較輕量級的JVM實現?

最近想寫個JVM,一方面練習一下C++,另一方面就當學習Scala的習題。
有沒有什麼基於C++或者scala的比較輕量級的JVM實現?
1 個回答
五色花
2017-03-06

C++實現的、開源的JVM

OpenJDK HotSpot VM

OpenJDK裡的HotSpot VM是絕大部分用C++實現的。其實把它的JIT編譯器都忽略、把GC只限制在Serial GC(DefNew + MarkSweepCompact)、解釋器選用CppInterpreter而不是TemplateInterpreter、prims目錄裡JVMTI相關的東西以及services目錄都不看的話,HotSpot VM的實現涉及的細節就沒那麼多,也並沒有那麼難懂的。先放倆傳送門吧:
  • Hotspot的源碼應該怎樣閱讀? <- 這裡我寫了HotSpot VM的源碼結構。當時我是針對OpenJDK6的來寫的,到7和8都還差不多。OpenJDK9開始HotSpot VM的源碼結構有略微調整,不過整體上還是一樣。
  • 《HotSpot實戰》的筆記 <- 關於HotSpot VM裡的CppInterpreter的來龍去脈,請參考我寫的這篇短文。

IBM OpenJ9 VM

IBM已經宣佈會於明年(2017年)開源其J9 JVM,名為OpenJ9。這個JVM的核心VM最初是用Smalltalk寫的生成器,根據配置在每個平臺上生成對應的C代碼然後編譯出核心VM來。現在應該是用C重寫了一遍。核心VM(主要是解釋器、類加載器等功能)尚未開源J9的GC與JIT編譯器則是用C++實現的,跟HotSpot VM一樣都是相當優化的實現,所以實現得比較複雜,未必適合題主參考。這些部分的核心組件現在已經在Github上開源了,位於:GitHub - eclipse/omr: Cross platform components for building reliable, high performance language runtimes

Oracle/Sun CLDC-HI VM

在Java ME領域,Oracle/Sun的"CLDC HotSpot Implementation"(簡稱CLDC-HI,也叫做Monty VM)也是一個用C++實現的JVM。它比Java SE版的HotSpot VM簡單得多,題主要是感興趣的話可以參考一下。它的源碼可以在phoneME Feature項目中找到:Phoneme — Project Kenai

Mysaifu JVM

Mysaifu JVM是一個可以跑在Windows Mobile上的Java ME JVM實現。這個實現相當簡單,題主或許可以先從這個參考一下看看。傳送門:
  • Mysaifu JVM <- Wikipedia頁面
  • Mysaifu JVM Project Top Page <- OSDN上的項目主頁。這是現在可用的唯一官網了。原本的官網掛了…
  • Source Tree: (head) <- SVN版本控制下的源碼鏈接。其中trunk版本的JVM的實現代碼在Source Tree: jvm/trunk/jvm/ (head)。主要實現文件就這麼一些:
    • 類加載器:File Details: /jvm/trunk/jvm/class_loader.cpp (head)
    • 類校驗器:File Details: /jvm/trunk/jvm/verifier.cpp (head)
    • 類元數據:File Details: /jvm/trunk/jvm/ClassFile.cpp (head)
    • 對象模型及mark-sweep GC:File Details: /jvm/trunk/jvm/java_object.cpp (head)
    • 解釋器:File Details: /jvm/trunk/jvm/instruction.cpp (head)
    • 解釋器棧幀:File Details: /jvm/trunk/jvm/frame.cpp (head)
    • 線程模型:File Details: /jvm/trunk/jvm/java_thread.cpp (head)
    • JNI實現:File Details: /jvm/trunk/jvm/jni_funcs.cpp (head)
    • JVM的總控:File Details: /jvm/trunk/jvm/jvm.cpp (head)

Google AOSP Android Runtime(ART)

沒錯,Android Runtime(ART)也是一個主要用C++實現的JVM。只是很傲嬌的使用與JVM的字節碼指令集有非常強的對應關係的Dalvik字節碼指令集而已。ART可能是用C++實現的JVM裡,C++的用法最現代的一個了。要參考現代C++在JVM實現中的用法的話,可以看看ART。傳送門:
  • https://android.googlesource.com/platform/art/ <- 最新源碼

ReadyTalk Avian

Avian是一個用C++實現的JVM子集。這個子集的功能也頗可用了。而且它支持把Java程序AOT編譯成bootimage,挺有趣的。傳送門:
  • Avian <- 官網

===================================

Scala實現的、開源的JVM

呃,Scala實現的JVM麼。Scala自身一般就是在JVM上運行的,用Scala來實現JVM就進入了“metacircular VM”(元循環VM)——用自己實現自己的VM——的領域。

這樣的VM可以有相當多不同的取捨,實現難度可以差非常非常多。取捨點有例如:
  • 對象模型要不要自己實現?
  • GC要不要自己實現?
  • 線程模型要不要自己實現?
  • 是做解釋器還是編譯器,還是兩者都要?
  • 與native庫要如何交互?

舉個簡單的例子,如果對上面的問題回答是“只做一個解釋器,其它全部交給底下的JVM去跑”的話,那這做起來就超級簡單。依靠Scala的模式匹配寫個簡單的字節碼解釋器簡直容易。然而這樣的實現無法自舉,玩玩很快就膩了。

而如果回答是“全部都要自己實現,並且要通過自己實現的編譯器來自舉(bootstrap)”的話,這實現就複雜很多了。能自舉的JVM就好玩很多,可以天天玩月月玩年年玩 >_<

在上述兩個極端之間當然還有很多中間選項。但如果以“自舉”為界線的話,要自舉的話寫個字節碼到機器碼的編譯器是必要條件。

簡單的、不能自舉的用Scala實現的JVM,有一個很出名的、新加坡的Haoyi Li大大寫的:GitHub - lihaoyi/Metascala: A JVM written in Scala,“3000行Scala寫成的JVM”。

能自舉的用Scala寫的JVM我還沒聽說過。如果誰聽說過這樣的項目的話請在評論區告知,我馬上更新答案~用純Java實現的metacircular VM倒是有好幾個。例如說,比較現代的有源自Oracle/Sun的Maxine VM與源自IBM的Jikes RVM。與Jikes RVM頗有淵源的JoeQ也算一個。用Java能做的,用Scala當然也可以做,只是我沒見過實際用Scala實現的metacircular JVM而已。

不過!有用Scala實現的比JVM更底層一點的研究性框架,叫做MicroVM:The Mu Micro Virtual Machine Project。MicroVM(或者叫uvm)的研究目的是為所有managed runtime提供一個基礎的實現框架,當然在它的基礎上要實現JVM也是可能的。MicroVM有過幾個Scala的實現,不過我不太記得它們能不能bootstrap了…據說是可以bootstrap。

另外提個對題主來說沒啥參考價值的:Java的AOT編譯器產品中很出名的Excelsior JET,它當前版本的Java字節碼到機器碼的編譯器就是用Scala實現的。不過這玩兒不開源,所以對題主幫助不大。舉這個例子主要是想說明用Scala寫JVM的思路是真實可行,有應用在實際產品中的。

相關推薦

推薦中...