• 自己动手写java虚拟机(第一话)


    一、引言

    之前反复看了jvm的知识和学了go的基础知识之后,也想自己试试创造一个虚拟机,拿着《自己手写java虚拟机》(这本书我忘记在哪里下载的,需要的可自行下载)这本书就开始了自己的实践。
    实践的前提一就是对jvm的所有结构很熟悉,不是很熟悉也没关系,有个印象不记得了再回去看看也行,当然熟稔于心的话写虚拟机更容易上手;前提二就是对go语音有所了解,基本的语法能够熟练或了解。有了这两点,就可以跟着书开始动手写了。
    这里我把说的这两个前提的学习资料也说明一下,需要的自取:
    1)、尚硅谷宋红康康师傅的jvm课程,值得反复看,资源在B战上就有
    2)、李文州的博客对应的视频

    具备了这两个前提之后就可以开始动手了,两个前提的话,二是必须的,一有所了解也可以。
    手写java虚拟机会写一个系列的文章,仅作为自己学习的记录和输出,写的不对的地方,望广大码友不吝赐教!

    二、创建项目

    (go安装和配置啥的我就不赘述了,相信小伙伴已经具备了)
    在go的工作目录下创建jvmgo的目录,jvmgo下创建bin,pgk和src目录,src下创建ch01
    目录结构如下

    /Users/fanhuifang/Study/goWorkspace
    |- jvmgo
          - bin
          - pkg
          - src
              - ch01
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如下图:
    在这里插入图片描述

    三、vscode抄代码

    vscode打开src目录,在src下创建cmd.go文件
    文件中的内容如下:

    package main
    
    import (
    	"flag"
    	"fmt"
    	"os"
    )
    
    type Cmd struct {
    	helpFlag    bool
    	versionFlag bool
    	cpOption    string
    	class       string
    	args        []string
    }
    
    // 解析命令
    func parseCmd() *Cmd {
    	cmd := &Cmd{}
    	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, "classspath", "", "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])
    }
    
    // 函数入口
    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)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    这里使用了Go语音标准库flag:flag 的使用
    (注:代码就先以此等方式贴在这里,等写的差不多再传到github上)

    四、执行命令

     fanhuifang  ~/Study/goWorkspace/jvmgo/src/ch01  go build
     fanhuifang  ~/Study/goWorkspace/jvmgo/src/ch01  ./ch01  
    Usage:./ch01 [-options] class [args...]
     fanhuifang  ~/Study/goWorkspace/jvmgo/src/ch01  ./ch01 -version
    version 0.0.1
     fanhuifang  ~/Study/goWorkspace/jvmgo/src/ch01  ./ch01 -cp /jvmgo/src MyApp name age                    
    classpath:/jvmgo/src class:MyApp args:[name age]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ---------------------------------你知道的越多,不知道的越多-------------------------------

  • 相关阅读:
    注册的业务、登录业务、个人中心、nginx配置【VUE项目】
    4 个你可能不知道的 Python 迭代工具过滤器函数
    【LeetCode-中等】240. 搜索二维矩阵 II(详解)
    二叉搜索树的基础操作
    mysql报错:Duplicate entry ‘...‘ for key ‘field‘
    简单DIV+CSS学生网页设计——电影请以你的名字呼唤我(4页)带音乐特效
    用Python自动生成 图文并茂的数据分析 报告
    Spring事务
    「Python条件结构」实现超市付款功能
    如何在 macOS 中删除 Time Machine 本地快照
  • 原文地址:https://blog.csdn.net/fhf2424045058/article/details/125880123