自己动手写java虚拟机(第一话)

一、引言

之前反复看了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]

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值