Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jvm 为什么常量长信息和常量双信息仍然是2个实体?_Jvm_Bytecode_.class File - Fatal编程技术网

Jvm 为什么常量长信息和常量双信息仍然是2个实体?

Jvm 为什么常量长信息和常量双信息仍然是2个实体?,jvm,bytecode,.class-file,Jvm,Bytecode,.class File,当JVM最初起草时,设计人员让常量池中的CONSTANT\u Long\u info和CONSTANT\u Double\u info结构占据2个条目(假定是因为这样可以通过4字节对齐或沿着这些行的某种方式对常量池进行索引) 然而,根据调查报告 如果更改它需要对大量代码进行更改,这是有意义的,因为JVM应该能够运行为旧JVM构建的代码,但在我看来,它只需要对条件进行很少的更改就可以确定您是否在处理早期版本中的类-唯一相关的时间是您是否在初始化常量池,或者您是否在对其进行迭代,这并不经常发生,而且

当JVM最初起草时,设计人员让常量池中的
CONSTANT\u Long\u info
CONSTANT\u Double\u info
结构占据2个条目(假定是因为这样可以通过4字节对齐或沿着这些行的某种方式对常量池进行索引)

然而,根据调查报告

如果更改它需要对大量代码进行更改,这是有意义的,因为JVM应该能够运行为旧JVM构建的代码,但在我看来,它只需要对条件进行很少的更改就可以确定您是否在处理早期版本中的类-唯一相关的时间是您是否在初始化常量池,或者您是否在对其进行迭代,这并不经常发生,而且无论如何都充满了条件


此外,过去还引入了更大的突破性变化,如Java9模块。那么,为什么今天仍然是这样?是否有体系结构方面的原因,或者说到目前为止不值得任何人花费时间?

与从Java 1.1到Java 11的大多数更改一样,模块的引入在字节码格式方面没有太大变化。当涉及到应用程序逻辑或反射时,它可能是激进的,因为它不适用于字节码处理工具,而字节码处理工具只需要轻微的扩展

更改
CONSTANT\u Long\u info
CONSTANT\u Double\u info
的逻辑只有在考虑更大的问题时才有意义,例如,还要更改
Long
Double
接受两个局部变量和两个操作数堆栈项的事实。然后,你将不得不触摸很多安静的地方

但不管变化有多小或多大,重要的问题是,你从中得到了什么?更好的感觉并不重要。更改它的主要原因是简化规则,从而简化字节码处理工具。但是,由于这些工具需要条件来支持仍然存在的对旧类文件的处理,因此这一优势不会实现。事实上,随着这种变化,这些工具将变得更加复杂

当您开发一种需要新工具的全新格式时,情况会有所不同,例如,它本来是JMOD格式的一个选项,但开发新工具链的需要恰恰是它没有发生的原因,而当前的JMOD只是一个zip文件,就像旧的jar文件一样


反例是,在开发时没有向后兼容性约束,因此不会将
long
double
条目计算两次。处理工具的职责是将这些堆栈映射项转换为堆栈帧项,堆栈帧项使用两个值来表示
long
double
值(除非我们讨论的是一个反过来进行转换的环境)。

与从Java 1.1到Java 11的大多数更改一样,在字节码格式方面,模块的引入并没有太大变化。当涉及到应用程序逻辑或反射时,它可能是激进的,因为它不适用于字节码处理工具,而字节码处理工具只需要轻微的扩展

更改
CONSTANT\u Long\u info
CONSTANT\u Double\u info
的逻辑只有在考虑更大的问题时才有意义,例如,还要更改
Long
Double
接受两个局部变量和两个操作数堆栈项的事实。然后,你将不得不触摸很多安静的地方

但不管变化有多小或多大,重要的问题是,你从中得到了什么?更好的感觉并不重要。更改它的主要原因是简化规则,从而简化字节码处理工具。但是,由于这些工具需要条件来支持仍然存在的对旧类文件的处理,因此这一优势不会实现。事实上,随着这种变化,这些工具将变得更加复杂

当您开发一种需要新工具的全新格式时,情况会有所不同,例如,它本来是JMOD格式的一个选项,但开发新工具链的需要恰恰是它没有发生的原因,而当前的JMOD只是一个zip文件,就像旧的jar文件一样

反例是,在开发时没有向后兼容性约束,因此不会将
long
double
条目计算两次。处理工具的职责是将这些堆栈映射项转换为堆栈帧项,堆栈帧项使用两个
long
double
值(除非我们讨论的是一个反过来进行转换的环境).

让我们问另一个问题:如果它在新旧JVM版本中都能很好地工作,为什么要改变它?想想32位JVM(例如在ARM平台上)。它们有32位常量池条目是很自然的,也就是说,64位常量将占用两个插槽。@apangin本身说,“回顾过去,让8字节常量占用两个常量池条目是一个糟糕的选择”,我同意,即使对于32位环境,在一次过程中使用32位运行时条目转换为IR非常简单,而且还需要进行预处理。不需要在存储的类文件中保留这样的条目。但是你在“如果它有效为什么要改变它”一文中说得对,特别是如果我们没有从改变中获得任何好处。让我们问另一个问题:如果它在新旧JVM版本中都有效,为什么要改变它?想想32位JVM(例如,在ARM平台上)。它们有32位常量池条目是很自然的,也就是说,64位常量将占用两个插槽。@apangin本身说,“回顾过去,让8字节常量占用两个常量池条目是一个糟糕的选择”,我同意,即使对于32位环境,在一次过程中使用32位运行时条目转换为IR非常简单