PHP中的堆栈和堆是什么?

7
我正在学习操作系统,有一件事我不太明白,那就是堆和栈。我知道它们的好处以及每个的工作原理,但在动态语言的情况下,我无法弄清楚如何分配栈。在静态类型的语言中,所有原始数据类型都存储在栈上,因为它们很小,并且将按照更多或更少相同的顺序进行释放,但是在像PHP这样的语言中,在运行时并不知道这一点。那么栈大小和变量分配是如何实现的呢?
如果我理解正确,栈大小是通过分析原始数据类型的数量和一些偏移量在编译时确定的。在PHP或其他动态语言中,该过程是如何完成的呢?
如果这个问题有些棘手,请给我一些指导,告诉我如何学习这个。

1
我将标签dynamic-programming修正为dynamic-languages。 - Jack
2个回答

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

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

  2. 内存大小是有限的。PHP必须积极地进行引用计数和垃圾回收。更多细节,请阅读关于PHP内存管理的这张幻灯片


0
动态编程语言的情况下,解释器会自动处理。解释行为基本上类似于计算机。假设在32位机器上运行C类解释式编程语言,则基本上会对每个表达式进行以下操作:
  • 解释器会隐式地将变量类型推断为整数;
  • 标识符被放在符号表中;
  • 表达式的右侧被求值,并将结果与标识符相关联。
当您编写以下表达式时:
a = c * 2

进行符号表查找,寻找标识符c,如果找到,则该符号表条目保存引用,例如,我们的10值存储在内存中的位置。然后加载这个10值,并在表达式中“替换”它。

那么那些没有未分配的值呢? - gorgi93
1
他们仍然存在于内存中。 - The Mask
作为什么类型的变量? - gorgi93
最后一个值的类型。如果它是变量'a'或像10这样的数字常量,则类型分别为标识符或数字。你可能会混淆只有在看到'='符号时才会解析表达式。 - The Mask
1
这并不重要。表达式中的任何值都会被推送到内存中,在赋值符号出现时,其计算结果将放置在该位置。否则,该值未使用且没有变量指向它。例如,您正在解析像C这样的void表达式类型的语言,并从操作数堆栈中弹出值,只要您为其生成代码,一个左值将始终在操作数堆栈上。它可以手动弹出。 - The Mask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接