自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (5)
  • 收藏
  • 关注

开发已暂时停止

这个用于学习的Java虚拟机已经停止开发一段时间了。一个多月来,我没有继续做相关开发工作。谢谢大家的光顾和关心。开发已暂时停止,我也不知会停多久。如果在阅读或调试这个虚拟机源代码的过程中发现什么问题,仍然可以提出来,我偶尔会上线来看看。或者写信到这个邮箱:[email protected]。...

2014-04-01 16:37:48 133

初步支持String和StringBuffer类

这个版本支持了针对String的ldc指令,以及简单的java/lang/String类和java/lang/StringBuffer类。可以在java程序中调用System.out.print来打印字符串了。注意,编译java源文件的时候要按1.4的版本编译,因为java/lang/StringBuilder类是1.4版本后引入的,在此之前只有StringBuffer类。例如,编译如下的...

2014-02-18 13:30:27 113

开始支持本地方法

这个版本开始支持本地方法,目前仅在Windows平台上编译通过,通过嵌入Intel汇编指令,把本地方法的参数入栈。可以运行这个版本包里的TestNativeMethod来测试下。...

2014-02-07 13:27:05 121

对于下载和阅读的建议

我开发这个Java虚拟机,是用来学习的。我在开发过程中自己学习,也提供给凡感兴趣的朋友学习和参考。目前这个虚拟机的实现还是很初级的。我甚至有意不做优化,或者在很少的地方优化,又或者,随着一个又一个版本慢慢地去优化,目的是让初学者能看到这个过程是怎样演进的。毕竟对初学者来说,去理解含在虚拟机中的概念和思想是首要的。经常我在某个地方“卡壳”了,就想:这个问题别人是怎样解决的?为了解一个细节,我不得不花...

2014-01-15 21:29:07 97

原创 实现数组相关指令

版本v034实现了数组相关指令。最近的版本(v04)准备支持本地方法和小型的类库。

2014-01-14 10:15:38 157

为这个虚拟机写测试例子

