经过两个星期的努力,我自己DIY的JVM原型基础功能完工,暂定名为TotoroVM。原型是用Java实现的,待测试稳定后便推进到第二阶段,移值到c++平台。
包含功能:
1. class文件读取解析
《JVM规范》中定义了class文件的格式,基本上是以c类似语言的struct的语法定义的,所以有了借助javacc自动解析class文件的想法。主要步骤为:
1. 定义struct语法规则format.jj。
规则中描述了两个实体StructNode和FieldNode:
StructNode代表了一个struct结构,如: ClassFile, CpInfo...
FieldNode代表了struct结构中的元素,如:magic, majorVersion, minorVersion, constantPool...
FieldNode的类型可以是基础类型,如:U1, U2, U4, F4, F8,或者是StructNode类型,如:CpInfo constantPool[i]。
StructNode中包含多个FieldNode
一些特殊规则也有用到,需要额外支持
switch ... case,如:switch CpInfo.tag case 1 CONSTANTUtf8Info...
定义数组长度,如:constantPool[constantPoolLength]...
数组元素所占额外空间,如:CONSTANTDoubleInfo 占两格constantPool空间...
数组起始下标,如:constantPool[]下标从1开始...
2. 准备符合struct语法规则的数据文件format.txt
如果前一步骤准备充分,那这一步只需要从《JVM规范中》把struct结构复制过来,稍作修改即可。
3. 运用javacc将format.txt映射成StructNode和FieldNode的语法树
执行javacc命令,生成解释器FormatParser
执行FormatParser,输出若干个StructNode,每个StructNode下有多个FieldNode
4. 为StructNode生成Java映射类
一个StructNode对应一个Java类,类名是StructNode的name,每个StructNode下的FieldNode生成一个字段,同时为每个字段生成一个@Format注解,用来保存FieldNode除了名称和类型之外的信息,如:数组长度,switch-case语义数据,数组特殊规则...
5. 为某些映射类添加实用方法
这一步是为了以后使用这些对象方便而设的,如:ClassFile对象中有常量表ConstantPool,是以数组结构保存,如果要按名称搜索就需要另外的方法。添加实用方法有多种实现方式,如:继承父类,派生子类,代理模式封装,进一步扩展format.jj的语法等。我选择了代理类封装的方式来实现。
6. 解析class文件生成ClassFile语法树
至此,所以class文件的格式信息已经包含在映射类和它的封装对象上,终于可以看到些实质成果了,写一个ClassParser类,从根节点ClassFile开始,遍历所有包含@Format的字段,依次从class文件中抽取数据,遇到数组和Object类型的字段,就递归调用ClassParser。最终就可以输出一棵以ClassFile为根节点的语法树。
* 附件有我定义的format.jj和format.txt供参考
2. bytecode指令执行系统
先做这一部分是因为想第一时间看到结果,众所周知,Java的对象和数组都是保存在堆(Heap)中,而局部变量(包含基本类型和对象引用)保存在栈中。所以在没有实现Heap和常量表(ConstantPool)的情况下,方法中只要不是和对象,数组,方法调用有关的指令,还是可以执行的。
class文件中的代码段在ClassFile => MethodInfo => CodeAttribute结构中,主要包含了maxLocals,maxStacks和code[]属性。要了解这几个属性就不能不提到JVM的执行系统结构。
JVM使用的是基于栈(Stack)的结构,即指令的操作数和操作结果都是保存在栈中,而不是一般物理机的寄存器。如:两个整数相加的指令IADD,就是将栈顶的头两个元素(必须是int)出栈,把它们相加之后的结果再入栈。maxStacks属性就是java在编译过程中,编译器所计算出的这段代码执行过程中最多需要多少栈空间,而maxLocals,由于程序的局部变量也是保存在栈中,显然在一段代码中用于提供操作数的栈和局部变量栈是不能重叠和交叉的,所以每段代码执行的栈分配为栈的最前面maxLocals个空间保留给局部变量使用,中间一段固定长度由JVM实现自行决定和支配,一般是用来保存方法调用的返回地址,最后maxStacks个空间就留给了操作数栈。栈的空间固定为四个字节,在所有的基本类型加上对象引用中,除了long和double需要占两个空间外,其它一律占一个空间,不足4字节的,多余字节留空。
下面可以开始解释执行bytecode的指令了,JVM每个指定占一个字节,即0-255,JVM支持了200多个指令,所以接下来做的事情就是写一个大的switch-case,把这200多个指令一一解释一遍,和对象,数组,方法调用有关的 new系列, get/put系列,array系列,invoke系列,return系列还有case, instanceof暂时跳过。没有什么难度,纯体力活,不再赘述。
3. Constant Pool常量池生成
待续...
4. Heap堆内存管理
待续...
5. 本地方法调用
待续...
相关推荐
3个原子厚电子芯片原型出炉.pdf
视频直播社交产品原型源文件,主播产品客户端交互详细原型,直播产品原型,社交产品原型,主播产品原型,播客产品原型,安卓客户端产品原型,IOS产品原型,小程序产品原型 社交,直播,语音产品原型 视频直播社交...
《Axure后台管理系统原型设计详解》 在IT行业中,后台管理系统的设计与开发是至关重要的环节,它直接影响到系统的用户体验和工作效率。本篇文章将基于提供的"axure后台管理系统原型.rar"资源,深入探讨Axure工具在...
Axure 是一个专业的快速原型设计工具,让负责定义需求和规格、设计功能和界面的专家能够快速创建应用软件或Web网站的线框图、流程图、原型和规格说明文档。随着信息时代的爆发性发展,各种数据呈几何级数增加,所以...
4.后台管理系统框架原型.rp 5.支付宝小程序模板.rp 6.内容分享平台原型.rp 7.微信小程序模板.rp 8.交互原型Web.rp 9.交互原型移动端.rp 10.常用手机设备模型.rp 11.矢量插图.rp 12.交互手势图标列表.rp 13.设备模型...
交互原型设计:积分兑换低保真原型 交互原型设计是指在设计过程中,通过创建一种原型,来验证和测试设计想法的可行性和实用性。积分兑换低保真原型是指在设计过程中,使用低保真原型来验证和测试积分兑换系统的可行...
适合入门级别的产品经理参考,都是常用到的一些原型设计知识 适合入门级别的产品经理参考,都是常用到的一些原型设计知识 适合入门级别的产品经理参考,都是常用到的一些原型设计知识 适合入门级别的产品经理参考,...
原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型...
源码+原型+数据库 留言板管理系统源码+原型+数据库 留言板管理系统源码+原型+数据库 留言板管理系统源码+原型+数据库 留言板管理系统源码+原型+数据库 留言板管理系统源码+原型+数据库 留言板管理系统源码+原型+...
监控管理后台原型是一种用于设计和规划IT系统管理界面的工具,尤其在开发高效的企业级应用时,这样的原型显得尤为重要。本原型材料是基于作者的实际工作经验精心制作,旨在为需要构建全面监控系统的团队提供一个可...
在“P2P网贷app原型axure原型设计”这个项目中,我们看到两个主要的文件:“不跑贷(v1草稿-独家).rp”和“P2P网贷管理系统非托管专业版微信界面原型V1.0.rp”,以及一份“需求文档”。 首先,"不跑贷(v1草稿-...
Visio软件是一款由微软开发的专业绘图工具,尤其在创建流程图、组织结构图、网络图和软件原型设计方面表现出色。"visio软件原型图库"是指一系列预设的图形模板和元素集合,用于帮助设计师快速构建软件界面的原型。...
《蚂蚁金服原型设计——揭示高效工具的奥秘》 在当今互联网产品开发过程中,原型设计扮演着至关重要的角色。它不仅能够帮助团队快速验证概念,还能为设计师和开发者提供清晰的视觉指南,确保产品的用户体验(UX)...
Axure 原型设计:移动端图片管理原型 Axure 原型设计是移动端图片管理原型的关键组件,旨在提供一个基于交互式设计的解决方案,帮助用户更好地管理图片资源。本文将详细介绍移动端图片管理原型的设计思路、实现方法...
"医疗设备系统原型"是一个专门针对这一需求设计的产品原型,旨在优化医疗设备的运营效率和提升医疗服务的质量。在这个原型中,我们可以预期以下几个关键的知识点: 1. **流程审批**:在医疗设备的管理中,流程审批...
在本项目中,我们关注的是OA办公系统的移动端原型和Web端原型,这两个版本的设计覆盖了登录、考勤、打卡以及工时填报等关键功能。 首先,登录是用户进入OA系统的入口,设计时需要考虑安全性、易用性和用户体验。...
AxureUX WEB端交互原型通用组件模板库 v3 (组件列表) AxureUX WEB端交互原型通用组件模板库 v3 (组件列表) AxureUX WEB端交互原型通用组件模板库 v3 (组件列表) AxureUX WEB端交互原型通用组件模板库 v3 (组件列表) ...
SCM(供应链管理)供应链系统仿真原型是一种模拟实际供应链流程的工具,用于理解和优化供应链的运作。这个原型设计旨在提供一个全面的视角,使用户能够深入理解供应链管理系统的工作原理,并适用于真实的项目实施或...
### 强大的原型和原型链 #### 前言 JavaScript 的继承机制与传统面向对象语言(如 Java、C#)中的类继承不同,它采用了基于原型(Prototype-based)的继承模型。这种模型使得 JavaScript 在处理对象之间的继承关系...