我无法理解堆栈/堆内存模型的使用是否是程序员的决定,或者它是否取决于操作系统,程序员别无选择,只能使用它。
例如,像Fortran77这样的无堆栈语言是否可以在现代平台上运行,仍然使用无堆栈,基于阵列的内存模型?或者,现代Fortran编译器必须将数组内存模型转换为堆栈/堆内存模型吗? (我找不到很多关于Fortran内存管理的文档。)
如果内存模型是程序员的决定,为什么我遇到的所有内容似乎都隐含地假设堆栈/堆模型是唯一的选择?例如,LLVM使用堆栈帧运行,我找不到任何其他方式管理内存的文档。所有基于LLVM构建的语言,甚至是函数式语言,都必须采用堆栈/堆模型,而替代模型可能更适合。
如果内存模型是OS的决定,这是否意味着编写使用自定义内存模型的程序需要编写自定义操作系统?例如,如果我想运行Fortran程序使用Fortran设计的基于阵列的内存模型,我是否需要自定义操作系统?
如果答案取决于操作系统,请在不同操作系统之间进行一些比较。
答案 0 :(得分:5)
堆栈和堆没有直接与Fortran做什么,标准对它们一无所知。同样C,至少到C89,之后我的知识就不那么好了。相反,编译器必须将标准定义的语言特征转换为底层内存模型。该内存模型是编译器实现者的选择,但通常最方便的是使用目标操作系统为您提供的任何功能。因此,您经常会看到堆栈和堆,但至少就Fortran和C而言,与编程语言无关。
答案 1 :(得分:1)
听起来你有一些误解。首先,FORTRAN实现通常(总是在实践中?)使用堆栈。经典FORTRAN可能不会在堆栈上分配变量,但它必须使用堆栈来进行过程调用。即使使用静态参数帧的FORTRAN实现,它们仍然会创建堆栈帧。
堆只是内存,管理为允许随机分配和内存处理。一些编程语言隐式使用堆,例如管理动态字符串和数组(例如BASIC)。其他编程语言允许程序员使用堆但不需要它(例如C)。一些编程语言通常不会使用堆来编写程序员可访问的构造(例如Cobol,经典的FORTRAN)。