Arrays Fortran(或具有所有静态环境的语言)中的激活记录和数组

Arrays Fortran(或具有所有静态环境的语言)中的激活记录和数组,arrays,static,fortran,records,activation,Arrays,Static,Fortran,Records,Activation,在创建数组时,像fortran这样的语言在全静态环境中如何生成激活记录(因为它在编译时不知道数组的大小)?我知道它使用按引用传递,那么这是否意味着在激活记录中它存储了一个引用而不是一个数组,从而允许它存储对一个尚未创建的数组的引用?您可能会感到困惑,因为通常说,在许多FORTRAN实现中,每个子程序都有一个激活记录,可以作为代码段的扩展静态分配。(例如,参见T.W.Pratt&M.V.Zelkowitz的《编程语言、设计和实现》第四版。) 需要记住的是,即使在这种情况下,激活记录也总是在执行期间

在创建数组时,像fortran这样的语言在全静态环境中如何生成激活记录(因为它在编译时不知道数组的大小)?我知道它使用按引用传递,那么这是否意味着在激活记录中它存储了一个引用而不是一个数组,从而允许它存储对一个尚未创建的数组的引用?

您可能会感到困惑,因为通常说,在许多FORTRAN实现中,每个子程序都有一个激活记录,可以作为代码段的扩展静态分配。(例如,参见T.W.Pratt&M.V.Zelkowitz的《编程语言、设计和实现》第四版。)

需要记住的是,即使在这种情况下,激活记录也总是在执行期间填充,只有空间是静态分配的。这很容易理解,因为可以对同一个子程序进行多次调用。所有这些调用共享相同的激活记录,每次只有一个调用处于活动状态


更重要的是,阵列数据不包括在激活记录中。通过引用传递参数意味着不存在数据重复。激活记录中只包含引用(指针或实现选择的任何内容)。在子程序中,可以通过基址+偏移机制计算对数组元素的访问。

您所说的所有静态环境是什么意思?您必须了解,同一数组可以以非常不同的方式查看,并且可以在一个作用域中使用数组描述符,在另一个作用域中使用简单指针。此外,Fortran不会传递简单引用。当它这样做时,通常不需要描述符,只需要一个指针。那么它如何使用激活记录呢?它如何在激活记录中为一个未指定大小的数组创建一个空格?我真的无法回答,因为你没有回答我。再说一遍:你所说的所有静态环境是什么意思?你心目中的具体情况是什么?有些Fortran数组就像C指针一样,在引擎盖下有一些多维索引。所以数组是可能的,因为引用只存储在激活记录中,对吗?在某种程度上,是的;特别是对于那些为每个子程序构建单个静态激活记录的编程语言。