Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell如何管理其内存?_Haskell_Memory Management_Functional Programming_Ghc - Fatal编程技术网

Haskell如何管理其内存?

Haskell如何管理其内存?,haskell,memory-management,functional-programming,ghc,Haskell,Memory Management,Functional Programming,Ghc,因此,我们知道,对于大多数语言,在程序执行的整个过程中: 全局变量存储在静态内存中 局部变量存储在堆栈内存中 任意更改的变量存储在堆中 哈斯克尔呢?我只知道它是懒惰的。这是如何转化为这种情况的?很多(高级)语言都在讨论如何实现内存管理。但对于GHC来说,这可能是一个开始。作为一个零阶近似值,您必须说Haskell中的所有内容都在堆上,但更实际地说,我们可以假设编译器将决定将任何变量放在对性能最好的地方。通常,它也会完全消除变量,或引入新的变量。该语言所指定的只是最终会得到正确的结果……不要忘

因此,我们知道,对于大多数语言,在程序执行的整个过程中:

  • 全局变量存储在静态内存中
  • 局部变量存储在堆栈内存中
  • 任意更改的变量存储在堆中

哈斯克尔呢?我只知道它是懒惰的。这是如何转化为这种情况的?

很多(高级)语言都在讨论如何实现内存管理。但对于GHC来说,这可能是一个开始。作为一个零阶近似值,您必须说Haskell中的所有内容都在堆上,但更实际地说,我们可以假设编译器将决定将任何变量放在对性能最好的地方。通常,它也会完全消除变量,或引入新的变量。该语言所指定的只是最终会得到正确的结果……不要忘记静态/堆栈/堆内存本身并不存在。在较低级别,我们只有RAM(包括虚拟内存)。然后,操作系统可以为“堆栈”保留一部分地址空间,允许进程请求更多堆栈(例如,
sbrk
)或堆(
mmap
),并在加载可执行文件时预分配静态部分。除此之外,语言运行时系统还可以使用垃圾收集。GC的一些变体进一步将内存分成几代或从空间/到空间(用于复制GC)。这些是进一步的抽象,通常在“堆”中实现。Haskell没有提到任何关于内存管理的内容。Haskell的一个特定实现做出了这些决定。