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位计算机中), 其运行效率可能相差好
几个数量级(特别是在运算密集型应用中).
特别是在将来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位计算机中), 其运行效率可能相差好
几个数量级(特别是在运算密集型应用中).