英语原文共 620 页,剩余内容已隐藏,支付完成后下载完整资料
附录X 译文
java虚拟机的结构
这个文档指定了一个抽象的机器。它没有描述任何特定的Java虚拟机的实现。
要正确实现Java虚拟机,您仅需要能够读取类文件格式并正确执行其中指定的操作。 不是Java虚拟机规范的一部分的实现细节将不必要地限制实现者的创造力。 例如,运行时数据区的内存布局,使用的垃圾收集算法以及Java虚拟机指令的任何内部优化(例如,将它们转换为机器代码)都由实现者自行决定。 本规范中对Unicode的所有引用均针对可从https://www.unicode.org/获得的Unicode标准版本12.1.0。
类文件格式
Java虚拟机要执行的已编译代码使用独立于硬件和操作系统的二进制格式表示,通常(但不一定)存储在称为类文件格式的文件中。 类文件格式精确地定义了类或接口的表示形式,包括诸如字节顺序之类的细节,这些细节可能在特定于平台的对象文件格式中被视为理所当然。 第4章“类文件格式”详细介绍了类文件格式。
数据类型
像Java编程语言一样,Java虚拟机可对两种类型进行操作:原始类型和引用类型。相应地,可以将两种类型的值存储在变量中,作为参数传递,由方法返回并对其进行操作:原始值和参考值。
Java虚拟机希望几乎所有类型检查都在运行时之前完成,通常由编译器完成,而不必由Java虚拟机本身完成。基本类型的值不需要标记或需要检查以在运行时确定其类型,也不必与引用类型的值区分开。相反,Java虚拟机的指令集使用旨在对特定类型的值进行操作的指令来区分其操作数类型。例如,iadd,ladd,fadd和dadd都是Java虚拟机指令,它们添加两个数值并产生数值结果,但是每个指令都专门针对其操作数类型:int,long,float和double。有关Java虚拟机指令集中的类型支持的摘要,请参见第2.11.1节。
Java虚拟机包含对对象的显式支持。对象可以是动态分配的类实例,也可以是数组。对对象的引用被认为具有Java虚拟机类型引用。类型引用的值可以认为是指向对象的指针。可能存在对一个对象的多个引用。对象始终通过类型引用的值进行操作,传递和测试。
原始类型和值
Java虚拟机支持的原始数据类型是数字
类型,布尔类型(第2.3.4节)和returnAddress类型(第2.3.3节)。
数值类型由整数类型(第2.3.1节)和浮点类型(第2.3.2节)组成。
整数类型为:
bull;字节,其值为8位带符号的二进制补码整数,并且其
默认值为零
bull;short,其值为16位带符号的二进制补码整数,且其值
默认值为零
bull;int,其值为32位带符号的二进制补码整数,并且其值
默认值为零
bull;long,其值为64位带符号的二进制补码整数,并且其
默认值为零
bull;char,其值为代表Unicode代码的16位无符号整数
基本多语言平面中的点,使用UTF-16编码,其默认
值是空代码点( u0000)
浮点类型为:
bull;float,其值是float值集的元素,或者在支持的情况下,
float-extended-exponent值集,其默认值为正零
bull;double,其值是double值集的元素,或者在支持的情况下,
双扩展指数值集,其默认值为正零
布尔类型的值对真值true和false进行编码,而
默认值为false。
Javareg;虚拟机规范的第一版未将布尔值视为Java虚拟机类型。但是,布尔值在Java虚拟机中的支持确实有限。 《Javareg;虚拟机规范》第二版通过将布尔值视为类型来澄清了该问题。
returnAddress类型的值是指向Java Virtual操作码的指针。
机器说明。在原始类型中,只有returnAddress类型不是
直接与Java编程语言类型相关联。
浮点类型,值集合和值
浮点类型为float和double,它们在概念上相关联
具有32位单精度和64位双精度格式的IEEE 754值和运算,如IEEE二进制浮点算术标准(ANSI / IEEE标准754-1985,纽约)中所指定。
IEEE 754标准不仅包括正负号幅度
数字,也包括正零和负零,正负无穷大,以及
一个特殊的非数字值(以下简称为“ NaN”)。 NaN值
用于表示某些无效操作(例如除零)的结果
被零。
Java虚拟机的每个实现都需要支持两个
标准的浮点值集,称为浮点值集和双精度值
组。另外,可以选择Java虚拟机的实现,
支持两个扩展指数浮点值集之一或全部,称为
浮点扩展指数值集和双扩展指数值集。
在某些情况下,可以使用这些扩展指数值集
而不是标准值集来表示float或double类型的值。
任何浮点值集的有限非零值都可以表示为
形式ssdot;msdot;2(e-N 1),其中s为 1或-1,m为小于的正整数
2N,并且e是Emin =-(2k-1-2)和Emax = 2k-1-1(含)之间的整数,其中N和K是取决于值集的参数。某些值可以通过多种方式以这种形式表示。例如,假设某个值集中的值v可以使用s,m和e的某些值以这种形式表示,那么如果碰巧m为偶数且e小于2k-1,则可以将m减半如果mge;2n-1,则将此形式的表示称为归一化;将e增大1以产生具有相同值v的第二个表示。否则,表示被归一化。如果值集中的值不能为
以mge;2n-1表示,则该值被称为非规范化
值,因为它没有规范化的表示形式。
对参数N和K(以及对导出参数Emin的约束)
和Emax)是两个必需的浮点值集和两个可选的浮点值集
总结在表2.3.2-A中。
其中一个或两个扩展指数值集受一个
实现,然后对于每个受支持的扩展指数值集,都有一个特定的实现相关常数K,其值受表2.3.2-A约束;该值K又决定了Emin和Emax的值。
四个值集的每一个不仅包括有限的非零值,它们是
归因于上面,还有五个值正零,负零,正
无限,负无限和NaN。
请注意,表2.3.2-A中的约束经过设计,使得浮点值集的每个元素也必定也是浮点扩展指数值的元素
集,双精度值集和双扩展指数值集。同样,double值集的每个元素也必定是double的元素
扩展指数值集。每个扩展指数值集都有较大的范围
指数值超过相应的标准值集,但不具有
更精确。
浮点值集的元素恰好是可以表示的值
除了只有一个NaN值(IEEE 754指定224-2个不同的NaN值)外,使用IEEE 754标准中定义的单浮点格式。
double值集的元素恰好是可以表示的值
使用IEEE 754标准中定义的双浮点格式,除了
仅存在一个NaN值(IEEE 754指定253-2个不同的NaN值)。
但是请注意,float-expended-exponent和double的元素
此处定义的扩展指数值集不对应于
可以使用IEEE 754单扩展和双扩展格式表示,
分别。本规范不要求对
浮点值集的值,除非浮点值必须为
以类文件格式表示(第4.4.4节,第4.4.5节)。
float,float扩展指数,double和double扩展指数值
集不是类型。对于Java Virtual的实现总是正确的
机器使用float值集的元素来表示float类型的值;
但是,在某些情况下,使用实现可能是允许的
而不是float-extended-exponent值集中的一个元素。同样,它总是
纠正实现使用double值集的元素表示的实现
double类型的值;但是,在某些情况下可能允许
使用double-extended-exponent值集的元素的实现
代替。
除NaN之外,浮点值集的值是有序的。从最小到最大排列时,它们是负无穷大,负有限值,正负零,正有限值和正无穷大。
浮点正零和浮点负零比较相等,但是还有其他操作可以区分它们。例如,将1.0除以
0.0产生正无穷大,但将1.0除以-0.0则产生负无穷大。
NaN是无序的,因此数值比较和数值相等性检验
如果它们的一个或两个操作数均为NaN,则其值为false。特别是
如果且仅当值与自身的数值相等性测试时,值为false
如果值为NaN。如果存在以下任何一种数值不等式的检验,则结果为true
操作数为NaN。
returnAddress类型和值
Java虚拟机的jsr,ret和jsr_w使用returnAddress类型
指令(sect;jsr,sect;ret,sect;jsr_w)。 returnAddress类型的值是指针
Java虚拟机指令的操作码。 不像数字原语
类型,returnAddress类型与任何Java编程语言类型都不对应,并且不能由正在运行的程序进行修改。
布尔类型
尽管Java虚拟机定义了布尔类型,但它仅提供对它的支持非常有限。没有仅Java虚拟机指令专门用于布尔值的运算。相反,Java中的表达式对布尔值进行操作的编程语言被编译为使用值Java虚拟机int数据类型的名称。
Java虚拟机确实直接支持布尔数组。它的新数组指令(sect;newarray)可以创建布尔数组。类型数组使用字节数组指令baload和boolean访问和修改booleanbastore(sect;baload,sect;bastore)。
在Oracle的Java虚拟机实现中,Java中的布尔数组编程语言被编码为Java虚拟机字节数组,每个布尔元素使用8位。
Java虚拟机使用1表示true和0表示false来对布尔数组组件进行编码。在Java编程语言布尔值由编译器映射到Java虚拟机类型int的值的情况下,编译器必须使用相同的编码。
引用类型和值
引用类型共有三种:类类型,数组类型和接口类型。它们的值分别引用动态创建的类实例,数组或实现接口的类实例或数组。
数组类型由具有单个维的组件类型组成(其长度未由类型指定)。数组类型的组件类型本身可以是数组类型。如果从任何数组类型开始,都考虑其组件类型,然后(如果那也是数组类型)该类型的组件类型,依此类推,最终必须达到一种非数组类型的组件类型;这称为元素数组类型的类型。数组类型的元素类型必须是基本类型,类类型或接口类型。
引用值也可以是特殊的空引用,即无对象的引用,在此将以null表示。空引用最初没有运行时类型,但可以强制转换为任何类型。引用类型的默认值为null。本规范不要求编码为null的具体值。
运行时数据区
Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。 其中一些数据区域是在Java Virtual上创建的
机器启动并且仅在Java虚拟机退出时被破坏。 其他数据区域是每个线程的。 当一个线程被创建时,创建每个线程的数据区域在线程退出时创建并销毁。
程序计数器
ava虚拟机可以一次支持多个执行线程(JLSsect;17)。 每个Java虚拟机线程都有其自己的pc(程序计数器)寄存器。在任何时候,每个Java虚拟机线程都在执行单个代码
方法,即该线程的当前方法(第2.6节)。 如果不是这种方法本机,pc寄存器包含Java虚拟机指令的地址当前正在执行。 如果线程当前正在执行的方法是在本地,Java虚拟机的pc寄存器的值未定义。 Java虚拟机的pc寄存器足够宽,可以容纳returnAddress或本机特定平台上的指针。
Java虚拟机栈
每个Java虚拟机线程都有一个私有Java虚拟机堆栈,与该线程同时创建。 Java虚拟机堆栈存储栈帧(第2.6节)。 Java虚拟机堆栈类似于常规语言(例如C)的堆栈:它保存局部变量和部分结果,并在方法调用和返回中起作用。因为除了推送和弹出帧外,从不直接操纵Java虚拟机堆栈,所以可以为堆分配帧。 Java虚拟机堆栈的内存不必是连续的。
在Javareg;虚拟机规范的第一版中,Java虚拟机堆栈称为Java堆栈。
该规范允许Java虚拟机堆栈具有固定大小或根据计算要求动态扩展和收缩。如果是Java虚拟机堆栈的大小固定,即每个Java虚拟机的大小创建该堆栈时,可以独立选择堆栈。
Java虚拟机实现可以为程序员或用户提供对Java虚拟机堆栈初始大小的控制,并且在动态扩展或收缩Java虚拟机堆栈的情况下,可以控制最大和最小大小。以下异常条件与Java虚拟机相关联堆栈:
bull;如果线程中的计算所需的Java虚拟机堆栈大于
如果允许,则Java虚拟机将引发StackOverflowError。
bull;如果Java虚拟机堆栈可以动态扩展,并且扩展是
尝试但没有足够的内存可用于扩展,
或者如果没有足够的内存来为新线程创建初始Java虚拟机堆栈,则Java虚拟机将抛出OutOfMemoryError
堆
Java虚拟机具有一个在所有Java虚拟机线程之间共享的堆。堆是运行时数据区,所有
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[606741],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、开题报告、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。
您可能感兴趣的文章
- 饮用水微生物群:一个全面的时空研究,以监测巴黎供水系统的水质外文翻译资料
- 步进电机控制和摩擦模型对复杂机械系统精确定位的影响外文翻译资料
- 具有温湿度控制的开式阴极PEM燃料电池性能的提升外文翻译资料
- 警报定时系统对驾驶员行为的影响:调查驾驶员信任的差异以及根据警报定时对警报的响应外文翻译资料
- 门禁系统的零知识认证解决方案外文翻译资料
- 车辆废气及室外环境中悬浮微粒中有机磷的含量—-个案研究外文翻译资料
- ZigBee协议对城市风力涡轮机的无线监控: 支持应用软件和传感器模块外文翻译资料
- ZigBee系统在医疗保健中提供位置信息和传感器数据传输的方案外文翻译资料
- 基于PLC的模糊控制器在污水处理系统中的应用外文翻译资料
- 光伏并联最大功率点跟踪系统独立应用程序外文翻译资料