python是基于堆栈的意思是什么?

时间:2015-12-08 05:58:56

标签: python

我已经阅读了CPython是如何基于堆栈的。这是什么意思?当我使用dis模块时,我看到LOAD_FAST等操作,其中值放在堆栈上。但我已经读过python中的所有值都是对象,因此进入堆中。我想我在这里混淆了两件不同的事情。我还读到有一种叫做无堆栈的python。有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:5)

最流行的python解释器CPython可以被视为基于堆栈的虚拟机。这意味着为具有stack architecture的虚拟(虚拟)计算机编译python代码。

另一方面是如何实现此虚拟机。它显然不是一块硬件(以及处理器制造商尝试添加对某些虚拟机的支持,例如JVM,are usually not successful)。因此,这个堆栈机器由一个用C编写的程序模拟,它是CPython解释器的一部分。

关于堆栈和堆如何共存,现在应该清楚 - 虚拟机和堆栈都放在堆内存中。使用LOAD_FAST从虚拟机的角度将对象放在堆栈顶部 ,并且从操作系统的角度来看,同一指令将对象放在堆中< / em>的

答案 1 :(得分:2)

一切都不是黑与白。基于堆栈的含义不应被视为排除数据存储在堆上的可能性。

首先,它只是对VM中堆栈上的对象的引用,但仍然并非所有引用都存在于那里(对堆中的对象中的其他对象也有引用)。

这里的堆栈是临时数据被保存在堆栈而不是寄存器中。这意味着如果要添加两个数字,则将它们放在堆栈上,然后执行加法指令,而不是在寄存器中将它们放入寄存器并将它们加在一起。

现在,由于对象的生命周期不受限制,使得它们可以(或至少可行)将它们放在堆栈上,因此必须使用堆来完成此模型以存储实际对象。

此外,在堆栈模型下成为奴隶是相当不切实际的。例如,VM必须能够访问全局范围(根据定义,它是类似dict的对象)。虽然可以通过始终对堆栈中的全局范围的引用来解决,但这是相当不切实际的。相反,有指示直接在全局范围内进行查找。类似的推理适用于局部范围,你可以将所有局部变量放在堆栈上,而是将它们放在一个数组中,这更像是注册机中的情况,那就是其中LOAD_FAST出现在图片中。

事实上,CPython VM更多地是注册机和堆栈机的混合。

然后关于无堆栈的python,它也有些令人困惑。该名称中的堆栈不是指同一堆栈。相反,它指的是C-stack,并不意味着它没有C-stack,而是python解释器不使用C调用栈来跟踪python调用栈。这实际上意味着无堆栈python在VM中的堆栈数量多于CPython而不是更少。

不同之处在于调用函数时会发生什么。在CPython中,VM将简单地调用自身来执行该方法,这意味着在C堆栈上维护有关如何返回调用者的信息。另一方面,在无堆栈的python中,返回地址被推送到python堆栈,VM继续直接执行该函数,并且在VM堆栈上维护有关如何返回调用者的信息。无堆栈python的一个优点是每个python线程不必在C中使用单独的线程执行(这意味着即使在不支持多线程的平台上,无堆栈的python也可以有线程)。

有些python的实现使用了注册机,但是那时它也不是黑白的。正如您可能已经意识到函数调用将需要将返回信息存储在某处,并且基本上要求它将存储在堆栈中。所以它也是堆栈机和注册机的混合体。当然,它可能会使用C堆栈来保存返回调用者的信息,这可能会使VM无法访问该堆栈。