《自己动手写java虚拟机》学习笔记(一)-----命令行工具(go)

     项目地址: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虚拟机》

猜你喜欢

转载自blog.csdn.net/qq_33543634/article/details/82968896
今日推荐