我一直在寻找到编程语言是如何工作的,其中一些有一个所谓的虚拟机。我明白,这是某种形式的另一种编程语言中的编程语言仿真的,而且它的工作原理是怎样编译语言会被执行,用栈。难道我理解正确吗?

使用,我没有条件,什么bamboozles我的是,许多非编译语言允许与“自由”式的系统变量。在Python例如,我可以写:

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

字符串和大整数是完全不相关的,并占据不同量的存储器空间,所以如何将这些代码,即使在一个基于堆栈的环境来表示?到底会发生什么吗?为X指着堆离开未引用旧的字符串数据在一个新的地方?难道这些语言不使用堆栈?如果没有,怎么做他们所代表的内部变量?

有帮助吗?

解决方案

或许,你的问题应该被评为“怎么办动态语言的工作?”

这很简单,但与它一起存储所述变量的类型信息在存储器中。这不仅是在解释或JIT编译语言,而且本地编译语言,例如Objective-C中进行。

其他提示

在大多数VM语言中,变量可以被概念化为指针(或引用),以在堆存储器中,即使变量本身是在堆栈中。对于具有基本类型(int和布尔在Java中,例如)语言的那些可被存储在栈上为好,但它们不能被分配了新类型的动态。

忽略基本类型,在堆栈上存在的所有变量具有存储在堆它们的实际值。因此,如果动态重新分配一个值到它们,原始值被放弃(并且经由一些垃圾回收算法清理存储器),并且新的值在存储器的新比特被分配

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

一个VM使不同种类的“汇编语言”来运行,一个是比较适合适配编译器的。在虚拟机中所做的一切,可以在CPU中完成,所以认为虚拟机的CPU等。 (一些实际上是用硬件实现)。

这是非常低的水平,并且在许多情况下重基于堆栈 - 代替寄存器,机器级数学是所有相对于相对于当前堆栈指针位置

使用正常编译语言,需要用于单一步骤许多指令。一个+可能看起来像从相对于堆栈指针到一个REG的点“抓取该项目,抓住另一入REG b。加入REG a和b。把一章到相对于堆栈指针的位置。

在VM执行此全部用一个单一的,短指令,可能的一个或两个字节,而不是4或机器语言(取决于32位或64位体系结构),其(猜测)8个字节每指令应该意味着大约16或32个86字节1-2字节的机器代码。 (我可能是错的,我的最后86编码是80286的时代。)

Microsoft使用(可能仍然使用)的VM在他们的办公室产品,以减少代码量。

用于创建VM代码的步骤是一样的创建的机器语言,只是不同的处理器类型基本上

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

我的一些描述的是在这里总结和从存储器。如果你想自己探索字节码的定义,它还挺好玩的:

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

到许多关键的“做虚拟机是如何处理像这样或那样的变量”真的可以归结为元数据... ...元信息储存,然后更新,使虚拟机如何分配一个更好的手柄,然后做与变量正确的事。

在许多情况下,这是可以真正在性能的方式开销的类型。然而,现代的实现,等等都在做正确的事很长的路要走。

对于您的具体问题 - 治疗变量作为香草对象的/ etc ...归结为重新分配/重新评估新任务的元信息 - 这就是为什么x可以期待的一种方式,然后下。

要回答你的问题的一部分,我建议一个谷歌高科技谈蟒蛇,其中你的一些相关的动态语言回答问题;例如,变量是什么(它不是一个指针,也参考,但在python一个标签的情况下)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top