当我们执行Java程序时,我对内存中发生的事情很好奇,所以我看了一些简短的教程,只是为了有一个基本的理解。
这些“教程”讨论的是堆和堆栈,以及它们是如何工作的以及它们的目的是什么。
Java作为一种面向对象语言被定义为有状态语言,这意味着变量在时间函数中发生变化(例如x=x+1 )。
考虑到变量在堆和堆栈中的“分布”,我可以理解为什么Java是有状态的,为什么我们会遇到并发问题。
然而,函数编程语言似乎不受这些问题的影响,因为它们是无状态的(我不打算在这里列出的所有好处)。
然而,Scala被定义为函数式编程,它构建在JVM上,因此我认为它具有Java (SE)的相同内存管理。
1)内存管理是JVM的特性还是Java的特性?
2)如果内存管理是JVM的一个特性,为什么Scala被定义为一种函数编程语言?
发布于 2018-12-06 11:40:29
首先,Scala不是一种纯函数式语言。它具有可变的变量和数据结构(如果需要的话)。然而,这并不是JVM具有堆和堆栈的结果,而是简单的实用主义。事实上,大多数函数式语言并不是纯函数式的。
也就是说,确实存在的纯函数语言(例如Haskell)也有堆和堆栈(或者更确切地说,每个线程有一个堆栈),而且绝对没有理由不能在JVM上实现纯函数语言(除了在JVM上提供与Java库互操作的能力(其中许多库都具有可变对象)之外的实用语言)。
堆中的值可能随时间变化而变化。
如果更改堆(或堆栈)中的值,则会更改它们。如果你不改变他们,他们就不会改变。如果你的语言不允许你改变它们,它们就无法改变。栈或堆不会阻止语言具有不可变的变量和/或对象。就像没有什么可以阻止您在Java中声明所有变量final一样(并且只使用也只有final成员的类)。
https://stackoverflow.com/questions/53649985
复制相似问题