【发布时间】:2020-10-27 00:33:34
【问题描述】:
如https://docs.oracle.com/javase/specs/jvms/se14/html/jvms-2.html#jvms-2.11.1 中所述,将操作数类型编码为操作码是有代价的:
鉴于 Java 虚拟机的一字节操作码大小,将类型编码为操作码会对其指令集的设计造成压力。如果每条类型化指令都支持 Java 虚拟机的所有运行时数据类型,那么指令的数量将超过一个字节所能表示的数量。
因此,似乎只应该对需要操作数类型信息或启用优化的指令执行此操作。例如,需要区分iadd 和fadd,因为整数和浮点数的加法实现方式不同。而且我不知道为什么从数组(分别为baload 和iaload)加载boolean 和int 有不同的指令,但我至少可以想象一些性能原因。
但是,为什么将int (istore) 和float (fstore) 存储到局部变量中的指令不同?它们不应该以完全相同的方式实现吗?
这个答案https://stackoverflow.com/a/2638143 说字节码验证器需要输入指令。但这真的有必要吗?在方法中,所有数据都从方法的参数(类型已知)和类字段(类型也已知)流向其他类字段和返回值。因此,由于输入和输出的类型是已知的,我们不能为指令重建任何缺失的类型吗?事实上,字节码验证器不就是这样做的吗,因为它必须检查类型,即它必须知道哪些类型是预期的?
简而言之:如果我们将istore 和fstore 组合成一条指令,会发生什么问题?性能或便携性会受到影响吗?字节码验证会停止工作吗?
【问题讨论】: