1. 程式人生 > >《自己動手寫java虛擬機器》學習筆記(一)-----命令列工具(go)

《自己動手寫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虛擬機器》