java虚拟机规范(se8)——java虚拟机结构(一)
第二章 虚拟机结构
2.1 class文件格式
编译后能够被java虚拟机执行的代码使用了一个独立于硬件和操作系统的二进制格式,通常(不是必须的)存在一个文件中,就是通常所说的class文件格式。
2.2 数据类型
类似于java编程语言,java虚拟机操作两种数据类型:基本类型和引用类型(primitive types and reference types)。相应的,有两种类型的数据可以用于变量赋值、参数传递和方法返回:基本值和引用值(primitive values and reference values)。
2.3 基本数据类型和值
java虚拟机支持的基本类型由数字类型,布尔类型以及returnAddress类型。
数字类型包括整数类型和浮点数类型。
具体的整数类型如下:
- byte,其值为8位有符号二进制补码整数,其默认值为零
- short,其值为16位有符号二进制补码整数,其默认值为零
- int,其值为32位有符号二进制补码整数,其默认值为零
- long,其值为64位有符号二进制补码整数,其默认值为零
- char,其值为16位无符号整数,表示基本多文本平面(Basic Multilingual Plane)中的Unicode代码点,使用UTF-16编码,其默认值为空代码点('\ u0000')
浮点型数字类型如下:
- fload,值为单精度浮点数集中的元素,或者(如果虚拟机支持的话)是单精度扩展指数(Float-Extended-Exponent)集合中的元素。默认值为正数零。
- double,取值范围是双精度浮点数集合中的元素,或者(如果虚拟机支持的话)是双精度扩展指数(Double-Extended-Exponent)集合中的元素。默认值为正数零。
布尔类型的值取值范围是true和false,默认值是false(Java®虚拟机规范的第一版没有将布尔值视为Java虚拟机类型。但是,布尔值在Java虚拟机中的支持有限。Java®虚拟机规范的第二版通过将布尔值视为一种类型来澄清该问题。)
returnAddress类型的值是指向Java虚拟机指令的操作码(opcodes)的指针。在基本类型中,除了returnAddress类型,其它类型都与Java编程语言类型直接相关联。
2.3.1 整数类型和值
java虚拟机中的整型的取值范围如下:
byte, (-27 to 27 - 1),
short, (-215 to 215 - 1),
int, (-231 to 231 - 1)
long,(-263 to 263 - 1)
char,(0 ~ 2^16-1)
2.3.2 浮点类型和值
浮点类型就是指 float 类型和 double 类型。
每一个java虚拟机实现都必须支持两种标准的浮点数集:单精度浮点数集合和双精度浮点数集合。
除了 NaN 以外,浮点数集合中的所有元素都是有序的。如果把它们从小到大按顺序排列好,那顺序将会是:负无穷,可数负数、正负零、可数正数、正无穷。
2.3.3 returnAddress 类型和值
returnAddress类型被java虚拟机使用在jsr,ret和jsr_w指令中。returnAddress的值是java虚拟机指令操作码的指针。和基本的数字类型不同,returnAddress在java编程语言中没有对应的类型,同时在运行的程序中无法被修改。
2.3.4 布尔类型
尽管java虚拟机定义了boolean类型,但是仅仅提供了非常有限的支持。java虚拟机没有单独专门的指令来操作布尔值。相反,java编程语言中的表达式涉及到boolean类型的值会被编译为java虚拟机中的int类型。
java虚拟机直接支持布尔数组。java虚拟机中的newarray指令允许创建boolean类型的数组。boolean类型数组的元素通过byte数组指令baload和bastore来访问和修改。
java虚拟机将boolean数组元素编码成1和0分别表示true和false。java编程语言中boolean值会被编译器映射为java虚拟机中类型int,编译器必须使用相同的编码方式。
2.4 引用类型和值
总共又三种类型的引用类型(reference):类类型(class types),数组类型(array types)以及接口类型(interface types),它们的值分别表示动态创建的类实例,数组和类实例或者数组实现的接口。