昨晚睡不着拿着吃灰的书《手写Java虚拟机》看了两张,以前自己学cpp和go的时候都写过一些轮子(抄),Go写的类Gin的web框架,cpp当然是WebServer(烂大街),正好我有Go语言基础,这本书也是用的Go,现在又来写JVM了,这本书实现了一个基本的Java虚拟机,按照Java虚拟机8标准,可以运行Java字节码,依赖JDK类库。
记录一下第一节很简单,实现了一个命令行工具,类似Java -jar xxx.jar差不多的东西
以前写Web框架的时候用的是cobra这个库写的命令行工具,对于复杂的命令行工具很省事,这里直接用flag
下面是第一章的demo
gopackage main
import (
"flag"
"fmt"
"os"
)
// Cmd 结构体用于存储命令行参数解析后的结果
type Cmd struct {
helpFlag bool
versionFlag bool
cpOption string
class string
args []string
}
// parserCmd 解析命令行参数并返回 Cmd 结构体
func parserCmd() *Cmd {
cmd := &Cmd{}
// 设置自定义的 Usage 函数
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, "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
}
// printUsage 打印使用说明
func printUsage() {
fmt.Printf("Usage: %s [-options] class [args...]\n", os.Args[0])
}
func main() {
// 解析命令行参数
cmd := parserCmd()
// 根据解析结果执行相应的操作
if cmd.versionFlag {
fmt.Println("version 0.0.1")
} else if cmd.helpFlag || cmd.class == "" {
printUsage()
} else {
startJVM(cmd)
}
}
// startJVM 模拟启动JVM的函数
func startJVM(cmd *Cmd) {
fmt.Printf("classpath:%s class:%s args:%v\n", cmd.cpOption, cmd.class, cmd.args)
}
第一张就这样
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!