JVM 中“boolean”类型的用途是什么?

问题描述 投票:0回答:2

正如JVMS8

所说:

Java虚拟机虽然定义了boolean类型,但它只提供了 对它的支持非常有限。不存在单独的 Java 虚拟机指令 致力于布尔值的运算。相反,Java 中的表达式 对布尔值进行操作的编程语言被编译为使用值 Java 虚拟机 int 数据类型。

确实,这两种方法:

boolean expr1(boolean a, boolean b) { return a || b; } int expr2(int a, int b) { return ((a != 0) || (b != 0)) ? 1 : 0; }
将产生相同的字节码(方法签名除外)

boolean expr1(boolean, boolean); Signature: (ZZ)Z Code: 0: iload_1 1: ifne 8 4: iload_2 5: ifeq 12 8: iconst_1 9: goto 13 12: iconst_0 13: ireturn int expr2(int, int); Signature: (II)I Code: 0: iload_1 1: ifne 8 4: iload_2 5: ifeq 12 8: iconst_1 9: goto 13 12: iconst_0 13: ireturn
所以,我不明白为什么

JVM

需要
boolean
类型。仅仅是为了方法签名的运行时检查吗?

java jvm boolean
2个回答
10
投票
至少需要支持方法重载。比如说,我们在同一个类中有两个方法

boolean a(boolean x) {...}


boolean a(int x) {...}


它们可以有不同的内部逻辑,因此在字节码中应该通过它们的签名来区分它们。


0
投票
从示例中可以看出,布尔计算都是整数计算。布尔表达式被编译为分支(例如 ifne)操作,在操作数堆栈上产生 0 int 或 1 int 。一旦高级语言布尔值被编译,就没有任何方法可以确定原始值是否是布尔值,因为它被转换为整数计算操作。

从高层次来看,像 Java 这样的语言区分整数和布尔类型(例如方法重载)绝对有优势。但从检查方法说明来看,你不会看到任何优势。

我的猜测是,JVM 布尔操作数类型仅适用于已编译的方法签名。即使像 baload 和 bastore 这样的指令的实现也会从操作数堆栈中弹出 32 位整数并截断为 8 位。

© www.soinside.com 2019 - 2024. All rights reserved.