《自己動手寫java虛擬機器》學習筆記(一)-----命令列工具(go)
阿新 • • 發佈:2018-11-23
專案地址: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虛擬機器》