`
simpleman7210
  • 浏览: 18772 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论
文章列表
这个用于学习的Java虚拟机已经停止开发一段时间了。一个多月来,我没有继续做相关开发工作。谢谢大家的光顾和关心。开发已暂时停止,我也不知会停多久。如果在阅读或调试这个虚拟机源代码的过程中发现什么问题,仍然可以提出来,我偶尔会上线来看看。或者写信到这个邮箱:simpleman7210@qq.com。
这个版本支持了针对String的ldc指令,以及简单的java/lang/String类和java/lang/StringBuffer类。可以在java程序中调用System.out.print来打印字符串了。注意,编译java源文件的时候要按1.4的版本编译,因为java/lang/StringBuilder类是1.4版本后引入的,在此之前只有StringBuffer类。 例如,编译如下的TestString类: class TestString { public static void main(String[] args) { main(); } public stati ...
这个版本开始支持本地方法,目前仅在Windows平台上编译通过,通过嵌入Intel汇编指令,把本地方法的参数入栈。可以运行这个版本包里的TestNativeMethod来测试下。
我开发这个Java虚拟机,是用来学习的。我在开发过程中自己学习,也提供给凡感兴趣的朋友学习和参考。目前这个虚拟机的实现还是很初级的。我甚至有意不做优化,或者在很少的地方优化,又或者,随着一个又一个版本慢慢地去优化,目的是让初学者能看到这个过程是怎样演进的。毕竟对初学者来说,去理解含在虚拟机中的概念和思想是首要的。经常我在某个地方“卡壳”了,就想:这个问题别人是怎样解决的?为了解一个细节,我不得不花费许多时间去阅读别人的源代码。经过相当努力之后,有时幸运地你找到了答案或者线索;但更多时候你没有找到答案,或者沿着线索寻找的过程中,最终不得不放弃,因为代价大大了。所以我渴望“直接明了”。我写这个虚拟机 ...
版本v034实现了数组相关指令。最近的版本(v04)准备支持本地方法和小型的类库。
应panqj_hust的需要,我举例说明如何为这个虚拟机写测试例子。我在开发这个虚拟机的过程中,为了检查是否正确,也写了好些测试Java类。这些例子很多,不在这里一一列举出来。我只是举一两个例子,说明怎么写测试例子。实 ...
这个虚拟机版本在Java类首次主动使用的时候调用其<clinit>方法,参考了虚拟机规范。另外对于Java异常处理中的"异常",作了简化处理。
这个版本实现了Java的异常抛出和处理。我只是初步测试了它,看起来可以工作。
这个版本完成以下工作: 1. 对虚拟机的各种错误进行了整理和规范,但尚未支持Java异常处理。 2. 继续增添了虚拟机执行的调试打印信息,并且可以设置输出开关,信息也分级别。 3. 补充了算术运算,跳转,逻辑运算等Java指令,现在已实现大多数的Java指令。 没有做的事情,或者将要去做的事情: Java异常处理 本地方法调用 数组有关指令 字节码验证 垃圾回收 目前这个虚拟机实现只是解释执行,即使是解释执行,也只是初步实现,没有优化。 编译虚拟机:请参考run_compile.txt文件,这次我在cygwin下编译通过。visual studio应该也能编译通过,只是我的visual st ...
这次的主要修改如下: .命令行支持调试参数,可以打印每条指令执行后的pc寄存器和栈信息。 .以前主要考虑Java类,这次对接口也考虑和处理了。 .修改了invoke系列指令中获取objectref的一个bug。 .实现了invokeinterface指令。
自从上次实现new指令之后,我没有马上实现invokespecial指令,因为对于invokespecial指令的理解需要时间。现在基本实现了invokesecial指令,但是在权限检查上遇到一个困难,主要是派生类对于基类protected实例成员(非静态成员)的访问。这个问题暂时忽视了。接着实现了invokevirtual指令,也遇到访问权限方面的疑问。我参考“深入java虚拟机”的一个例子,这个例子测试通过了,如下。 Superclass.java class Superclass { private void interestingMethod() { //System.o ...
最近几天的工作是初步实现了new, getfield和putfield指令。 修改了对于字段和方法的权限检查,更加严格了。
在实现了对类的递归加载之后,我就着手实现对字段和方法的递归查找,因为意识到我先前仅对当前类查找字段或方法是不够的,为此我参考了"深入Java虚拟机"以及JVM规范。目前实现了对类字段或方法的递归查找,同时检查了访问权限。但对于接口则暂时忽视了。 源代码的主要修改: 1. 修改getstatic, putstatic, invokestatic指令的处理,支持递归查找字段或方法,并检查访问权限。
在上一次写了对静态字段的get/set之后,发现我的getstatic/setstatic指令实现得并不完全,因为我只查找了当前类的静态字段,但似乎jvm规范要求递归查找静态字段。于是我联想到,当初在java类的加载时,我把类的递归加载问题搁置一边,而只单单加载所指定的类,并不递归加载其super classes。因为我本着“推迟,直到必须用到时再加载”的想法。不过,既然迟早要加载super classes,而jvm书籍和规范,并sun的jvm实现,似乎都指向“在加载一个类的时候要递归加载其super classes”,如此看来,“递归”问题的解决势在必行了。于是,我花了一些时间,初步实现了类的 ...
继上次实现了静态方法调用之后,又实现了对静态字段的读写,即getstatic和putstatic指令。通过了下面一段java代码的测试。 public class ClassHasStaticField { private static boolean _z; private static byte _b; private static char _c; private static short _si; private static int _i; private static float _f; private static long _l; private static double _d ...
Global site tag (gtag.js) - Google Analytics