icon1

Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手写一个。本书的目的就是带领读者按照Java虚拟机规范如无特殊说明,本书中出现的“Java虚拟机规范”均指《Java虚拟机规范第8版》,网址为http://docs.oracle.com/javase/specs/jvms/se8/html/index.html。,从零开始,一步一步用Go语言实现一个功能逐步增强的Java虚拟机。第1章将编写一个类似java后文中,首字母小写的java特指java命令行工具。的命令行工具,用它来启动我们自己的虚拟机。在开始编写代码之前,需要先准备好开发环境。

本书假定读者使用的是Windows操作系统,因此书中出现的命令和路径等都是Windows形式的。如果读者使用的是其他操作系统(如Mac OS X、Linux等),需要根据自己的情况做出相应调整。由于Go和Java都是跨平台语言,所以本书代码在常见的操作系统中都可以正常编译和运行。

1.1 准备工作

1.1.1 安装JDK

我们都知道,要想运行Java程序,只有Java虚拟机是不够的,还需要有Java类库。Java虚拟机和Java类库一起,构成了Java运行时环境。本书编写的Java虚拟机依赖于JDK类库,另外,编译本书中的Java示例代码也需要JDK。从Oracle网站http://www.oracle.com/technetwork/java/javase/downloads/index.html。上下载最新版本(写作本章时是8u66)的JDK安装文件,双击运行即可。安装完毕之后,打开命令行窗口执行java -version命令,如果看到类似图1-1所示的输出,就证明安装成功了。

图1-1 java -version命令输出

1.1.2 安装Go

从Go语言官网https://golang.org/dl/(如果Go官网无法访问,可以从http://golangtc.com/download)下载。下载最新版本(写作本章时是1.5.1)的Go安装文件,双击运行即可。安装完毕之后,打开命令行窗口执行go version命令,如果看到类似图1-2所示的输出,就证明安装成功了。

图1-2 go version命令输出

go后文中,首字母小写的go特指go命令行工具。命令是Go语言提供的命令行工具,用来管理Go源代码。go命令就像瑞士军刀,里面包含了各种小工具。用Go语言编写程序,基本上只需要go命令就可以了。go命令里的小工具是各种子命令,version是其中之一。其他常用的子命令包括help、fmt、install和test等。

go命令行工具希望所有的Go源代码被都放在一个工作空间中。所谓工作空间,实际上就是一个目录结构,这个目录结构包含三个子目录。

❑ src目录中是Go语言源代码。

❑ pkg目录中是编译好的包对象文件。

❑ bin目录中是链接好的可执行文件。

实际上只有src目录是必须要有的,go会自动创建pkg和bin目录。工作空间可以位于任何地方,本书使用D:\go\workspace作为工作空间。那么go如何知道工作空间在哪里呢?答案是通过GOPATH环境变量。在桌面上右键单击“我的电脑”图标,在弹出的菜单中单击“属性”,然后单击“高级系统设置”;在“系统属性”对话框中单击“环境变量”按钮,然后添加GOPATH变量即可,如图1-3所示。

图1-3 设置GOPATH环境变量

打开命令行窗口,执行go env命令,如果看到类似图1-4所示的输出,GOPATH环境变量就设置成功了。

图1-4 使用go env命令查看GOPATH环境变量

1.1.3 创建目录结构

Go语言以包为单位组织源代码,包可以嵌套,形成层次关系。本书编写的Go源文件全部放在jvmgo包中,其中每一章的源文件又分别放在自己的子包中。包层次和目录结构有一个简单的对应关系,比如,第1章的代码在jvmgo\ch01目录下。除第1章以外,每一章都是先复制前一章代码,然后进行修改和完善。每一章的代码都是独立的,可以单独编译为一个可执行文件。下面创建第1章的目录结构。

在D:\go\workspace\src(也就是%GOPATH%\src)目录下创建jvmgo目录,在jvmgo目录下创建ch01目录。现在,工作空间的目录结构如下:

D:\go\workspace\src
—-jvmgo
—-ch01