有没有人写过简单的JVM实现,可以分享
simpleman7210
2013-08-18
有没有人写过或者在写一个简单的Java虚拟机实现,可以公开出来与人分享和交流呢?我盼望有这样的事情,因为我觉得象Sun或一些其它的JVM实现,都相当大而且有许多优化,不那么容易理解,你需要投入许多时间精力。因此我总盼望有一个简单的JVM实现可以供初学者学习和参考,而且重要的是,可以与作者交流。从简单到复杂,一般是比较容易的。 群组管理员所列出来的许多JVM实现,我不容易从中找到这样一款。我很佩服列出来这么全,但找到一款我所希望的仍不容易。因此特别希望有人写一个简单的JVM实现拿来分享。它也许不那么严格符合JVM规范,但能加载class文件并执行,也许只是解释执行。垃圾回收或许没有,或许有一个简单的实现。这样很可能就让我满意了。 |
|
chong_zh
2013-08-19
JamVM
|
|
RednaxelaFX
2013-08-19
嗯,楼主的需求很明确,这个应该还是有办法满足的。
首先是我在群组的欢迎帖里列的JVM列表: RednaxelaFX 写道 ●Java Virtual Machine
- Oracle(Sun) HotSpot VM (OpenJDK: GPLv2+CE) -- Da Vinci Machine -- JSR 292 Backport -- UltraViolet™ Virtual Machine - Azul HotSpot VM - IBM J9 - Oracle JRockit - Apache Harmony (Apache License v2) - Jikes RVM (EPLv1) - Kaffe (GPL) - SableVM (LGPLv2.1) - Oracle(Sun) CLDC HotSpot Implementation (GPLv2) - Oracle(Sun) Project Monty virtual machine - PSPKVM (GPL) - Oracle(Sun) Squawk VM (GPLv2) - Oracle(Sun) JavaCard VM - Oracle(Sun) Maxine VM (GPLv2) - Oracle(Sun) Mackinac - Metacircular Research Platform (MRP) (Apache License, EPLv1, GPLv2+CE) - Moxie JVM (Apache License v2) - JamVM (GPL) (Sourceforge Project Page) - JamaicaVM - cacaovm (GPL) - Jelatine JVM (GPLv3) - NanoVM (GPL) - Open Mika (BSD) - Wonka VM - Aegis VM (LGPL) - joeq (GPL) - kissme (GPL) - VMKit (University of Illinois Open Source License) - Jupiter - K virtual machine - NSIcom CrE-ME - LaTTe (BSD) - Esmertec JBed - Symantec JIT - TowerJ DynaFlex - Microsoft Java Virtual Machine / jview - HP Chai VM - Oracle OJVM - Oracle JVM (考据中,不知道这个跟OJVM是什么关系) - Mozilla ElectricalFire (Netscape PL) - MachJ - JanosVM - Xam (GPLv3) - E-bunny - Jeode EVM - shuJIT - Inprise "javacomp" JIT - OpenJIT (BSD) - TYA - Open Runtime Platform (ORP) (Intel Open Source License) - Jaos - AromaVM - Sun Exact VM - Sun JavaInJava - IKVM.NET (custom BSD-like) - TinyVM (MPLv1) - Ovm (简介) (New BSD) - GCJ (GPL) - Excelsior JET - JC Virtual Machine (LGPL) - MiniJavaVM - ArmJVM - Rava (Ruby License) - RUVA (Ruby License) - Japhar - Joker-vm (GPL) - Jato (GPLv2+LE) - Another Open JavaCard Virtual Machine (GPL) - Sun Spotless JVM - Nemesis JVM - nanokit - Aplix JBlend - Orto JVM - Avian (ISC License) - JnJVM - Doppio (MIT License) Java on CoffeeScript - Mysaifu JVM 上面标红的都是比较简单的JVM。不过其中有好几个现在已经找不到实际内容了,例如说浙大学生在毕业设计做的MiniJavaVM,现在只能找到一篇论文了:http://www.wengkai.org/paper/ZhuHuaiyi.html - 朱怀毅 先前有为在淘宝的同事王智通也有尝试自己写JVM,留下了帖子:http://club.alibabatech.org/article_detail.htm?articleId=5 http://club.alibabatech.org/article_detail.htm?articleId=7 不知道后来进度如何呢。 然后我想推荐一下我之前整理的一个学习JVM的书单:http://book.douban.com/doulist/2545443/ 里面有这么一本觉得适合楼主: 前橋和弥写的プログラミング言語を作る 这本书的Diksam跟JVM有许多相似之处,略微加以改造就能变成真正的JVM。 这本书是日文的,不过中文翻译版年内就会由图灵出版,可以耐心等待。 |
|
simpleman7210
2013-08-19
上面的列表真是很全。我也是对着这个列表看过去的。JamVM我曾经尝试过,不知道我是否理解正确,我觉得它不合适,因为印象中它依赖apache classpath。apache classpath不算很简单吧?我曾在cygwin上折腾了半天,也没有把classpath编译过去,就放弃了。 所以到现在我发现还是Kaffe对我实际有帮助。只是Kaffe不直接支持在windows下编译,需要用cygwin。但糟糕的是,我在cygwin下编译也遇到麻烦。即使是这样,我觉得Kaffe还是不错,它的代码清洁,可读性比较好。在没有别的参考时,我就读一下Kaffe的代码,有时还能得到帮助。 浙江大学的那个JVM毕业设计,我曾非常希望得到其源代码。我觉得作为一个毕业生,作者做得相当不错了。我试着联系原作者没有成功。我有点可惜,因为作者没有继续完善它。 |
|
simpleman7210
2013-08-19
淘宝的帖子我也看了一下。这个帖子中主要完成的是对class文件的解析。我也做了这个工作。这是一个开头,接下来需要做解释执行的工作了。我目前也正在这个地方,要继续往下走。
|
|
RednaxelaFX
2013-08-19
实现一个符合规范的JVM本身并不是很困难的事情,但要真的能跑程序就挺费事的。
因为要让Java程序运行起来不是只有Java虚拟机就足够,而是需要完整的JRE(Java Runtime Environment)。JRE包括JVM和核心类库,后者的规模很大,所以实现起来很费事。 核心库与JVM相互会有些耦合,例如说从Java层来看,反射是通过java.lang.reflect.*暴露出来的,但它的实际功能却是在JVM里直接实现的。这就使得核心库与JVM必须有些私有耦合。 楼主提到Classpath(是GNU Classpath,不是Apache)便是一个Java核心库的实现。现在比较现实的Java核心库实现有三个: 1、OpenJDK 2、Apache Harmony 3、GNU Classpath 不幸的是,无论选那个都很费事。 OpenJDK是现在最现实的选择,因为它仍然有许多公司投入去做积极的开发,而且保证与多数Java程序兼容。 Apache Harmony比GNU Classpath新一些,功能也丰富一些,但由于Harmony项目已经死了,这边不会再有积极的开发;GNU Classpath的问题则是它太老了,而且多年来很少得到新鲜血液去更新它。 这么说来就应该选OpenJDK?不。OpenJDK的库对JVM的内部功能的依赖没有完善的文档去描述,所以一个JVM要跟OpenJDK的Java核心库搭配使用需要自己去慢慢摸索到底OpenJDK想要JVM里提供什么功能。 本来HotSpot VM的prims目录下的几个.h文件就差不多把这些依赖描述清楚了,但要是初衷就是不想去看HotSpot VM的实现的话,看那代码挺痛苦的。 Apache Harmony和GNU Classpath都有较好的文档描述VM与库之间的接口,所以用起来会容易一些。但前面已经说了这俩都不怎么更新了,你多半也不会想用这俩。 核心库里有很多对外依赖多、不好编译过去的地方都是图形库啊音频库啊啥的,那些对楼主来说也没啥用吧。 所以如果只是想做一个小JVM来玩玩的话,最好就是上面仨核心库实现都别依赖。只要实现System.out.println()的话可以只做非常非常小集合的库。 |
|
RednaxelaFX
2013-08-19
simpleman7210 写道 淘宝的帖子我也看了一下。这个帖子中主要完成的是对class文件的解析。我也做了这个工作。这是一个开头,接下来需要做解释执行的工作了。我目前也正在这个地方,要继续往下走。
http://club.alibabatech.org/article_detail.htm?articleId=7 <- 这篇的时候他的JVM已经能运行很简单的东西了。 |
|
simpleman7210
2013-08-19
确实是这样,要让java程序跑起来就需要一个类库支持。然而我的要求不高,希望有一个JVM的简单实现,和一个很小集合的类库,就是java.lang下面的一些类,连reflect暂时都可以不必考虑。等JVM基本实现出来,再慢慢地增加类库,这个就成另一个话题了。所以前期我依然是希望有一个简单的实现,带一个很小的类库。我在写这样一个实现,但还是盼望有别人的实现可以参考。做这事就是为了学习,也为了提供给别人学习。 |
|
simpleman7210
2013-08-19
RednaxelaFX 写道 simpleman7210 写道 淘宝的帖子我也看了一下。这个帖子中主要完成的是对class文件的解析。我也做了这个工作。这是一个开头,接下来需要做解释执行的工作了。我目前也正在这个地方,要继续往下走。
http://club.alibabatech.org/article_detail.htm?articleId=7 <- 这篇的时候他的JVM已经能运行很简单的东西了。 ok,不错。参考下。RednaxelaFX回复十分仔细,非常感谢。 |
|
RednaxelaFX
2013-08-19
说来,楼主是用什么策略来实现的?可以简单谈一下思路和进度不?
如果有在GitHub开源出来的话说不定能吸引到一堆人跟你一起做 |