手写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 ...
随机推荐
- 【Python】 基于秘钥的对称加密
[Crypto] 关于用python进行信息的加密,类似的解决方案有很多比如用base64编码进行encode,再或者是hashlib来进行hash.但是还缺少一种明明场景很简单的解决方案,就是把利用 ...
- c++ --> #define中的三个特殊符号:#,##,#@
#define中的三个特殊符号:#,##,#@ 看下面三个define宏定义: #define Conn(x,y) x##y #define ToChar(x) #@x #define ToStrin ...
- python+pycahrm+windows环境准备
python安装教程和Pycharm安装详细教程 首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进 ...
- [luogu1168]中位数_优先队列
中位数 题目大意:输出读入的前2*k+1个数的中位数.一共有n个数,按照读入顺序. 注释:$1\le n \le 10^9$. 想法:这是优先队列的一个应用qwq.我们弄两个堆.小根堆和大根堆,保证: ...
- Java注解(1)-注解基础
注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解 ...
- Tomcat 8启动速度慢原因1: At least one JAR was scanned for TLDs yet contained no TLDs
最近使用tomcat8启动项目时,发现At least one JAR was scanned for TLDs yet contained no TLDs这一步加载时间非常长, 从网上收集了各种资料 ...
- DOM4j的修改删除方式
?xml version="1.0" encoding="UTF-8"?> <contactList> <contact id=&quo ...
- struct2_拦截器知识点.
Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个 ...
- python实现朴素贝叶斯
参考:<机器学习实战>- Machine Learning in Action 一. 基本思想 简单的说,用概率的高低来决定数据属于哪一类别,这就是贝叶斯决策理论的核心思想,即选择具有最 ...
- SQLAlchemy 教程 —— 基础入门篇
SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLA ...