Java編譯器輸入的指令流基本上是一種基于棧的指令集架構(gòu)
,另外一種指令集架構(gòu)則是基于寄存器的指令集架構(gòu)
具體來說:這兩種架構(gòu)之間的區(qū)別:
-
基于棧式架構(gòu)的特點(diǎn)
- 設(shè)計(jì)和實(shí)現(xiàn)更簡(jiǎn)單,適用于資源受限的系統(tǒng);
- 避開了寄存器的分配難題:使用零地址指令方式分配;
- 指令流中的指令大部分是零地址指令,其執(zhí)行過程依賴與操作棧,指令集更小,編譯器容易實(shí)現(xiàn);
- 不需要硬件支持,可移植性更好,更好實(shí)現(xiàn)跨平臺(tái)。
-
基于寄存器架構(gòu)的特點(diǎn)
- 典型的應(yīng)用是x86的二進(jìn)制指令集:比如傳統(tǒng)的PC以及Android的Davlik虛擬機(jī)鼻百。
- 指令集架構(gòu)則完全依賴硬件,可移植性差拴还。
- 性能優(yōu)秀和執(zhí)行更高效。
- 花費(fèi)更少的指令去完成一項(xiàng)操作。
- 在大部分情況下,基于寄存器架構(gòu)的指令集往往都以一地址指令服赎、二地址指令和三地址指令為主,而基于棧式架構(gòu)的指令集卻是以零地址指令為主媒殉。
總結(jié):
由于跨平臺(tái)性的設(shè)計(jì),Java的指令都是根據(jù)棧來設(shè)計(jì)的。
不同平臺(tái)CPU架構(gòu)不同,所以不能設(shè)計(jì)為基于寄存器的。優(yōu)點(diǎn)是跨平臺(tái),指令集小,編譯器容易實(shí)現(xiàn),缺點(diǎn)是性能下降,實(shí)現(xiàn)同樣的功能需要更多的指令辞槐。
時(shí)至今日,盡管嵌入式平臺(tái)已經(jīng)不是Java程序的主流運(yùn)行平臺(tái)了(準(zhǔn)確來說應(yīng)該是HotSpotVM的宿主環(huán)境已經(jīng)不局限于嵌入式平臺(tái)了),那么為什么不將架構(gòu)更換為基于寄存器的架構(gòu)呢?
棧:
跨平臺(tái)性掷漱、指令集小、指令多;執(zhí)行性能比寄存器差