windows系统使用c++实现一个小型jvm(一)------------环境介绍及背景说明

  背景说明:

   首先,本个小demo并不是我自己写的,说是小demo,实际也不小,总共的代码量有3兆多了。原创的大牛在这儿-----用 C++ 实现了一个小型的 jvm!!!!   

  当我看到这个贴子时候以及它的代码量之后,心里是既高兴,又犹豫的。  为什么呢? 高兴是因为,没想到能够有机会接触这么底层的东西,当把它吃透后,想想自己的java造诣也能再进一步吧,同时也能呼应上一篇文章中我所讲的 java的gc机制。犹豫是因为它只支持linux和mac版本,而我较为系统的练习c++的时间,满打满算也才一周左右,对windowsd的api不熟悉,究竟能不能吃下它,是一个大问题。

  当然了,我此刻在这会写文章,足以表明我做了明智的决定,那就是吃下它,并且要好好地消化它。中间遇到的困难,也是溢于言表啊。

  我算上昨天,我花了总共两周整零五天的时间,全精力的投入它的实践。 第一周根据源码,编写其头文件,也就是api了。 这个过程我80%是手敲的,一方面为了熟悉代码,另一方面,也为了更好的移植。 第二周,就是根据源码,编写实现代码,也就是.c文件。 刚开始手敲了一部分,发现这个过程一直手敲的话,战线拉的太长,不利于整体学习。之后基本是复制的,当然复制也有一个原则,那就是绝不整个文件复制,而是以方法,或者代码块为单位复制,复制完后瞟一眼,留一个大体映像。 第三周,也是最痛苦的一周,那就是在windows平台进行调试,说实话这个阶段我差点就放弃了!!!想一想,在几千行代码,栈深度不确定的环境,调试某一个小小的错误,无异于大海捞针了。  我承认,我的成功,运气成分也少不了的,其中有一个细节,如果不是因为我前面复制的粒度够细的话,则整个大盘将无法运行(即,windows的原生线程优先级 与 自定义线程优先级的区别)。

  我想把这个过程记录下来,一方面是为了帮助有跟我这样需求差不多的朋友,另一方面,是为了巩固深化,更好的消化相关的知识。 

环境介绍:

  我采用的开发环境是:windows10(64位机) + mingw64 + clion + cmake + jdk_1.8_161的rt.jar(注意,不同版本的jdk的核心库,本地实现会有细微差别)。

   这里主要注意有如下较大的区别:

     1.原代码里面引用了 boost库的相关内容,考虑到windows平台使用boost的的各种不方面(尤其是,我不是使用vs进行开发),最终我是选择用代码将 boost所使用的库的内容进行了替换

     2.原代码使用的是 基于 Linux的pthread线程库,但是这个库在windows中,是不支持的。所以,所有与线程,锁,消息通知相关的部分,我均用windows的api进行了替换

     3.是关于cpu架构的,我的cpu架构是 x64 ,原代码中的 cpu架构是 x86的,这会导致编译失败。机智如我,将这块代码块给注了,代码编译就成功了,一切能这么顺利,我也是没想到。(令我更没想到的是,这将为我埋下第一个大大的坑。)

代码结构:

运行结果:

  在代码中可以发现,这里面实际上是不包括 java编译器的,但是我们完全可以用我们的本地java环境,写好源代码后,直接编译成字节码即可。   这里我使用了最简单的  hello,world!  程序,作用是输出 "hello,world!" 到程序的控制台上。 


  这一篇,暂时写到这吧,贴出源码地址:地址!

  后面几篇,我将从 windows需要避免的坑jvm的运行机制jvm的启动流程java的类加载细节java的gc流程 的逻辑层面来进行本次demo的消化。  

发布了340 篇原创文章 · 获赞 159 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_36285943/article/details/104709661