【进行中,随时弃坑】简易JVM的C++实现

源码地址:https://pan.baidu.com/s/1Jj1H5uL3RLDzZARxFD0Bfw

提取码:68x7

2019.07.04更新

一、想法:

暑假闲着也是闲着,不如做一些有趣的事情,所以我决定做一个简易的java虚拟机。其实真的是心血来潮,因为几天前我在找关于java虚拟机学习资料的时候无意间发现了一本书——《自己动手写java虚拟机》。哇,手写jvm,这也太酷了吧(划重点)!于是我决定开坑也写一个jvm。当然要求不高,能打出Hello World,进行简单的累加运算,我就很开心了。当然啦我图样图森破,姿势水平不够,随时可能弃坑。

这篇博文就当做我的开发日志总目录吧。截止发布这篇文章前,还在进行.class文件字节码的解析工作。这还是肝了4天的成果,看来路漫漫啊。不管了,反正又不是什么课设作业。每天学习之余抽点时间码一下,等到下个暑假到来之前,应该能开发完的,吧。

二、参考资料:

1、《自己动手写java虚拟机》

2、《深入理解java虚拟机》

3、其他一些博主的博客

三、开发说明

1、开发语言——C++

《自己动手写java虚拟机》的作者用的是Go语言开发,讲了一些理由。我觉得他说得很有道理,然后选择了C++。主要是因为强迫症在作怪,觉得别人的jvm用C/C++写(当然C/C++效率高也是一个原因),我也要用。当然Go也是要掌握一点的,不然根本看不懂书,写不下去。

选择了C++,有一些Go语言提供的包是没有的,要自己想办法解决,无疑增加了不少难度

2、开发编译器——VC++6.0

由于电脑太渣,VS哪个版本都带不动,所以采用了VC++6.0来开发。由于不知道怎么分子文件夹,cpp文件和h文件都只能胡乱丢在工程文件夹下,每次去找dsp文件打开工程时就很蛋疼。这也表明了不能像《自己动手写java虚拟机》里面一样建一堆go文件。吐槽一下,在辣么多go文件里面看代码让我很崩溃。我觉得有些go文件应该合并在一起才对,而且我在后面开发中也确实这么做了。

3、开发方法——看书,看博客,参照Go语言版本的虚拟机

《自己动手写java虚拟机》的作者提供了go语言版本的虚拟机,这给我提供了一个参考:通过在一些代码里增加输出语句,可以直观了解工作过程。当然长者的人生经验也是很重要的,要多看书和博客,提高姿势水平。

---------------------------------------------------------分割线----------------------------------------------------------

开发日志:

一、classLoader.cpp开发(2019.06.27):

https://blog.csdn.net/qq_40636117/article/details/94394949

说明:这个文件用于加载搜索类文件(.class)并读取其中的字节码内容

二、classDecode.cpp开发(2019.06.30):

说明:根据.class格式,解析其中的字节码内容

1、https://blog.csdn.net/qq_40636117/article/details/94415960(解析基本信息及常量池)

2、https://blog.csdn.net/qq_40636117/article/details/94654292(解析属性池)

3、https://blog.csdn.net/qq_40636117/article/details/95618443(解析方法,字段表属性)
————————————————
版权声明:本文为CSDN博主「扬·索顿费斯」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40636117/article/details/94383044

原文地址:https://www.cnblogs.com/it-deepinmind/p/12222650.html

时间: 2024-08-03 07:36:36

【进行中,随时弃坑】简易JVM的C++实现的相关文章

弃坑pexpect,入坑paramiko

弃坑pexpect,入坑paramiko 上文书说到,ssh库pexpect的使用,简直就是个"月亮公主"--满眼全是坑.勉强把程序写好了,跑起来的时候发现了一个新坑,让我不可抗拒的把它弃掉了--经常莫名其妙的连不上服务器!开线程连接14台服务器,总有1到3台连不上,还查不到原因.这还了得!一怒之下把写好的pexpect封装库删掉了,用paramiko重新写起.其实这个库也是有一些坑的,这个放在后面说.先介绍一下这个库的用法. 安装方法:没有什么新鲜的 pip install para

