Functional programming 函数编程中函数应用背后的机制是什么

Functional programming 函数编程中函数应用背后的机制是什么,functional-programming,Functional Programming,好的,让我试着重新表述我的问题 实际上,我想知道函数应用程序是如何在FP中实现的 它是否像命令式语言中的函数调用一样完成,即为每个调用添加堆栈帧,并在每次返回时删除堆栈帧 或者,与内联函数类似,函数调用语句被函数定义替换 此外,就函数应用程序的实现而言,FP中语句函数的意义在于域和相应范围之间的映射。显然,不可能为每个域范围条目对维护映射,因此该语句到底意味着什么…这个问题很广泛,我无法完全回答,因为我不知道每一种函数式编程语言。但我可以用一种语言告诉你这是怎么做到的,F#。您询问了函数应用程序

好的,让我试着重新表述我的问题

实际上,我想知道函数应用程序是如何在FP中实现的

它是否像命令式语言中的函数调用一样完成,即为每个调用添加堆栈帧,并在每次返回时删除堆栈帧

或者,与内联函数类似,函数调用语句被函数定义替换


此外,就函数应用程序的实现而言,FP中语句函数的意义在于域和相应范围之间的映射。显然,不可能为每个域范围条目对维护映射,因此该语句到底意味着什么…

这个问题很广泛,我无法完全回答,因为我不知道每一种函数式编程语言。但我可以用一种语言告诉你这是怎么做到的,F#。您询问了函数应用程序是像命令式语言中的函数调用一样完成的(为每个调用添加了另一个堆栈框架),还是像内联函数一样完成的。。。而在F#中,答案是两者兼而有之。F#编译器可以选择是使用函数调用创建堆栈帧,还是在调用站点内联函数;通常,根据编译函数的大小进行选择。如果函数编译的编译代码少于N字节(我不能告诉您确切的数字,但知道确切的数字实际上并不重要),那么编译器通常会内联该函数调用;如果需要超过N个字节,则函数调用将使用堆栈帧。(尾部递归调用除外,尾部递归调用编译为与
goto
等效的调用,并且不使用堆栈帧)


另外,您可以通过使用
inline
关键字来强制编译器,这会强制每次在调用站点内联该函数。大多数F#程序员不建议定期这样做,因为编译器足够聪明,通常不建议重写它的决定。(另外,
inline
关键字意味着函数参数的类型必须在编译时可解析,因此有些函数的语义会发生变化,但这与您提出的问题有点脱离主题,所以我不会深入讨论。除了说在F#中,静态解析的类型参数或srtp是一个v这是一个非常复杂的问题,如果你理解他们,你可以用他们做一些非常高级的事情。)

我不理解投票失败的原因,因为。我真的很想知道FP中的函数是如何工作的。我来到FP时有一个必要的背景,希望了解幕后发生的事情……不是DV,但我可以想象至少两个可能的原因:你在这里问什么并不完全清楚,因为你混淆了抽象级别(例如语言使用和底层实现)在某种程度上,它是可以理解的,读起来是毫无意义的语义分裂。函数式语言绝对没有任何地方表明它们的底层实现是纯粹的。对于操作调用堆栈的引用,您所谈论的内容也不清楚?C++中的内联函数?我只是不明白你的问题。