编辑
2024-07-29
后端
00
请注意,本文编写于 285 天前,最后修改于 285 天前,其中某些信息可能已经过时。

昨晚睡不着拿着吃灰的书《手写Java虚拟机》看了两张,以前自己学cpp和go的时候都写过一些轮子(抄),Go写的类Gin的web框架,cpp当然是WebServer(烂大街),正好我有Go语言基础,这本书也是用的Go,现在又来写JVM了,这本书实现了一个基本的Java虚拟机,按照Java虚拟机8标准,可以运行Java字节码,依赖JDK类库。

记录一下第一节很简单,实现了一个命令行工具,类似Java -jar xxx.jar差不多的东西

以前写Web框架的时候用的是cobra这个库写的命令行工具,对于复杂的命令行工具很省事,这里直接用flag

下面是第一章的demo

go
package 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) }

image.png

第一张就这样

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!