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