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,所有必要的分支指令(“跳轉條件”)已經可用.
總結
以上是生活随笔為你收集整理的java icmp_java – 为什么没有ICMP指令?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: commons-fileupload、s
- 下一篇: C语言 第八章 函数、指针与宏