一个简易JVM的实现

 http://catpad.net/michael/jvm/是一个开源的简易的JVM实现.它实现了大多数的JVM功能,实现简单,适合广大技术爱好者了解JVM的内部工作原理.可以参考<Inside the Java Virtual Machine>by Bill Venners,本书对jvm结构,Java class的定义有详细的讲解. 本文介绍下其中的一些关键实现点: 类加载,class loading 线程和同步, thead,synchronization 代码解释 GC JNI 1

jzy3D从入门到弃坑_3使用jzy3D0.9画2D散点图--多条线条

jzy3D从入门到弃坑_3 使用jzy3D0.9画2D散点图--多条线条 觉得有用的话,欢迎一起讨论相互学习~Follow Me 主要思路 将多个线条的二维数组读入Scatter对象 存入到同一个画布中 存入多个Scatter对象中 package momfo.metaheuristics.momfea; import momfo.core.SolutionSet; import org.jzy3d.chart.Chart; import org.jzy3d.chart.ChartLaunche

Netty中的那些坑

Netty中的那些坑(上篇) 最近开发了一个纯异步的redis客户端,算是比较深入的使用了一把netty.在使用过程中一边优化,一边解决各种坑.儿这些坑大部分基本上是Netty4对Netty3的改进部分引起的. 注:这里说的坑不是说netty不好,只是如果这些地方不注意,或者不去看netty的代码,就有可能掉进去了. 坑1: Netty 4的线程模型转变 在Netty 3的时候,upstream是在IO线程里执行的,而downstream是在业务线程里执行的.比如netty从网络读取一个包传递给

iOS内购(IAP)中的那些坑

公司的公共库原来并没有这部分的代码,以前做内购是用两个比较有名的github上的第三方库.一个叫MKStoreKit,另一个叫IAPManager,我看了一下写的都很辣鸡,使用起来很不方便,而且写的还不对...... 于是我自己写了一个,一开始写的也不是很好,受了上面两个垃圾库的影响(这两个库接口是用postNotification的),使用时还要监听事件,下面的小弟吐槽说不太好用.于是我又重做了一个接口为block的版本,感觉写的还是不错的.这下用的就很舒服了! 虽然github上也有几个写的

弃坑而逃——

好吧,眼看就是生地中考了.. 趁端午,恶补了一下OI,无奈,只能弃坑一段时间啦 希望生地中考和期末不留遗憾把! 23:06 5/29/2017

记一次Nancy 框架中遇到的坑

记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上.搞了两天,终于解决了.于是把它记录下来,以避免其他人也碰到这种情况. 起因 公司一个Nancy 框架 开发的web网站,以前一直都是好的,nancy 框架也用在了很多项目里面,基本上已经很成熟很稳定了,但是在前几天发布某个web网站的时候,竟然出现部分用户登录不上的情况.刚开始以为是人员的权限有问

Python数组创建中的这些坑,你造吗?

本文和大家分享的主要是python 中创建数组过程中的一些坑,一起来看看吧,希望对大家 学习python 有所帮助. 1.问题的引出 在做leetcode 的题目时,遇到了一个求数组中出现次数最多的 k 个元素的题,参照答案的思路,首先利用一个 dict 记录所有元素出现的次数, key:value 中的 key 表示元素, value 表示元素出现的次数,随后根据元素出现的次数将元素放入对应的桶中,桶是一个二维数组,桶中第一个元素保存出现次数为 0 的元素,桶中第二个元素保存出现次数为 1 的

ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者其他. 1.创建序列 Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE 权限 CREATE SEQUENCE CUX_DEMO_SEQUENCEMINVALUE 1MAXVALUE 99999999999START WITH 1000