之前反复看了jvm的知识和学了go的基础知识之后,也想自己试试创造一个虚拟机,拿着《自己手写java虚拟机》(这本书我忘记在哪里下载的,需要的可自行下载)这本书就开始了自己的实践。
实践的前提一就是对jvm的所有结构很熟悉,不是很熟悉也没关系,有个印象不记得了再回去看看也行,当然熟稔于心的话写虚拟机更容易上手;前提二就是对go语音有所了解,基本的语法能够熟练或了解。有了这两点,就可以跟着书开始动手写了。
这里我把说的这两个前提的学习资料也说明一下,需要的自取:
1)、尚硅谷宋红康康师傅的jvm课程,值得反复看,资源在B战上就有
2)、李文州的博客,对应的视频
具备了这两个前提之后就可以开始动手了,两个前提的话,二是必须的,一有所了解也可以。
手写java虚拟机会写一个系列的文章,仅作为自己学习的记录和输出,写的不对的地方,望广大码友不吝赐教!
(go安装和配置啥的我就不赘述了,相信小伙伴已经具备了)
在go的工作目录下创建jvmgo的目录,jvmgo下创建bin,pgk和src目录,src下创建ch01
目录结构如下
/Users/fanhuifang/Study/goWorkspace
|- jvmgo
- bin
- pkg
- src
- ch01
如下图:
vscode打开src目录,在src下创建cmd.go文件
文件中的内容如下:
package main
import (
"flag"
"fmt"
"os"
)
type Cmd struct {
helpFlag bool
versionFlag bool
cpOption string
class string
args []string
}
// 解析命令
func parseCmd() *Cmd {
cmd := &Cmd{}
flag.Usage = printUsage
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, "classspath", "", "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])
}
// 函数入口
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)
}
这里使用了Go语音标准库flag:flag 的使用
(注:代码就先以此等方式贴在这里,等写的差不多再传到github上)
fanhuifang ~/Study/goWorkspace/jvmgo/src/ch01 go build
fanhuifang ~/Study/goWorkspace/jvmgo/src/ch01 ./ch01
Usage:./ch01 [-options] class [args...]
fanhuifang ~/Study/goWorkspace/jvmgo/src/ch01 ./ch01 -version
version 0.0.1
fanhuifang ~/Study/goWorkspace/jvmgo/src/ch01 ./ch01 -cp /jvmgo/src MyApp name age
classpath:/jvmgo/src class:MyApp args:[name age]
---------------------------------你知道的越多,不知道的越多-------------------------------