【问题标题】:Will there be functions if there were no stacks?如果没有堆栈,会有函数吗?
【发布时间】:2016-09-23 20:50:48
【问题描述】:

我知道堆栈数据结构用于存储正在运行的函数的许多其他内容中的局部变量。

我也了解如何使用堆栈来优雅地管理递归。

假设有一台机器没有在内存中提供堆栈区域,我认为不会有支持递归的机器的编程语言。我也想知道机器的编程语言是否支持没有递归的函数。

请有人帮我看看这个。

【问题讨论】:

  • 您总是可以让编译器“手动”使用内存区域作为类似堆栈的数据结构。您可以使用 RSP 以外的寄存器模拟 x86 上的 push/pop 和 call/ret,仅使用 MOV 加载/存储、ADD 和间接 JMP。
  • 另外,我似乎记得读过关于通过传递指针而不是推送返回地址来实现函数调用/ret 的语言的 SO 答案。或者别的什么,我真的不记得了。它不仅仅是一个相当于推送返回地址的链接寄存器,它是不同的东西。但我想不起来再找到它或说什么有用的话。

标签: compilation computer-science cpu-architecture


【解决方案1】:

需要一些理论框架来理解递归确实与函数无关,而是与表达能力相关。
我不会深入研究,让谷歌填补任何空白。


是的,我们可以有没有堆栈的函数。

我们甚至不需要函数的 call/ret 机制,我们可以让编译器内联每个函数调用。 所以根本不需要堆栈。

这仅考虑编程意义上的函数,而不考虑数学意义上的函数。
一个更好的名字是惯例。 无论如何,这只是一个简单的概念证明,即作为可重用代码的功能不需要堆栈。


然而,并不是所有的函数,在数学意义上,都能以这种方式实现。
这类似于说:“我们可以让狗在床上,但不是所有的狗都可以在床上”。

通过引用递归,您走在了正确的轨道上,但是在递归方面,我们需要更加正式,因为recursion 有多种形式。

例如,如果被内联的函数不受某种约束,则内联每个函数调用都可能使编译器循环。 在不深入理论的情况下,为了始终确保我们的编译器不会循环,我们只能允许primitive (bounded) recursion

你所说的“递归”可能是general recursion,这不能通过内联来实现,我们可以证明我们需要无限量的内存用于GR,这就是PR和GR之间的分界线,没有一个堆栈。


所以我们可以有没有堆栈的函数,甚至是递归(对于某种形式的递归)函数。

如果您的问题更实际,请考虑MIPS。 MIPS ISA 中没有堆栈指令或堆栈指针寄存器,所有与堆栈相关的内容都只是约定。
编译器可以使用任何内存区域并将其视为堆栈。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 2019-08-19
    • 2012-07-08
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多