c#,java这类解释型的语言永远也比不上c/c++的编译型语言.

c#,java这类解释型的语言永远也比不上c/c++的编译型语言.
特别是在将来64位计算机中.
我看过byte code的定义,虚拟机非常像以前所说的Pcode机.
所有的虚拟机只有一个算术/逻辑运算器,也就是说在两个操作数的情况下,
必须先将两个操作数压栈,然后进行计算后再存放到算术/逻辑运算器中,
或者也可能将结果存放到堆栈中.
例如,你要计算A+B+C的值,
虚拟机一般如此定义操作
Push A (将A压栈)
Push B (将B压栈)
Add (将堆栈里的两数相加到算术/逻辑运算器中, 假设为RegA)
push RegA (将结果再压入堆栈,以便进行下一步计算)
push C
Add (将结果与C相加)

由此看出虚拟机也被称作是stack computer

而不是像c/C++那样产生的间接代码
load reg1, A
load reg2, B
add regA, reg1, reg2
load reg3, c
add regA, regA, reg3
由此看出c/c++编译产生的代码跟接近实际计算机, 因为实际的计算机
是register computer.

上面的操作看似语句数相等,但执行速度相差很大
虚拟机中的ADD,是要从内存(堆栈)中取出两个数, 而c/c++产生的代码
add rega, reg1, reg2却是直接寄存器操作.
我们知道,寄存器是在CPU中的,他的访问速度比内存访问速度快好几个数量级,
尽管现在出现片内的cache,但其速度还是会慢,而且有时cache内的数据可能
被切换到内存中.

Intel新推出的64位itanium中就有几百个cpu片内寄存器, 如果使用专门为这种
cpu设计的c/c++编译器,产生的代码将有大部分操作在寄存器中,其执行速度大大提高.

既然register computer这么好为何不在虚拟机中使用呢?
其原因不言自明, 为了跨平台(跨CPU)! 在实际生活中, 大部分的服务器的芯片都是
register computer型的(如Intel, AMD, PowerPC), 而大多数嵌入式芯片都是stack
computer型的, 因为嵌入型的cpu应尽量设计的小, stack computer由于片内只有一个
寄存器则使CPU较小.


在编译原理的代码优化理论中有一类被称作寄存器分配的算法,(当然有许多实际算法)
其基本想法是先设定一定的寄存器数量, 然后在变量分配时尽量分配给寄存器.如果寄
存器数不够才分配给内存.但这些算法(基于过程,着色图法)都相当复杂.所以在java和
c#中均未采用.
因此严格地说, 在某些嵌入式计算机中java程序可能运行在与c/c++相同的数量级上.
但在服务器中(特别是将来拥有大量寄存器的64位计算机中), 其运行效率可能相差好
几个数量级(特别是在运算密集型应用中).
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值