程序的调用堆栈是否因 OS and/or 编程语言而异?

Does a program's call stack differ depending on OS and/or programming language?

我知道调用堆栈在 linux IA32 中有明确定义的操作方式。调用堆栈的操作方式可能会因架构而异。但它是否也依赖于编程语言和操作系统?

首选 CPU 级调用堆栈取决于体系结构。从历史上看,CPUs 有指令支持堆栈增长到较低或较高的内存地址,堆栈的内容随体系结构和编程语言而变化。

编译为机器代码的编程语言可能会使用 CPU 支持的调用堆栈。但是任何给定的编程语言都可以选择使用哪个堆栈,如何使用它,放在那里什么,甚至哪个上下文负责从堆栈中弹出("calling convention")。

"Call Stack" 的维基百科文章解释了大多数调用堆栈包含的内容以及它们的使用方式。

操作系统将通过编写它们的编程语言来适应CPU架构C很常见,但也有其他的). OS 用汇编编写的部分可能会使用架构的约定。

调用堆栈的内容可能因语言而异。例如,某些语言按从右到左的顺序推送参数,而其他语言则按从右到左的顺序推送参数。有些依赖于调用者在 return 上清理堆栈,而另一些则依赖于被调用者来完成。

例如,考虑不同的 x86 calling conventions