如果 boolean 在 JVM 中表示为 int,它如何对应 Java 是强类型的?
If boolean is represented as int in the JVM, how does it correspond with Java being strongly-typed?
我读到 JVM 将布尔值表示为 4 字节 (int)。
我的问题是 - Java 是强类型的 - 不允许转换为 int。
据我了解,JVM 习惯于 运行 根据 Java 的规范 (?) 编写代码,因此如果将用 C++ 编写的 3 + true 编译为字节码,它是合法的。
我错过了什么?
您对“JVM 习惯于 运行 根据 Java 规范进行编码”的理解是错误的。
有两种不同的规格
- The Java® Language Specification 描述了 Java 编程语言的语义和行为。它通常用于在 JVM 中创建 运行 的软件,但这不是严格的要求。
- The Java® Virtual Machine Specification 描述了 Java 虚拟机,一种特定的执行环境,它被设计为方便地作为使用 Java 编程语言编写的软件的目标平台,但是不限于此用途。
这在 JVM Spec §1.2:
中得到了澄清
The Java Virtual Machine knows nothing of the Java programming language, only of a particular binary format, the class
file format. A class
file contains Java Virtual Machine instructions (or bytecodes) and a symbol table, as well as other ancillary information.
因此,在编译以 Java 虚拟机作为执行环境的 Java 编程语言的源代码时,Java 编译器必须适应任意差异。
也就是说,“JVM 将布尔值表示为 4 字节 (int)”的说法是错误的。您被以下事实误导了,即在某些地方,不同类型的项目由相同的指令处理。特别是对于 局部变量 、boolean
和 int
值由相同的指令处理,但是,这同样适用于 byte
、short
,和char
,所有五种类型都使用相同的字节码指令进行同等处理。
实际上,long
和 double
类型由其他指令处理,这是在设计第一个 JVM 时为了简化实现而做出的历史性妥协。可以在任何地方推断每个变量和堆栈条目的类型,因此它也可以使用没有任何编码类型信息的通用指令集。
虽然这些处理局部变量和操作数栈的指令不区分boolean
、byte
、short
、char
和int
,JVM 在涉及方法和字段签名时区分所有这些类型。在那里,boolean
是 专用类型。相反,当涉及到数组时,boolean
数组和 byte
数组使用相同的指令处理,这与处理 int
数组的指令不同。不过,boolean[]
和 byte[]
数组本身具有不同的类型。
这些类型值的实际存储是否不同,完全取决于特定的 JVM 实现。
我读到 JVM 将布尔值表示为 4 字节 (int)。 我的问题是 - Java 是强类型的 - 不允许转换为 int。 据我了解,JVM 习惯于 运行 根据 Java 的规范 (?) 编写代码,因此如果将用 C++ 编写的 3 + true 编译为字节码,它是合法的。
我错过了什么?
您对“JVM 习惯于 运行 根据 Java 规范进行编码”的理解是错误的。
有两种不同的规格
- The Java® Language Specification 描述了 Java 编程语言的语义和行为。它通常用于在 JVM 中创建 运行 的软件,但这不是严格的要求。
- The Java® Virtual Machine Specification 描述了 Java 虚拟机,一种特定的执行环境,它被设计为方便地作为使用 Java 编程语言编写的软件的目标平台,但是不限于此用途。
这在 JVM Spec §1.2:
中得到了澄清The Java Virtual Machine knows nothing of the Java programming language, only of a particular binary format, the
class
file format. Aclass
file contains Java Virtual Machine instructions (or bytecodes) and a symbol table, as well as other ancillary information.
因此,在编译以 Java 虚拟机作为执行环境的 Java 编程语言的源代码时,Java 编译器必须适应任意差异。
也就是说,“JVM 将布尔值表示为 4 字节 (int)”的说法是错误的。您被以下事实误导了,即在某些地方,不同类型的项目由相同的指令处理。特别是对于 局部变量 、boolean
和 int
值由相同的指令处理,但是,这同样适用于 byte
、short
,和char
,所有五种类型都使用相同的字节码指令进行同等处理。
实际上,long
和 double
类型由其他指令处理,这是在设计第一个 JVM 时为了简化实现而做出的历史性妥协。可以在任何地方推断每个变量和堆栈条目的类型,因此它也可以使用没有任何编码类型信息的通用指令集。
虽然这些处理局部变量和操作数栈的指令不区分boolean
、byte
、short
、char
和int
,JVM 在涉及方法和字段签名时区分所有这些类型。在那里,boolean
是 专用类型。相反,当涉及到数组时,boolean
数组和 byte
数组使用相同的指令处理,这与处理 int
数组的指令不同。不过,boolean[]
和 byte[]
数组本身具有不同的类型。
这些类型值的实际存储是否不同,完全取决于特定的 JVM 实现。