- 浏览: 18811 次
- 性别:
最新评论
-
simpleman7210:
不错,正如你看到的,new和delete被重载了,目的是尝试管 ...
实现数组相关指令 -
panqj_hust:
我最近才发现虚拟机 实现了,类的operator new与op ...
实现数组相关指令 -
simpleman7210:
你的代码很清楚了,因为Object的实例不能转换为int[], ...
实现数组相关指令 -
panqj_hust:
public class Test{public static ...
实现数组相关指令 -
panqj_hust:
我的ide在调用汇编那段的时候,ide不能够切换到源代码模式
开始支持本地方法
文章列表
这个用于学习的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 ...