你的问题在这里是边缘性的。程序员 https://softwareengineering.stackexchange.com/可能是一个更好的地方。
Queinnec 的书可能是一本了解堆栈等概念的好书Lisp 的小片段 http://en.wikipedia.org/wiki/Lisp_in_Small_Pieces(它很好地解释了 Lisp 中的栈是什么)。还,SICP http://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs是一本好书read http://mitpress.mit.edu/sicp/.
D.Knuth http://en.wikipedia.org/wiki/Donald_Knuth的书籍和MMIX http://www-cs-faculty.stanford.edu/~knuth/mmix.html也是一本好书。
仔细阅读维基百科调用堆栈 http://en.wikipedia.org/wiki/Call_stack page.
理论上,不需要调用堆栈,并且某些语言和实现(例如旧的 SML/NJ)不使用任何堆栈(而是在垃圾收集堆中分配调用帧)。参见 A.Appel 的旧论文垃圾收集可以比堆栈分配更快 http://www.cs.princeton.edu/~appel/papers/45.ps(并了解更多关于垃圾收集 http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29一般来说)。
通常 C 和 C++ 实现都有一个堆栈(并且经常使用硬件堆栈)。某些 C 局部变量可能没有任何堆栈位置(因为它们已经过优化,或者保存在寄存器中)。有时,C 局部变量的堆栈位置可能会发生变化(编译器将在某些情况下使用一个调用堆栈槽,而在同一局部变量的其他情况下使用另一个调用堆栈槽)。当然,一些临时值可能会像局部变量一样进行编译(因此保留在寄存器中,在一个堆栈槽中,然后在另一个堆栈槽中,等等......)。优化时,编译器可能会对变量执行一些奇怪的操作。
On some old machines IBM/360 http://en.wikipedia.org/wiki/System/360 or IBM z/series http://en.wikipedia.org/wiki/IBM_zSeries, there is no hardware stack; the stack used by the C compiler is a software convention (e.g. some register is dedicated to that usage, without specific hardware support)
考虑一下递归定义的函数的执行(或解释)(就像古老的函数一样)阶乘天真的编码)。阅读递归 http://en.wikipedia.org/wiki/Recursion(一般来说,在计算机科学中 http://en.wikipedia.org/wiki/Recursion_%28computer_science%29), 原始递归函数 http://en.wikipedia.org/wiki/Primitive_recursive_function, 拉姆达演算 http://en.wikipedia.org/wiki/Lambda_calculus, 指称语义 http://en.wikipedia.org/wiki/Denotational_semantics, 堆栈自动机 http://en.wikipedia.org/wiki/Stack_automaton, 寄存器分配 http://en.wikipedia.org/wiki/Register_allocation, 尾部调用 http://en.wikipedia.org/wiki/Tail_call, 延续 http://en.wikipedia.org/wiki/Continuation, ABI http://en.wikipedia.org/wiki/Application_binary_interface, 中断 http://en.wikipedia.org/wiki/Interrupt, Posix 信号 http://en.wikipedia.org/wiki/Unix_signal, 信号堆栈(2) http://man7.org/linux/man-pages/man2/sigaltstack.2.html, 获取上下文(2) http://man7.org/linux/man-pages/man2/getcontext.2.html, 长跑(3) http://man7.org/linux/man-pages/man3/longjmp.3.html等等...等等...
还可以阅读有关的书籍计算机架构 http://en.wikipedia.org/wiki/Computer_architecture。在实践中,调用堆栈非常重要,以至于多个硬件资源(包括堆栈指针注册,通常是调用框架基指针寄存器,也许还有隐藏的机器,例如缓存相关)专用于常见处理器上。
您还可以查看 GCC 编译器使用的中间表示形式。然后使用-fdump-tree-all
or the GCC MELT 探针 http://gcc-melt.org/index.html#probe_id。如果查看生成的程序集,请务必通过-S -fverbose-asm
给你的gcc
命令。
另请参阅Linux 汇编指南 http://tldp.org/HOWTO/Assembly-HOWTO/.
I gave a lot of links. It is difficult to answer better, because I have no idea of your background.