我正在学习操作系统,而我完全不了解的是堆栈和堆栈。我知道它们的好处以及各自的工作原理,但在动态语言的情况下,我无法弄清楚堆栈是如何分配的。
在静态类型语言中,所有原始数据类型都存储在堆栈中,因为它们很小并且将按照它们分配的相同顺序或多或少地解除分配,但是在PHP之类的语言中,这在运行时才知道。那么堆栈大小和变量分配怎么可能呢?
如果我理解正确,则通过分析原始数据类型的数量和一些偏移量来确定堆栈大小。如何在PHP或其他动态语言中完成该过程?
如果这个问题在黑暗中发生,请给我一些指导如何了解这个
答案 0 :(得分:3)
如果我理解正确,所有PHP数据类型都是zval。 zval
基于一些“Z”数据类型(在C中定义)。 “真实”数据类型的数量有限制。我相信它们存储在堆栈中。
因此,尽管用户可以创建新数据类型,但它们不是“真实”数据类型,而是不同的zval
值。并且“真实”数据类型的数量和定义是稳定的。因此,堆栈的大小和内容在运行时不会改变。
内存大小有限。 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
值,然后在表达式中“替换”。