之前看过两遍《深入理解java虚拟机》,能吸收点知识,但是远远没有能够深入理解。最近购入张秀宏著的《自己动手写Java虚拟机》一书,抱着想要更深地理解JVM的目的去学习,并记录下学习笔记。第一章节还是先来准备环境。
Java
关于Java环境的准备步骤就不赘述了,本人使用的版本是1.8.0_91
Go
这本书的JVM实现是用Go写的,之前没有接触过,在这一学习过程中顺带就把Go也简单地学习下了。Go的安装参照golang,选择的是目前最新版是1.7.4。Go的参考资料选择Go语言圣经和Go语言指南。
Go安装步骤:
- 下载对应版本的安装包,本人系统时Ubuntu,所以选择的是go1.7.4.linux-amd64.tar.gz
解压到安装目录
1sudo tar -C /usr/local -xvf ~/Downloads/go1.7.4.linux-amd64.tar.gz添加环境变量,各个系统配置环境变量的位置不一样,具体自行查看
1234#添加Go的运行环境路径export PATH=$PATH:/usr/local/go/bin#添加Go工程的工作空间,下面是本人的工作空间,可自行修改export GOPATH=/home/zhangjing/IdeaProjects/jvmgo/go测试Go环境是否安装成功
12~ go versiongo version go1.7.4 linux/amd64
Go环境安装完毕,编辑器本人还是选用Intellij IDEA,安装个Go插件,直接在线安装即可,顺便附上插件地址。安装完毕之后,新建个项目,放到在$GOPATH目录下。Go的源文件位于src目录下,Go语言的代码是通过package来组织的,可以在src下建自己想要的包名。下面建个Go文件测试下:
根据上述图片可以看出,项目放在$GOPATH目录下,包和go源文件都位于src目录下。这里再稍微讲解下helloworld.go文件,package main是一个比较特殊的package。这个package里会定义一个独立的程序,这个程序是可以运行的,而不是像其它package一样对应一个library。在main这个package里,main函数也是一个特殊的函数,这是我们整个程序的入口,所以helloworld.go是个可运行go文件。在idea中可以直接右键运行程序,这个没啥好说的。但还是有必要了解下Go提供的命令行工具:
直接运行
123cd /home/zhangjing/IdeaProjects/jvmgo/gogo run将运行go文件go run src/cn.didadu/hello/helloworld.go先编译再运行
12345cd /home/zhangjing/IdeaProjects/jvmgo/go生成可执行文件go install cn.didadu/hello生成类库go install cn.didadu/jvmgo要注意下go install命令,目录只需要从src的子目录开始,目标也是目录不是文件,执行install命令的时候应该是从$GOPATH下的src目录开始查找给定的包。这样的话,第一行的cd命令就是多于的了。go install命令执行之后会在$GOPATH目录下新建bin目录,和src同级,会把helloworld.go编译成和包名一致的可执行文件(hello)放到到bin目录中。这个bin目录也就是go工程放置可执行文件的目录了。另外会看到还有一个pkg目录,该目录是放置非可执行文件的类库目录。
至此,环境准备工作就做好了,下面就可以开始学习了。示例代码位于本人gitbub仓库jvmgo项目下。
实现java命令
Java环境安装完毕,我们通常都会在命令行输入java -version
来测试下是否安装成功。java -verson就是Java提供的命令功能,而本节就来实现这一功能,代码位于cmd包下。下面先列出一些java命令常用的选项以及用途:
选项 | 用途 |
---|---|
-version | 输出版本信息,然后退出 |
-?/-help | 输出帮助信息,然后退出 |
-cp/-classpath | 指定用户类路径 |
-Dproperty=value | 设置Java系统属性 |
-Xms |
设置初始堆空间大小 |
-Xmx |
设置最大堆空间大小 |
-Xss |
设置线程栈空间大小 |
说明一下,本人也是初次使用Go语言,有使用不当的地方还请谅解,而且可能会使用比较多的注释来说明下Go语言语法。
下面将编写开始编写简单的java命令行程序,核心代码位于cmd包下的cmd.go文件中。其中用到了Go内置的fmt、os、flag包,先稍微了解下这三个包:
- fmt:格式化输入输出
- os:提供了操作系统无关(跨平台)的,与系统交互的一些函数和相关的变量
- flag:处理命令行参数
|
|
测试代码位于jvm包下的main.go文件中,本章节以及后面的所有功能都将使用这一个测试入口,这一节特别说一下,后面就不说了。
编译main.go,并测试-version
这一章节就写到这里,实现了一个简化的命令行工具,主要的还是接触了一门新的语言Go,要学的东西还很多,继续努力吧。