首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >虚拟机是如何工作的?

虚拟机是如何工作的?
EN

Stack Overflow用户
提问于 2009-05-29 21:00:54
回答 4查看 5.5K关注 0票数 19

我一直在研究编程语言是如何工作的,其中一些语言有所谓的虚拟机。我知道这是在另一种编程语言中对编程语言的某种形式的模拟,并且它的工作方式类似于使用堆栈执行编译语言的方式。我说对了吗?

有了我所说的条件,令我困惑的是,许多非编译语言允许变量具有“自由”类型系统。例如,在Python中,我可以这样写:

代码语言:javascript
复制
x = "Hello world!"
x = 2**1000

字符串和大整数是完全不相关的,并且占用不同数量的内存空间,那么如何在基于堆栈的环境中表示这些代码呢?这里到底发生了什么?X是否指向堆栈上的新位置,而旧的字符串数据未被引用?这些语言不使用堆栈吗?如果不是,它们如何在内部表示变量?

EN

回答 4

Stack Overflow用户

发布于 2009-05-29 21:09:35

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

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

票数 2
EN

Stack Overflow用户

发布于 2009-05-29 22:09:25

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

VM允许运行一种不同类型的“汇编语言”,一种更适合编译器的汇编语言。VM中的所有工作都可以在CPU中完成,因此可以将VM看作CPU。(有些实际上是在硬件中实现的)。

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

对于普通的编译语言,单个步骤需要许多指令。a +可能看起来像“从相对于堆栈指针的点将项抓取到reg A中,将另一个项抓取到reg b中。添加reg a和b。将reg A放入相对于堆栈指针的位置。

VM使用一条短指令来完成这一切,可能是一条或两条字节,而不是机器语言中的每条指令4或8字节(取决于32或64位体系结构),这(猜测)应该意味着1-2字节的机器代码需要大约16或32字节的x86。(我可能错了,我最后一次编写x86代码是在80286时代。)

微软在其办公产品中使用(可能仍在使用)VM来减少代码量。

创建VM代码的过程与创建机器语言的过程相同,只是本质上不同的处理器类型。

VM还可以实现自己的安全性、错误恢复和内存机制,这些机制与语言密切相关。

我在这里的一些描述是总结和来自记忆。如果您想自己探索字节码定义,这是一件很有趣的事情:

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

票数 2
EN

Stack Overflow用户

发布于 2009-05-29 21:10:56

许多“虚拟机如何处理这样或那样的变量”的关键问题实际上归结为元数据……存储然后更新的元信息使VM能够更好地处理如何分配变量,然后对变量执行正确的操作。

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

至于你的具体问题--把变量当作普通的对象/等等……归结为重新分配/重新评估新分配的元信息-这就是为什么x可以先看一条路,然后再看另一条路。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/928136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档