首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数程序中的名称、值/表达式保存在哪里?

函数程序中的名称、值/表达式保存在哪里?
EN

Stack Overflow用户
提问于 2014-09-09 22:18:35
回答 3查看 232关注 0票数 2

在C#中,所有的值字段(如int、float )都保存在堆栈中,所有引用变量指针都在堆栈中,而实际值则保存在堆中。(希望我的理解是正确的)。

  1. 由于在函数式编程模型中没有值和引用类型,所以名称符号值保存在哪里? 2.堆栈和堆是如何在功能程序上发挥作用的? 谢谢
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-09 22:31:58

由于函数式语言通常使用不可变的值(意思是:不能修改的“变量”),因此对于用户来说,这些值是存储在堆栈上还是堆上并不重要。

因此,编译器通常会决定如何存储这些值。例如,它可能决定将小值(整数、浮点数、整数对、8字节数组等)存储在堆栈上,并将大值(字符串、列表、.)存储在堆栈中。存储在堆中。这完全是编译器的决定。

对于像Haskell这样支持延迟计算的语言,需要将值存储在堆中(除非使用一些技巧)。这是因为变量需要是用于计算值的函数/闭包的指针,或者是指向实际已计算值的指针。

票数 5
EN

Stack Overflow用户

发布于 2014-09-09 23:08:48

您正在尝试将C# (这是一种特定的语言)与函数语言作为一个组进行比较。这是苹果和橘子的比较(或者更准确地说,苹果和香料的比较?)

在命令式语言中,您可以观察存储在堆栈中的值与堆上存储的值之间的差异。例如,C和C++ (据我理解)允许程序员手动选择这两种方式中的任何一种。

另一个微妙之处是语言对程序员的保证与语言实现方式之间的区别。一个例子是,最近版本的Oracle有一个称为“逃逸分析”的优化,如果VM能够证明对象引用没有转义方法(在执行内联后确定),它就能够在堆栈上分配对象。因此,即使Java将其对象类型称为“引用”类型,这并不意味着它将在堆中分配。引用这篇文章由Brian Goetz撰写

Java语言没有提供在堆栈上显式分配对象的任何方法,但这个事实并不能阻止JVM在适当的地方仍然使用堆栈分配。JVM可以使用一种名为转义分析的技术,通过这种技术,它们可以判断某些对象在整个生命周期内都仅限于单个线程,并且生存期受给定堆栈帧的生存期限制。这样的对象可以安全地分配到堆栈上,而不是堆上。更好的是,对于小型对象,JVM可以完全优化分配,只需将对象的字段提升到寄存器中即可。

类似的考虑也适用于功能语言--这完全取决于(a)语言承诺是什么,(b)语言实现是如何工作的以及它有多复杂。但我们可以将功能语言世界分为两个重要的阵营:

  1. 热切的函数式语言,如Scheme、Scala、Clojure或ML。
  2. 像Haskell这样懒惰的函数式语言。

对于热切的语言,有几种实现类型:

  1. 纯基于堆栈的实现。这些语言的工作方式与现代祈使语言相同。普通的Lisp就是这样工作的。因为JVM函数式语言与Java使用相同的VM,所以它们也使用相同的VM。
  2. 纯延续-传递样式实现。这些都是完全没有堆栈的-所有东西,包括激活帧,都是在堆上分配的。这使得支持尾叫优化一级连续变得很容易。我认为这种技术是Scheme实现的先驱,新泽西州的标准ML编译器也使用了这种技术。
  3. 混合实现。这些典型的尝试主要是基于堆栈的,但也支持尾叫优化,也许是一流的延续。一堆随机计划系统。

惰性语言则是另一回事,因为传统的调用堆栈实现不会直接转换为惰性评估。GHC Haskell编译器基于一个名为"STG机器“的模型,它确实使用堆栈和堆,但是STG堆栈的工作方式与命令式语言不同;STG堆栈中的条目与常规堆栈条目不对应“函数调用”。

票数 17
EN

Stack Overflow用户

发布于 2014-09-09 22:51:08

由于标记中提到了Scala,我将添加并回答有关该语言的内容。Scala编译为JVM字节码,因此,最终它的工作方式与任何其他JVM语言(包括Java)一样:

  • 引用和本地定义的原语在堆栈上;
  • 对象(包括它们的原始字段)放在堆上。

关于原语类型,值得注意的是Scala实际上并没有语言中的原始类型;但是值类型(如Int或Long)在可能的情况下会被编译到字节码中JVM的原始类型中。

编辑:为了避免在这个答案中留下一些不正确的地方:正如Luis Casillas的广泛答案中提到的,如果JVM能够判断这样做是安全和有效的,那么对象最终可能会存储在堆栈上(甚至根本不作为对象分配)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25754442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档