栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自己动手写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

如下图:

三、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:%vn", cmd.cpOption, cmd.class, cmd.args)
}

这里使用了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]

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020197.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号