bboyjing's blog


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 公益404
bboyjing's blog

自己动手写JVM十七【指令集和解释器(五)】

发表于 2017-02-07 | 分类于 JVM

解释器

指令集已经实现得差不多了,本节将编写一个简单的解释器。这个解释器目前只能执行一个Java方法,后面的章节中会不断完善。解释器实现代码位于/instructions/interpreter.go文件中。

要实现解释器,还有些额外的代码需要完善:

阅读全文 »
bboyjing's blog

自己动手写JVM十六【指令集和解释器(四)】

发表于 2017-02-06 | 分类于 JVM

本章节继续学习指令集和解释器。

控制指令

控制指令共有11条,本节实现其中的3条指令:goto、tableswitch和lookupswitch。该系列指令代码位于/instructions/control包下。

goto指令

goto指令实现代码位于goto.go文件中:

1
2
3
4
5
6
7
// goto指令结构体
type GOTO struct{ base.BranchInstruction }
func (self *GOTO) Execute(frame *rtdata.Frame) {
// 无条件跳转
base.Branch(frame, self.Offset)
}

阅读全文 »
bboyjing's blog

自己动手写JVM十五【指令集和解释器(三)】

发表于 2017-02-06 | 分类于 JVM

本章节继续学习指令集和解释器。

类型转换指令

类型转换指令大致对应Java语言中的基本类型强制转换操作。按照被转换变量的类型,类型转换指令可以分为4种:i2x系列指令把int变量强制转换成其他类型;l2x系列指令把long变量强制转换成其他类型;f2x系列指令把float变量强制转换成其他类型;d2x系列指令把double变量强制转换成其他类型。该指令实现代码位于/instructions/conversions包下,下面以d2x系类指令为例来学习下,其代码位于d2x.go文件中:

阅读全文 »
bboyjing's blog

自己动手写JVM十四【指令集和解释器(二)】

发表于 2017-01-31 | 分类于 JVM

本章节继续学习指令集和解释器。

存储指令

和加载指令刚好相反,存储指令把变量从操作数栈顶弹出,然后存入局部变量表。和加载指令一样,存储指令也可以分为6类。存储指令相关代码位于/instructions/stores包下。下面以lstore系列指令为例来学习下,其实现代码位于lstore.go文件中:

阅读全文 »
bboyjing's blog

自己动手写JVM十三【指令集和解释器(一)】

发表于 2017-01-24 | 分类于 JVM

本章节将在前面讲的基础上编写一个简单的解释器,并且实现一些具有代表性的指令,本章涉及到的go代码位于instructions包下。

字节码和指令集

Java虚拟机顾名思义,就是一台虚拟的机器,而字节码就是运行在这台虚拟机器上的机器码。字节码中存放编码后的Java虚拟机指令,每条指令都以一个单字节的操作码开头,这就是字节码名称的由来。看到这里才知道,之前的理解有些误区,只有Java方法(非抽象方法和本地方法)的代码才会编译成字节码,所以不能说整个class文件就是字节码,它只是包含字节码。由于只使用一个字节表示操作码,显而易见,Java虚拟机最多只能支持256条指令。到第八版为止,Java虚拟机规范已经定义了205条指令,操作码分别是0x00到0xCA、OxFE和0xFF。这205条指令构成了Java虚拟机的指令集。和汇编语言雷系,为了便于记忆,Java虚拟机规范给每个操作码都指定了一个助记符。比如操作码是0x00这条指令,因为它什么都不做,所以它的助记符是nop(no operation)。

阅读全文 »
1…171819…30
bboyjing

bboyjing

147 日志
17 分类
20 标签
友情链接
  • bailaohe
© 2021 bboyjing
由 Hexo 强力驱动
主题 - NexT.Mist