一、引言

之前反复看了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抄代码

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]

---------------------------------你知道的越多,不知道的越多-------------------------------

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