项目地址:https://github.com/gongxianshengjiadexiaohuihui
在今年三月份的时候,看过这本书,但是可能知识储备不足,许多东西都一知半解,导致看到一半就看不下去了,现在觉得自己进步挺大的,决定重新拾起这本书,并且把学习过程记录下来。
这本书需要用到的工具,go语言开发环境,可以去官网下载,下载完需要配置环境变量,也就是工作空间,我们放代码的地方,编写代码的工具,我用的是书中推荐的sublime Text3,网上也可以下到,是免费的
第一章主要讲的是命令行解析工具,如果我们用过控制台去编译代码的会知道,我们可以通过在控制台输入指令就可以编译代码,生成class文件后,可以继续通过命令去运行它。
所以,我们第一步是去解析这些命令
首先是一个命令行的结构体
书上几乎没有注释,我根据自己的理解和查找资料添加的注释
package main
import "flag"
import "fmt"
import "os"
type Cmd struct{
helpFlag bool
versionFlag bool
cpOption string
class string
args []string
}
func parseCmd() *Cmd{
//声明一个结构体指针
cmd:=&Cmd{}
//我认为是用户指南的存在
flag.Usage=printUsage
//用指定的名称、默认值、使用信息注册一个bool类型flag,并将flag的值保存到&cmd.helpFlag指向的地址里
flag.BoolVar(&cmd.helpFlag,"help",false,"print help message")
flag.BoolVar(&cmd.helpFlag,"?",false,"print help message")
flag.BoolVar(&cmd.versionFlag,"version",false,"print version and exit")
flag.StringVar(&cmd.cpOption,"classpath","","classpath")
flag.StringVar(&cmd.cpOption,"cp","","classpath")
//解析命令到相应的已注册的变量上
flag.Parse()
args:=flag.Args()
if len(args)>0{
cmd.class=args[0]
cmd.args=args[1:]
}
//返回解析结果的指针
return cmd
}
func printUsage() {
fmt.Printf("Usage: %s [-options] class [args...]\n",os.Args[0])
}
用来解析命令行的函数已经写好,接着是主函数
package main
import "fmt"
func main(){
//调用解析命令行的行数,接受解析结果
cmd:=parseCmd()
if cmd.versionFlag{
fmt.Println("version 0.0.1")
}else if cmd.helpFlag||cmd.class==""{
printUsage()
}else{
startJVM(cmd)
}
}
func startJVM(cmd *Cmd){
fmt.Printf("classpath:%s class:%s args:%v\n",cmd.cpOption,cmd.class,cmd.args)
}
到这里就成功了
我们编译,运行一下
参考资料:《自己动手写java虚拟机》