Compilation 如果没有堆栈,会有函数吗?

Compilation 如果没有堆栈,会有函数吗?,compilation,computer-science,cpu-architecture,Compilation,Computer Science,Cpu Architecture,我知道堆栈数据结构用于存储正在运行的函数的许多其他内容中的局部变量 我还了解如何使用堆栈来管理递归 假设有一台机器没有在内存中提供堆栈区域,我认为不会有支持递归的编程语言。我还想知道机器的编程语言是否支持没有递归的函数 请有人给我介绍一下这方面的情况。需要一点理论框架来理解递归实际上与函数无关,而是与表达性有关。 我不会深入研究这个问题,让谷歌填补任何空白 是的,我们可以有没有堆栈的函数 我们甚至不需要函数的call/ret机制,我们可以让编译器内联每个函数调用。 所以根本不需要堆栈 这只考虑

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

我还了解如何使用堆栈来管理递归

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


请有人给我介绍一下这方面的情况。

需要一点理论框架来理解递归实际上与函数无关,而是与表达性有关。
我不会深入研究这个问题,让谷歌填补任何空白


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

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

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


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

引用递归是正确的,但是当涉及到递归时,我们需要更加正式,因为有各种形式的递归

例如,在lining中,如果内联的函数没有受到某种约束,则每个函数调用都可能循环编译器。 在不深入研究理论的情况下,为了始终确保我们的编译器不会循环,我们只能允许

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


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

如果你的问题更实际,那就考虑一下。 MIPS ISA中没有堆栈指令或堆栈指针寄存器,所有与堆栈相关的内容都是约定的。

编译器可以使用任何内存区域,并将其视为堆栈。

需要一点理论框架来理解递归实际上与函数无关,而是与表达性有关。
我不会深入研究这个问题,让谷歌填补任何空白


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

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

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


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

引用递归是正确的,但是当涉及到递归时,我们需要更加正式,因为有各种形式的递归

例如,在lining中,如果内联的函数没有受到某种约束,则每个函数调用都可能循环编译器。 在不深入研究理论的情况下,为了始终确保我们的编译器不会循环,我们只能允许

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


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

如果你的问题更实际,那就考虑一下。 MIPS ISA中没有堆栈指令或堆栈指针寄存器,所有与堆栈相关的内容都是约定的。

编译器可以使用任何内存区域,并将其视为堆栈。

您可以让编译器“手动”将内存区域用作类似堆栈的数据结构。您可以使用RSP以外的寄存器在x86上模拟push/pop和call/ret,只需使用MOV加载/存储、ADD和间接JMP即可。此外,我似乎还记得读过一篇关于通过传递指针而不是推送返回地址来实现函数call/ret的语言的SO答案。或者别的什么,我真的不记得了。它不仅仅是一个链接寄存器,相当于推送一个返回地址,它还有些不同。但我记不住足够的内容,无法再次找到它或说任何有用的话。您可以让编译器“手动”使用内存区域作为堆栈式的数据结构。您可以使用RSP以外的寄存器在x86上模拟push/pop和call/ret,只需使用MOV加载/存储、ADD和间接JMP即可。此外,我似乎还记得读过一篇关于通过传递指针而不是推送返回地址来实现函数call/ret的语言的SO答案。或者别的什么,我真的不记得了。它不仅仅是一个链接寄存器,相当于推送一个返回地址,它还有些不同。但我记不清了,无法再次找到它或说任何有用的话。