基于栈的指令集与基于寄存器的指令集

时间:2021-01-17 17:07:28

Java编译器输出的指令流,基本上[1]是一种基于栈的指令集架构,它们依赖操作数栈进行工作

与之相对的另外一套常用的指令集架构是基于寄存器的指令集

举个最简单的例子,分别使用这两种指令集计算“1+1”的结果,基于栈的指令集会是这
样子的:

//基于栈的指令
iconst_1
iconst_1
iadd
istore_0

//基于寄存器指令
mov eax,1
add eax,1

 基于栈的指令集主要的优点就是可移植, 缺点是执行速度慢,相同操作指令数要多很多. 

寄存器由硬件直接提供[2],程序直接依赖这些硬件寄存器则不可避免地要受到硬件的约束。

 

虽然栈架构指令集的代码非常紧凑,但是完成相同功能所需的指令数量一般会比寄存器架构多,因为出栈、入栈操作本身就产生了相当多的指令数量。更重要的是,栈实现在内存之中,频繁的栈访问也就意味着频繁的内存访问,相对于处理器来说,内存始终是执行速度的瓶颈。

 


 

Tomcat服务器的类加载架构

 

基于栈的指令集与基于寄存器的指令集


 

 

OSGi(Open Service Gateway Initiative)是OSGi联盟(OSGi Alliance)制定的一个基于Java语言的动态模块化规范,

类库的可见性能得到非常精确的控制,一个模块里只有被Export过的Package才可能由外界访问,其他的Package和Class将会隐藏起来.

除了更精确的模块划分和可见性控制外,引入OSGi的另外一个重要理由是,基于OSGi的程序很可能(只是很可能,并不是一定会)可以实现模块级的热插拔功能,当程序升级更新或调试除错时,可以只停用、重新安装然后启用程序的其中一部分,这对企业级程序开发来说是一个非常有诱惑力的特性. 

 

但并非所有的应用都适合采用OSGi作为基础架构,OSGi在提供强大功能的同时,也引入了额外的复杂度,带来了线程死锁和内存泄漏的风险