java icmp_java – 为什么没有ICMP指令?

已经有两个“主要基于意见”的近距离投票.事实上,没有人可以在这里给出一个明确的答案,并且在试图争论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,所有必要的分支指令(“跳转条件”)已经可用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值