美文网首页
8、解释器

8、解释器

作者: 陈桐Caliburn | 来源:发表于2020-05-03 09:58 被阅读0次

gojvm目录
1、搭建go环境
2、cmd命令行参数解析
3、搜索class文件
4、添加testOption 便于单元测试
5、解析classfile文件
6、运行时数据区
7、指令集
8、解释器
9、创建Class
10、类加载器
11、对象实例化new object
12、方法调用和返回
13 类初始化
14、jvm支持数组
15、jvm支持字符串-数组扩展
16、本地方法调用
17、ClassLoader原理
18、异常处理
19、 启动jvm

执行指令集的调用者

指令集包含两部分 读取指令和执行

type Instruction interface {
    FetchOperands(reader *ByteCodeReader) // 从字节码流中取出操作数 输入变量
    Execute(frame *rtda.Frame)            // 执行指令逻辑
}

解释器是将指令以逻辑方式运行

//解释器 外部不能访问 私有方法
func interpret(methodInfo *classfile.MemberInfo){

    //获得method类 code属性
    codeAttr := methodInfo.CodeAttribute()
    maxLocals := codeAttr.MaxLocals()
    maxStack := codeAttr.MaxStack()
    bytecode := codeAttr.Code()

    thread := rtda.NewTread()
    frame  := thread.NewTestFrame(maxLocals,maxStack)

    thread.PushFrame(frame)

    defer catchErr(frame)
    loop(thread, bytecode)
}

//异常处理 因没有实现return指令 catch异常
func catchErr(frame *rtda.Frame){
    if r:=recover();r!=nil{
        fmt.Printf("LocalVars:%v\n",frame.LocalVars())
        fmt.Printf("OperandStack:%v\n",frame.OperandStack())
        fmt.Printf("no return fun \n")
        //panic(r)
    }
}

//loop执行循环所有方法
func loop(thread *rtda.Thread, bytecode []byte){

    frame:=thread.PopFrame()
    reader:= &base.ByteCodeReader{}

    for{
        //寻找下一个函数 计算pc
        pc:= frame.NextPC()
        thread.SetPC(pc)

        //设置初始值   解码指令
        reader.Reset(bytecode,pc)
        //读取指令集
        opcode:=reader.ReadUint8()
        //指令集转义
        inst:=instructions.NewInstruction(opcode)
        //读取变量
        inst.FetchOperands(reader)
        //获得下一个指令集便宜
        frame.SetNextPC(reader.PC())

        //excute   执行
        fmt.Printf("pc:%2d inst:%T %v\n", pc, inst, inst)
        inst.Execute(frame)
    }

}

调用解释器

//测试解释器和指令集
func parseInterpret(cmd *Cmd) {
    cp := classpath.Parse(cmd.XjreOption, cmd.cpOption)
    className := strings.Replace(cmd.class, ".", "/", -1)
    //获得classfile
    cf := loadClass(className, cp)
    //获得main函数
    mainMethod:=getMainMethod(cf)
    if mainMethod != nil {
        //解释器执行
        interpret(mainMethod)
    }else{
        fmt.Printf("Main method not found in class %s\n", cmd.class)
    }
}

//获得main函数
func getMainMethod(cf *classfile.ClassFile) *classfile.MemberInfo {

    for _, m := range cf.Methods() {
        if m.Name() == "main" && m.Descriptor() == "([Ljava/lang/String;)V" {
            return m
        }
    }

    return nil
}

shell脚本

go run main -test "interpret" -cp test/lib/example.jar jvmgo.book.ch05.GaussTest

实战项目地址

https://github.com/yinlingchaoliu/jvmgo.git

相关文章

  • 8、解释器

    gojvm目录1、搭建go环境2、cmd命令行参数解析3、搜索class文件4、添加testOption 便于单元...

  • Python基本知识

    一,解释器默认编码的区别   Python2解释器默认编码:ASCII  Python3解释器默认编码:UTF8 ...

  • 学习js第一天

    1.JS特点: 解释性脚本语言 运行在浏览器(浏览器内核带有js解释器,Chrome v8引擎) 弱类型语言(松散...

  • 02-Python解释器

    目标 解释器的作用 下载Python解释器 安装Python解释器 一. 解释器的作用 Python解释器作用:运...

  • Java Hotspot虚拟机的模板解释器

    众所周知,Java字节码是解释执行的,本文简要分析解释执行的原理。 解释器 Java 8的Hotspot虚拟机有两...

  • Python面试

    1、编译型需要编译器;执行快调试慢;不可跨平台;代码扩展性差;依赖解释器 全部加载至解释器 一行行读取;2、8位b...

  • Python

    一、认识 Python 1.解释器是把其他语言解释成计算机语言 解释器分为解释器和编译器。解释器是解释性语言:源代...

  • 下载解释器 配置解释器

    Python解释器下载的官方地址:https://www.python.org/ https://www.pyth...

  • 解释器

    Interpreter (解释器)属于行为型模式 意图: 给定一个语言,定义它的文法的一种表示,并定义一个解释器,...

  • 解释器

    IFramework所有模块总目录 简介 就是对“解释” 进行了一层封装。 实际的“解释” 代码还是需要自己写! ...

网友评论

      本文标题:8、解释器

      本文链接:https://www.haomeiwen.com/subject/wjhjwhtx.html