`

第二章(一) Java虚拟机结构-数据类型

阅读更多
    这篇文章针对虚拟机的抽象描述,并不针对一个特定的Java虚拟机实现。
    为了实现Java虚拟机,你仅仅需要能够读取class文件格式,并且执行里面的操作。哪些限制实现者创造力的具体细节并不是Java虚拟机规范的一部分。例如,运行时数据区域的内存结构,垃圾回收运用的算法,Java虚拟机指令的内部优化(例如转换成机器码)等这些实现细节都留给实现者去自由决断。
    虚拟机规范中所有的Unicode码都是采用The Unicode Standard, Version 6.0.0,可以在http://www.unicode.org/.获得。
2.1 类文件格式
    虚拟机中执行的编译后的代码是一种与硬件和操作系统无关的二进制格式,通常情况下(但不是必须)存储在文件中,即大家熟知的class文件。这种class文件格式精确的定义了类和接口的表示,比如包含用于确保平台特有的对象文件的字节顺序。
    第四章 会再次详细讨论类文件的格式
2.2 数据类型
    类似于Java编程语言,Java虚拟机也是在两种数据类型上进行操作:基本数据类型和引用数据类型。相应的存在两种数值可以被存储到变量中、作为参数传递、作为方法返回值、被操作:基本数值和引用数值。
    Java虚拟机期望所有的类型检测都在运行前被执行,通常是靠编译器,而不是靠虚拟机自己来做。基本类型不需要被标记,或者能够被检测出以用来在运行时确定其类型,也不需要和引用类型的值区分开来。相反,Java虚拟机的指令集用操作特定类型的指令来区分被操作数值的类型。例如:iadd, ladd, fadd, 和 dadd都是用来操作两个数,并算出一个数值的指令集,但是每一个都相应的专门针对它操作的类型 int,long,float,double。可以参照2.11.1查阅Java虚拟机支持的指令集的概述。
    Java虚拟机明确的包含了对对象的支持。一个对象是一个动态分配的类实例或者是一个数组。一个对象的引用被认为是Java虚拟机的引用类型。引用类型的值可以想成一个对象的指针。同一个对象可以有多个引用。对象通常利用引用类型来操作、传递、测试。
2.3 基本类型和值
    Java虚拟机包支持的数据类型有:数字类型、boolean类型(2.3.4)、returnAddress类型(2.3.3)。
    数字类型又分为整数类型(2.3.1)和浮点数类型(2.3.2)。
    整数类型有:
 

     
  • byte :8位的有符号整数,默认值是0
  •  
  • short:16位的有符号整数,默认值是0
  •  
  • int  :32位的有符号整数,默认值是0
  •  
  • char :16位的无符号整数,采用UTF-16来编码,默认值是'\u0000'
  •  
  • long :64位的有符号整数,默认值是0
  •  

    浮点数类型有:
 

     
  • float :值是浮点数集的元素,如果虚拟机支持也可以是浮点数扩展指数集,默认值是正0
  •  
  • double:值是双精度数集的元素,如果虚拟机支持也可以是双精度数扩展指数集,默认值是正0
  •  

  boolean类型的值表示true和false,默认值是false。
  returnAddress类型的值是Java虚拟机指令集的操作码的指针,在所有的基本数据类型中,只有returnAddress类型在Java编程语言中没有直接对应的类型。
2.3.1 整数类型和值
    对于Java虚拟机整数类型的值有:
 
  • byte  :范围是[-128,127]
  • short :范围是[-32768,32767]
  • int   :范围是[-2147483648,2147483647]
  • long  :范围是[-9223372036854775808,9223372036854775807]
  • char  :范围是[0,65535]

2.3.2 浮点类型和值
    浮点数类型包含float和double,概念上等价于32位的单精度数和64位的双精度数,采用IEEE 754标准格式。
    IEEE 754标准不仅包含正负有符号数,还有正0和负0,正无穷和负无穷,以及一个特殊的NaN值。NaN用来代表一个非法操作的结果,例如0除0的结果。
2.3.3 returnAddress类型和值
    returnAddress类型被Java虚拟机的jsr, ret, 和 jsr_w指令利用。它的值表示Java虚拟机指令操作码的地质。不像数值基本类型,returnAddress类型没有对应的Java语言类型。它的值也不能被运行程序修改。
2.3.4 boolean类型
    虽然Java虚拟机定义了boolean类型,但是它对boolean类型只提供了非常有限的支持。并没有专门操作boolean类型的指令。Java语言中操作boolean类型的表达式编译后利用的是Java虚拟机的int类型。
    Java虚拟机并不直接支持boolean数组,newarray 指令能够创建一个新的boolean数组,但是虚拟机对boolean数组的访问和修改用的是字节数组的指令baload和bastore。
    Java虚拟机用1表示true,0表示false来编码boolean数组的内容,如果Java编程语言的boolean类型值被编译映射成虚拟机的int类型,编译器也需要用相同的编码格式。
2.4 引用类型
    引用类型分为三类:类、数组、接口。相应的它们的值对应着动态生成的类实例、数组和实现了接口的类实例或数组。
    数组类型由一维的组件类型组成,数组类型的组件类型自己也可以是数组。如果数组的组件类型也是数组,则组件类型的组件类型最终必然不是一个数组,称之为元素类型。元素类型只能是类类型、接口类型、或基本类型。
    引用类型的值也可以是一个特殊的null,一个不指向任何对象的引用,即null引用。null引用没有运行时类型,但是可以转换成任意类型。引用类型的默认值就是null。
    虚拟机规范并不强制要求使用一个具体的值编码为null。
 
分享到:
评论

相关推荐

    MiniJavaVM—个Java虚拟机的设计和实现

    第二章系统设计 MiniJavaVM 的系统设计分为两个主要部分:虚拟机总体框架和构成要素。 虚拟机总体框架 虚拟机总体框架包括命令参数解析模块、类的装载和解析模块、内存管理模块、执行引擎模块、方法调用模块和...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...

    一个Java虚拟机的设计和实现

    #### 第二章 系统设计 ##### 2.1 唯一的虚拟机MiniJavaVM MiniJavaVM的设计旨在简化JVM的概念模型,同时保持其核心功能。它的目标是提供一个易于理解和实现的教学示例。 ##### 2.2 MiniJavaVM的构成要素 ...

    JAVA语言程序设计--第二章JAVA基础

    在“JAVA语言程序设计--第二章JAVA基础”这个主题中,我们主要探讨的是Java编程语言的基本概念和核心特性。Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。它以其“一...

    深入java虚拟机pdf英文版

    第二部分则深入探讨了Java虚拟机的内部机制,涵盖了类的生命周期、链接模型、垃圾回收、栈和局部变量操作、类型转换等内容。 ### 第一部分:Java的架构 - **第1章:Java体系结构简介** - 提供了一个概览,介绍Java...

    深入Java虚拟机

    3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 ...

    深入java虚拟机第二版

    深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 ...

    Java虚拟机规范 J2SE_7 中文版

    由于长期以来缺乏官方中文版的Java虚拟机规范,很多对Java虚拟机感兴趣的开发者因英语水平有限而难以深入了解这一领域的知识。因此,几位热心的译者决定自发组织起来,共同完成这项具有重要意义的工作。 #### 三、...

Global site tag (gtag.js) - Google Analytics