应panqj_hust的需要,我举例说明如何为这个虚拟机写测试例子。我在开发这个虚拟机的过程中,为了检查是否正确,也写了好些测试Java类。这些例子很多,不在这里一一列举出来。我只是举一两个例子,说明怎么写测试例子。实际上不难写。例子1:[code="java"]class Ball extends Exception{}class Pitcher {p...

2013-11-10 11:36:08 106

支持Java类的初始化方法

这个虚拟机版本在Java类首次主动使用的时候调用其方法,参考了虚拟机规范。另外对于Java异常处理中的"异常",作了简化处理。

2013-11-09 11:06:23 113

原创 一个学习用的Java虚拟机即将完成

我花了四五个月的时间开发一个学习用的Java虚拟机。这件事快要完成,所开发的虚拟机可以执行简单的java程序。

2013-11-06 23:05:06 836 2

实现Java异常抛出和处理

这个版本实现了Java的异常抛出和处理。我只是初步测试了它,看起来可以工作。

2013-11-06 18:01:01 128

原创 整理和规范虚拟机异常,增加打印信息,补充其它Java指令实现

这个版本完成以下工作:1. 对虚拟机的各种错误进行了整理和规范,但尚未支持Java异常处理。2. 继续增添了虚拟机执行的调试打印信息,并且可以设置输出开关,信息也分级别。3. 补充了算术运算,跳转,逻辑运算等Java指令,现在已实现大多数的Java指令。没有做的事情,或者将要去做的事情:Java异常处理本地方法调用数组有关指令字节码验证垃圾回收目前这...

2013-10-24 16:32:19 89

处理了Java接口,增加了调试信息,实现了invokeinterface指令

这次的主要修改如下:.命令行支持调试参数,可以打印每条指令执行后的pc寄存器和栈信息。.以前主要考虑Java类,这次对接口也考虑和处理了。.修改了invoke系列指令中获取objectref的一个bug。.实现了invokeinterface指令。...

2013-10-15 21:01:40 194

实现invokespecial指令和invokevirtual

自从上次实现new指令之后,我没有马上实现invokespecial指令,因为对于invokespecial指令的理解需要时间。现在基本实现了invokesecial指令,但是在权限检查上遇到一个困难,主要是派生类对于基类protected实例成员(非静态成员)的访问。这个问题暂时忽视了。接着实现了invokevirtual指令,也遇到访问权限方面的疑问。我参考“深入java虚拟机”的一个例子,这...

2013-10-09 22:01:29 171

原创 实现new, getfield, putfield指令

最近几天的工作是初步实现了new, getfield和putfield指令。修改了对于字段和方法的权限检查,更加严格了。

2013-10-05 18:07:27 1317

原创 实现对字段和方法的递归查找

在实现了对类的递归加载之后,我就着手实现对字段和方法的递归查找,因为意识到我先前仅对当前类查找字段或方法是不够的,为此我参考了"深入Java虚拟机"以及JVM规范。目前实现了对类字段或方法的递归查找,同时检查了访问权限。但对于接口则暂时忽视了。源代码的主要修改:1. 修改getstatic, putstatic, invokestatic指令的处理,支持递归查找字段或方法,并检查访问权...

2013-09-30 21:06:57 133

原创 实现对java类的递归加载

在上一次写了对静态字段的get/set之后,发现我的getstatic/setstatic指令实现得并不完全,因为我只查找了当前类的静态字段,但似乎jvm规范要求递归查找静态字段。于是我联想到,当初在java类的加载时,我把类的递归加载问题搁置一边,而只单单加载所指定的类,并不递归加载其super classes。因为我本着“推迟,直到必须用到时再加载”的想法。不过,既然迟早要加载super cl...

2013-09-27 10:21:09 100

原创 实现getstatic和putstatic

继上次实现了静态方法调用之后,又实现了对静态字段的读写,即getstatic和putstatic指令。通过了下面一段java代码的测试。public class ClassHasStaticField{private static boolean _z;private static byte _b;private static char _c;private static ...

2013-09-15 13:12:14 1187

原创 虚拟机开发进展(转向iteye博客)

目前虚拟机开发取得一点进展。因为CSDN博客不支持上传附件,故此我将在iteye的博客上发表一些开发过程情况。http://simpleman7210.iteye.com/blog/1938880 由于这些过程中的版本不是较为成熟的,所以暂时不太适合作为CSDN的资源上传。

2013-09-08 23:48:53 563

原创 java虚拟机开发,刚刚走通执行了一段测试java代码

我想开发一个学习用的Java虚拟机。做这件事已经有二三个月了。今天刚刚跑起来,执行了一段简单的java代码。虚拟机开发是一件复杂的事情,有许多事情要做。现在只做了了一点工作而已,让它跑起来,可以执行几条简单指令。这是我用来测试的一段java代码:public class ClassHasStaticMethod{public static void main(){...

2013-09-08 22:46:49 132

原创 我的CSDN个人空间

我在CSDN上的空间地址:[url]http://my.csdn.net/simpleman7210[/url]

2013-08-18 22:04:18 114

原创 回复java_gh的一个问题

我看到java_gh在CSDN C/C++版块的一个问题,因为是初学者所提问题,我就热心帮助一次。但并不表示我赞同那种做法。唉,那种编程,是不走正路的。初学者做这种东西,不利于学到真正知识,也不利于培养对编程的兴趣。因为这是一种hack式编程。如果扫雷程序没有公开二次开发接口,只有通过给扫雷窗口发消息的方式,但你心里要知道这种做法是不正规的。我没有直接在原贴上回复,因为看到有人的回复象

2013-08-15 08:53:00 801

原创 做事要认真

做事情,就要认真做好。但是,也不要单顾念自己的事。以至于行在孤单的道路中,不为人和神喜悦。可以抱怨,但也要知道,过多的抱怨不能解决什么。面对困难的时候,要沉静,不要被困难抬着浮起来。因为人比事情更大。我们当象上帝一样,看人为尊贵。人不被困难所胜,他就比那看见或看不见的更大。这正是上帝的心意,熬炼我们,如同熬炼金银。因为他要使我们成全完备,没有瑕疵。做事情,就要专心、深爱地去做。如同

2013-07-29 13:56:58 580

原创 一个hash表的实现

按照先前的设想,写了一个一般性的hash表。为了支持各种类型,这个hash表写为模板。Hashtable模板类#pragma once#include "util.h"//默认情况下,MyComparer以及MyHasher可以工作于一般类型,特别是基本数据类型//必须遵守一致性:两个key若是相等,其hashCode也一定相同。templateclass My

2013-07-28 23:05:26 715

原创 符号表与哈希表

符号表的需要: 对一个java类完成解析之后,可以根据这个类的名称(全限定名)快速访问其相关数据。大概来说,符号表第一要存储那些符号,第二要能快速检索符号。 哈希表:为了快速检索,符号表一般是基于哈希表(Hash table)实现的。hash表的主要行为有:    插入    查找    删除(一个或全部)    重新hash(增大表的容量)    枚举

2013-07-27 14:54:02 2768

原创 关于垃圾回收

我首先思考的是,垃圾回收(GC)的必要。考虑有三个指针a,b,c都指向同一个对象。如果允许执行:delete c;那么a和b将成为悬浮指针。这就容易导致一些程序错误发生。因此, java需要GC,首要的原因就是安全性。正是由于安全性的问题导致GC的出现。GC在技术上的实现,目前我尚不清楚。一个主要疑惑是:对象句柄可能存在于方法区,存在于成员变量,存在于栈中;如果要搜索所有这些地方,

2013-07-25 11:17:41 477

原创 关于虚拟机的一点想法

这里所说的虚拟机,侧重于"虚拟指令计算机"的含义。如果基于java指令实现虚拟机,并且支持多进程,考虑当执行某个java指令时要求加载一个X类,应该如何处理?首先,应该由bootloader来加载X类。bootloader加载以"java"开头的package里面的类。java类加载体系支持应用扩展,但首先委托bootloader加载。类可以加载,也可以卸载,当没有使用者的时候。比如,

2013-07-25 00:11:56 553

原创 解析class文件-方法

目前完成了对class文件方法的解析。注意,无论是对接口,域,方法,还是对常量池的解析,目前所做的工作都是试验性的。我只是按照class格式分析,至于解析结果如何保存为合理,则到开发执行引擎时才能清楚。此次修改也调整了一些其它代码,故此贴出完整代码。 ClassFileParser.h#pragma once#include "util.h"//u1,u2,u4分别

2013-07-17 17:12:16 668

原创 模拟实现一个多线程环境

引言初学者或者一些有经验的开发人员,并不总是对于系统底层有清楚的了解。比如,进程(或线程)调度是如何实现的?往往只停留于模糊的认识。了解这些问题的最好途径是亲自实践。然而开发一个真实系统的门槛很高,而通过学习一个已有系统来了解也非易事,因为错综复杂的代码和关系有时把人搞糊涂了。于是学习者往往写一些模拟程序来努力表达系统是怎样运作的。不过,这些程序往往过于简单。于是“看看能否写一个模拟进程调度的

2013-07-15 08:37:03 2291

原创 多重继承

多重继承在面向对象的领域中,对于多重继承的意义、是否需要在C++引入是有争论的(是的!多重继承在纯粹的对象思想看来有些怪异)。基本上撇开对于它的意义的探究,在下面着重阐述的是C++中多重继承的实现技术,以解释一些看来不易理解的地方。考虑一个类C同时继承类A和类B。那么一个c对象(C的实例)将既包含一个a对象(A的实例),也包含一个b对象(B的实例)。我们知道,在单继承情况下,继承对象是

2013-07-15 08:18:23 1080

原创 参数传递和返回值

参数传递和返回值对于原始类型(或称基本类型),如int, char, float, 指针 等,参数传递和返回值不会碰到什么难以理解的问题。能引起关注的焦点是,当我们把对象作为参数传递,或者返回一个对象时,这里面发生了什么?我个人觉得,“返回一个对象”的说法或概念尤其难以理解。例如函数f()返回一个对象(类A的实例):A a;a = f(); // 或者:f().f1()

2013-07-15 08:16:35 669

原创 构造函数和析构函数

构造函数和析构函数构造函数提供了一种机制,通过它有机会完成必要的初始化工作,从而使对象成为有意义的存在物,而不仅仅只是一块原始的空间。但是,我们逐渐了解到,构造函数具有的地位,不仅对于用户(程序员),对于编译器履行职责也极为重要。通过这个机制,它让C++的一些基本的特性,如继承、多态得到了正确的贯彻和表现。首先不难理解的一点是在构造函数中,要确保基类对象的正确构造,如果是从基类

2013-07-15 08:14:56 597

原创 多态和虚函数

多态和虚函数在C++中,多态是通过虚函数实现的。基类如果把一个函数声明为虚的(virtual),就表明继承类可以覆盖(override)这个函数(从而表现不同的行为,呈现出多态性)。对于每一个有虚函数的类,或者覆盖了一个或多个基类虚函数的继承类,可认为有一个与之关联的虚函数表(v-table)。v-table表中的每一项(slot)中存储的是适当的函数指针。C++编译器在编译时

2013-07-15 08:09:11 539

原创 成员函数和this指针

成员函数和this指针类的成员函数和一个普通的(全局)函数可以认为没有什么差别。对于编译器来说,经过名称处理后(利用命名空间、类名、参数等信息进行技术性处理,使函数名称内部唯一),一个成员函数其实就是一个普通函数,在编译后的代码区域有着确定的函数体和函数入口。最大的差异发生在调用时,对于成员函数,编译器将隐含push this指针,this指针指向对象的地址(对象可能位于栈上或堆上或全局数据区

2013-07-15 08:05:54 809

原创 继承和对象自然增长

继承和对象自然增长C++中类的继承,是具有自然增长效果的。如果基类是Base,继承类是Derived,那么创建一个Derived类的实例b,在地址空间上,b的前面部分,刚好可以视为另一个Base的实例(a),后面才是继承所带来的扩展数据部分。所以继承具有自然增长效果(有时我也说成净增长或者净扩展)。C++的继承绝不会破坏基类的数据结构,这可以肯定是一个基本原则。因为如此,所以C++对象可以安全

2013-07-15 08:04:30 526

原创 可变参数与参数进栈顺序

可变参数与参数进栈顺序C支持可变参数的函数,这里的意思是C支持函数带有可变数量的参数,最常见的例子就是我们十分熟悉的printf()系列函数。我们还知道在函数调用时参数是自右向左压栈的。如果可变参数函数的一般形式是:f(p1, p2, p3, …)那么参数进栈(以及出栈)的顺序是:…push p3push p2push p1call fpop p1pop p

2013-07-15 08:02:23 964

原创 关于C++的一些文章

早些年我写了一些关于C++的一些文章。这些文章是我学习C++的一些总结。我把它们贴出来,希望对C++初学者,或对底层技术感兴趣的人有所帮助。这些文章涉及可变参数,虚函数,构造函数和析构函数,多重继承等。有些论述我没有完成,如RTTI,异常处理。尽管如此,我希望已写的部分对C++的学习者有益处,如果确实对你有帮助,我将为你高兴。有不准确或不清楚的地方,欢迎一起讨论。

2013-07-15 07:56:03 685

原创 继续解析class文件-接口和域

之前解析了常量池,继续解析其它部分,目前完成了接口(interfaces)和域(fields)。另外代码作了一些调整。下面把修改的部分贴出来。 ClassFileParser.h 修改部分struct field_info{u2 access_flags;u2 name_index; //field simple name, 索引必须指向常量池的一个CONSTANT_

2013-07-14 20:20:07 583

原创 测试解析class常量池

我建立了一个JVMTest工程,用于测试。在这个工程中编写和测试一些utilities。每个功能可以单独测试。关于常量池的解析已初步完成,代码如下。JVMTest.cpp#include #include #include #include "ClassFileParser.h"#ifdef WIN32#include #else //unix,li

2013-07-09 22:20:21 658

原创 解析class文件常量池

写虚拟机的第一步,就遇到常量池解析。参阅Java虚拟机规范及众多资料,可以知道class文件的格式,常量池位于class文件的前面。常量池由若干个常量池项组成,常量池项的一般结构是(C/C++描述):typedef unsigned int u4;typedef unsigned short u2;typedef unsigned char u1;struct cp_i

2013-07-08 12:03:04 668

原创 开发一个能工作的Java虚拟机

在一项研究计划中,需要实现一个简单的Java虚拟机。如何简单呢?能工作就行。这要求开发一个虚拟机引擎,能执行Java指令。我将在这里记录下开发的过程,包括设想,遇到的问题等等。留下这样一个记录,也是为了监督和鼓励。因为一个人开发有时感到孤单和苦闷,尤其动力不足的时候。如果失去兴趣,如同汽车没有油。我做这个研究的目的,是为了与众人分享。我已经在计算机领域做了多年的开发,希望我所做的事情能

2013-07-08 11:06:59 1127

一个学习用的Java虚拟机实现(v04)

此版本准备支持本地方法和一个小的Java类库.

2014-01-07

一个用于学习的java虚拟机实现

这是一个学习用途的Java虚拟机实现,用C++写的。这个虚拟机采用原始的解释方式执行Java指令,并且没有什么优化。这个虚拟机实现了大部分的Java指令。目前未实现字节码验证,不支持本地方法,没有什么类库(除了最基本的Object类和一些异常类),也没有垃圾回收。

2013-12-04

一个简单的Java虚拟机实现(v032)

这是一个简单的Java虚拟机实现,用C++写的。可以为它编写和运行简单的java程序。这个程序是写给初学者学习用的,当然它还不完善,指令也还没有完全实现。只希望它对于初学者学习Java虚拟机有所帮助。

2013-10-15

模拟多线程环境(源代码20130812)

这是模拟多线程程序的更新版本。增加了命令行,执行象dir, cd, type等一般命令。补充了文件系统move_file在多线程环境下的一个简单实现。

2013-08-13

模拟实现一个多线程环境

这是用C++写的一个模拟程序,所模拟的是操作系统的线程/进程调度,文件系统,内存管理。我认为这个模拟程序适合初学者学习,或者任何想搞清楚系统怎么运行的人。这个模拟程序自身作为一个用户进程运行,然后它在用户空间模拟出线程来,作为基本调度单元。希望这个模拟程序给你学习操作系统原理带来帮助。

2013-07-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除