2009-05-29 117 views
18

我一直在研究如何编程语言的工作,其中一些有所谓的虚拟机。我知道这是另一种编程语言中编程语言的某种形式的模拟,并且它的工作方式就像一个编译语言将如何执行,以及一个堆栈。我有没有得到那个权利?虚拟机如何工作?

在附带条件是我做了什么之后,我发现很多非编译语言允许使用“自由”类型系统的变量。在Python例如,我可以这样写:

x = "Hello world!" 
x = 2**1000 

字符串和大整数完全无关,并占据不同量的内存空间,所以这怎么能代码即使在一个基于堆栈的环境来表示?究竟发生了什么? x是否指向堆栈中的新位置,并且旧字符串数据未被引用?这些语言不使用堆栈吗?如果不是,他们如何在内部表示变量?

+4

大的第一个问题! – samoz 2009-05-29 21:02:45

+0

相关问题:http://stackoverflow.com/questions/688803/how-does-a-register-based-virtual-machine-work – lothar 2009-05-29 21:18:38

回答

7

可能您的问题应该标题为“动态语言如何工作?”。

这很简单,它们将变量类型信息与它一起存储在内存中。这不仅在解释或JIT编译语言中完成,而且还在本地编译的语言(如Objective-C)中完成。

+0

啊哈,我明白了。但是在重新分配期间会发生什么?如果新数据比旧数据大,那么它放在哪里以及旧数据是什么? – Martin 2009-05-29 21:10:21

2

在大多数VM语言中,即使变量本身位于堆栈上,变量也可以概念化为堆中内存的指针(或引用)。对于具有原始类型的语言(例如,Java中的int和bool),这些语言也可以存储在堆栈中,但不能动态分配新类型。

忽略原始类型,堆栈中存在的所有变量都将其实际值存储在堆中。因此,如果您动态地为它们重新分配一个值,则放弃原始值(并通过一些垃圾收集算法清理内存),并将新值分配到新的内存位中。

1

许多“虚拟机如何处理像这样或那样的变量”的关键真的归结为元数据...存储和更新的元信息给了虚拟机一个更好的处理方法,如何分配然后做正确的变量。

在许多情况下,这是可以真正影响性能的开销类型。然而,现代实施等在做正确的事情方面已经走了很长的路。

至于你的具体问题 - 将变量当作香草物体/等等......归结为重新赋值/重新评估有关新赋值的元信息 - 这就是为什么x可以看上去一种方式,然后看下一种方式。

1

若要回答您的部分问题,我建议您提供一个google tech talk about python,其中有关动态语言的一些问题已得到解答;例如一个变量是什么(它不是一个指针,也不是一个引用,但在python的情况下是一个标签)。

2

虚拟机与语言无关。任何语言都可以在虚拟机上运行(Java虚拟机已经有数百种语言)。

虚拟机启用了一种不同类型的“汇编语言”,它更适合编译器。所有在虚拟机中完成的任务都可以在CPU中完成,所以将虚拟机想象成一个CPU。 (有些实际上是用硬件实现的)。

这是非常低的水平,并且在很多情况下基于堆栈 - 而不是寄存器,机器级数学都相对于相对于当前堆栈指针的位置。

使用正常的编译语言,一步就需要很多指令。 a +可能看起来像“从相对于堆栈指针的点抓取项目到reg a,再抓入reg b。添加reg a和b。将reg a放入相对于堆栈指针的位置中。 VM用一个简单的指令,可能是一个或两个字节,而不是机器语言中的每个指令4或8个字节(取决于32位或64位体系结构)来执行所有这些操作(猜测)应该是指大约16或32字节的x86 1-2个字节的机器代码。(我可能是错的,我的最后86编码是80286的时代。)

Microsoft使用(可能仍然使用)的虚拟机在其办公产品,以减少代码量。

程序为cr吃VM代码与创建机器语言相同,本质上只是一种不同的处理器类型。

虚拟机还可以实现与语言非常紧密相关的自己的安全性,错误恢复和内存机制。

这里的一些描述是摘要和内存。如果你想自己探索字节码的定义,它还挺好玩:

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html