用PHP堆栈和堆?

时间:2014-06-14 19:01:38

标签: php stack heap dynamic-languages

我正在学习操作系统,而我完全不了解的是堆栈和堆栈。我知道它们的好处以及各自的工作原理,但在动态语言的情况下,我无法弄清楚堆栈是如何分配的。

在静态类型语言中,所有原始数据类型都存储在堆栈中,因为它们很小并且将按照它们分配的相同顺序或多或少地解除分配,但是在PHP之类的语言中,这在运行时才知道。那么堆栈大小和变量分配怎么可能呢?

如果我理解正确,则通过分析原始数据类型的数量和一些偏移量来确定堆栈大小。如何在PHP或其他动态语言中完成该过程?

如果这个问题在黑暗中发生,请给我一些指导如何了解这个

2 个答案:

答案 0 :(得分:3)

  1. 如果我理解正确,所有PHP数据类型都是zvalzval基于一些“Z”数据类型(在C中定义)。 “真实”数据类型的数量有限制。我相信它们存储在堆栈中。

    因此,尽管用户可以创建新数据类型,但它们不是“真实”数据类型,而是不同的zval值。并且“真实”数据类型的数量和定义是稳定的。因此,堆栈的大小和内容在运行时不会改变。

  2. 内存大小有限。 PHP必须主动进行reference counting和垃圾回收。有关详情,请参阅this slide about PHP memory management

答案 1 :(得分:1)

dynamic programming language的情况下,解释器会处理这个问题。解释行为大致类似于计算机。让我们假设一个在32位机器上运行的类似C的解释编程语言:

c = 10;

基本上,每个表达式都会发生以下情况:最小解释:

  • 该解释隐含地将c变量类型推导为整数;
  • c标识符放在symbol table
  • 评估表达式的右侧,结果与c标识符相关联。

当你写一个这样的表达式时:

a = c * 2

执行符号表中的查找,查找c标识符,如果找到,则符号表中的此条目保持引用,例如,我们的10值存储在内存中。加载此10值,然后在表达式中“替换”。