手写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】 高级文件操作 shutil
shutil 很多时候,我想要对文件进行重命名,删除,创建等操作的时候的想法就是用subprocess开一个子进程来处理,但是实际上shutil可以更加方便地提供os的文件操作接口,从而可以一条语句搞 ...
- Redis分布式锁---完美实现
这几天在做项目缓存时候,因为是分布式的所以需要加锁,就用到了Redis锁,正好从网上发现两篇非常棒的文章,来和大家分享一下. 第一篇是简单完美的实现,第二篇是用到的Redisson. Redis分布式 ...
- pat 抢红包
L2-009. 抢红包 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 没有人没抢过红包吧-- 这里给出N个人之间互相发红包.抢 ...
- Lucene详解
一.lucene原理 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.它不是一个完整的搜索应用程序 ...
- 详细说明手工创建oracle数据库实例
手工建库比起使用DBCA建库来说,是比较麻烦的,但是如果我们学好了手工建库的话,就可以使我们更好地理解Oracle数据库的体系结构.手工建库须要经过几个步骤,每一个步骤都非常关键.它包括:1. 创建必 ...
- NVisionXRFBXConverter(Beta版)实践课程
一.前言 NVisionXR引擎使用的模型格式为.mesh(具体请看NVisionXR引擎基本介绍:http://www.arvrschool.com/read-7381 ),为了能够将常见的格式转换 ...
- 第二届强网杯-simplecheck
这次强网杯第一天做的还凑合,但第二天有事就没时间做了(也是因为太菜做不动),这里就记录一下一道简单re-simplecheck(一血). 0x00 大致思路: 用jadx.gui打开zip可以看到,通 ...
- 1.由浅入深解析 SimpleDateFormat
一.SimpleDateFormat简介 SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (date -> text).语法分析 (text - ...
- 【福大软工】 W班级总成绩排名3
评分链接: alpha测试 软件产品案例分析 总分排名: 团队千帆竞发图 总结: 本次排名是alpha测试 软件产品案例分析 两次排名的汇总. 1.alpha测试小组评价: 听说:10篇冲 ...
- alpha冲刺第二天
一.合照 二.项目燃尽图 三.项目进展 图形界面基本完成 接口文档框架完成,接下来将会不断细化填充 登录界面向服务器请求数据进行ing 四.明日规划 1.注册登录接口能够完成 2.研究idea实现获得 ...