已经有两个“主要基于意见”的近距离投票.事实上,没有人可以在这里给出一个明确的答案,并且在试图争论25年前一群工程师做出的决定时,可能会有一些牵手.但我会尝试一下……
首先,我认为这个问题是合理的:int类型是Java语言中最“突出”的类型(最后但并非最不重要的是因为它作为数组索引的作用).这与它在Java虚拟机中的特殊作用密切相关,其中语言中存在的所有(较小的)整数类型(如字节或短)都可以有效地转换为int以用于所有计算.或者,如Java Virtual Machine Specification, Section 2.11.7中所述:
Because of its emphasis on int comparisons, the Java Virtual Machine provides a rich complement of conditional branch instructions for type int.
现在可以合理地问为什么这个“丰富的补充”似乎排除了对所有其他类型等效的指令.
没有icmp指令的主要原因可能是既没有必要也没有益处.
将它用于Integer#compare(int,int)的建议应用案例很难算作一个参数:这种方法的实现(即使存在icmp)也不会
return icmp, arg0, arg1;
将方法转换为字节码可能相当复杂,并且考虑到Java语言本身的可能性,无论如何必须将这种方法等效地实现为
if (x > y) return 1;
if (x < y) return -1;
return 0;
显然可以将其翻译成现有的if_icmp的序列.说明.
在这里,应该记住,这些比较指令的主要目的是分支:它们导致跳转到不同的位置.它们不是用于在堆栈上推送值,然后可以“用作方法的返回值”.谈论语言和谈论虚拟机是两件完全不同的事情.
人们也可以转过头来问问题:为什么lcmp,fcmp_和dcmp_指令分别可用于long,float和double?
在这里,一个明确的答案要容易得多:为long,float和double提供整套eq,ne,lt,le,gt和ge比较指令意味着18个额外的指令(甚至更多,使用NaN处理浮动点类型).考虑到一个字节可能存在256个指令的硬限制,这就是很多.
通过为这些类型提供lcmp,fcmp_和dcmp_指令,可以使用int的其余指令来模拟所有其他可能的比较情况.但同样,这些主要用于分支,因此根本不需要icmp指令,因为对于int,所有必要的分支指令(“跳转条件”)已经可用.