手写java虚拟机(一)——搭建环境
毕业设计打算做一个java虚拟机,首先要对java虚拟机有一个简单的了解(jvm)。目前市面上有众多的jvm,如sun公司的HotSpot VM、Classic VM,IBM公司的J9 VM等等,这里以sun公司的HotSpot VM为蓝本实现一个java虚拟机。为什么选用hotspot呢,因为这个是目前jdk里面自带的并且是默认的jvm,也是使用最多的jvm。

虽然世面上的jvm众多,但是所有的jvm都遵循一个标准——java虚拟机规范。这里我给出JAVA7的规范,https://pan.baidu.com/s/1Yj4Ai08hKl4DNgfNfkySYQ。
上图是Java虚拟机的基本构成,包括类加载器子系统、运行时数据区、执行引擎以及本地方法接口等,其中运行时数据区又由方法区、堆、Java栈、PC寄存器和本地方法栈组成。这些基本组成都是实现一个Java虚拟机所必须的,因为Java虚拟机是一个规范,通过这个规范来让Java语言具有跨平台的特性,所以必须要遵守,否则就会破坏到Java语言的特性。
介绍完了jvm,接着就是一系列准备工作。
先选择语言,多数jvm是使用C\C++来编写的,因为C\C++是比较接近底层的语言,但是C\C++太过于复杂,我又比较怕指针,所以选择了一门比较小众的语言——GO。GO语言是google2012年推出的一门语言,go语言介于C和java之间(指与硬件的距离,C\C++更接近硬件),支持指针但不支持指针运算,更为安全,同时最重要的一点就是go语言自带垃圾回收,了解jvm的都知道垃圾回收是jvm里面一个非常重要也非常难的地方。
然后是jdk,这里选用的是jdk1.8.0_144。安装好jdk,配置环境变量。配置过程,https://jingyan.baidu.com/article/e75aca85b29c3b142edac6a8.html。配置完成后,打开命令提示符,输入cmd回车,输入java -version回车,出现对应版本即表示配置成功。

最后是安装go。从go的官网下载,https://golang.org/。如果go官网无法访问,也可以用http://golangtc.com/download下载。下载之后的如果是安装包,那直接安装并配置GOPATH环境变量即可(安装包会自动配置GOROOT变量)。如果是压缩包,那解压之后要配置GOROOT和GOPATH环境变量。GOPATH环境变量指定的是go语言的工作目录,go语言以包为单位组织源代码,这个包就放在GOPATH指定的目录下面。GOROOT指定的是go命令行工具文件夹,使用go命令时会自动在这个GOROOT下寻找go.exe。
这里我配置的GOPATH为D:\JVM\goWorkSpace。如图

配置完成后,打开命令提示符,cmd回车,输入对应信息会出现如下内容,即表示安装go并配置环境变量成功。

最后说一下整个工作空间,我的GOPATH为D:\JVM\goWorkSpace,在这个文件夹下面创建src作为存放源码的文件夹,另外,当你后面运行和编译的时候会出现另外两个文件夹,pkg和bin,pkg为一些包信息,而bin中的为可执行文件。
这样整个准备工作就做完了,接下来会一步步完成整个JVM。
手写java虚拟机(一)——搭建环境的更多相关文章
- 手写JAVA虚拟机(三)——搜索class文件并读出内容
查看手写JAVA虚拟机系列可以进我的博客园主页查看. 前面我们介绍了准备工作以及命令行的编写.既然我们的任务实现命令行中的java命令,同时我们知道java命令是将class文件(字节码)转换成机器码 ...
- 手写JAVA虚拟机(二)——实现java命令行
查看手写JAVA虚拟机系列可以进我的博客园主页查看. 我们知道,我们编译.java并运行.class文件时,需要一些java命令,如最简单的helloworld程序. 这里的程序最好不要加包名,因为加 ...
- [JVM] - 一份<自己动手写Java虚拟机>的测试版
go语言下载 配置GOROOT(一般是自动的),配置GOPATH(如果想自己改的话) 参照<自己动手写Java虚拟机> > 第一章 指令集和解释器 生成了ch01.exe文件 这里还 ...
- TessorFlow学习 之 手写数字识别的搭建
手写数字识别的搭建
- 6 手写Java LinkedHashMap 核心源码
概述 LinkedHashMap是Java中常用的数据结构之一,安卓中的LruCache缓存,底层使用的就是LinkedHashMap,LRU(Least Recently Used)算法,即最近最少 ...
- 3 手写Java HashMap核心源码
手写Java HashMap核心源码 上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码. 我们来先了解一下HashMap的原理.HashMap 字面意思 has ...
- Java/Andriod- 使用Eclipse搭建环境
从网上找来的,做了一点小修改,我自己试了一下,1.3步骤我没去做,最后也不影响. 在开始Android开发之旅启动之前,首先要搭建环境,然后创建一个简单的HelloWorld.本文的主题如下: 1.环 ...
- 2 手写Java LinkedList核心源码
上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素.在查找需求比较重要的 ...
- 1 手写Java ArrayList核心源码
手写ArrayList核心源码 ArrayList是Java中常用的数据结构,不光有ArrayList,还有LinkedList,HashMap,LinkedHashMap,HashSet,Queue ...
随机推荐
- PAT-L3-球队“食物链”-dfs-状压-set
题目分析: 1. 一场双循环赛制的篮球赛,注意双循环,双循环! 2. 共有n只球队,两两之间有胜有负有平局: 3. 输入: 举例: 第一行:W:代表球队1打赢过这只队伍 L:代表球队2没打赢过这只队伍 ...
- 云计算 --> 技术原理
云计算技术原理 云计算分为IaaS.PaaS和SaaS三种类型,不同的厂家又提供了不同的解决方案,目前还没有一个统一的技术体系结构,下图是一个供商榷的云计算体系结构如下,它概括了不同解决方案的主要特征 ...
- vue-过渡动画
本篇资料参考于官方文档: http://cn.vuejs.org/guide/transitions.html 概述: Vue 在跳转页面时,提供多种不同方式的动画过渡效果. ●in-out:新元素先 ...
- Struts2学习笔记三 访问servlet
结果跳转方式 转发 <!-- 转发 --> <action name="Demo1Action" class="cn.itheima.a_result. ...
- 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障
3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...
- java冒泡排序和快速排序
本ID技术干货公众号"java工会",欢迎关注指正. 一.冒泡排序 1.算法介绍 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] & ...
- C语言博客作业—结构体
一.PTA实验作业 题目1:结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 void calc //函数calc求出p指针所指的结构体数组中 n 名学生各自的总分 { 定义循环变量i: ...
- socketpair创建双向通信的管道(全双工通信)
Linux下socketpair介绍: socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,例如sv[2] .这对套接字可以进行双工通信,每一个 ...
- Linux进程间通信--信号量
信号量绝对不同于信号,一定要分清,关于信号,上一篇博客中已经说过,如有疑问,请移驾! 信号量 一.是什么 信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件 ...
- 库函数atoi
函数名:atoi 功能: 把一个字符串转换成一个整数. 看似简单,主要是情况太多,需要注意考虑. 测试代码: Test(NULL); Test(""); Test("12 ...