是否需要使用基于堆栈的语言进行垃圾回收?


Answers:


14

GC通常应用于堆上分配的内存。我对Forth或RPL不熟悉,但是如果没有堆,而是将所有内容存储在全局堆栈中,那么GC就无事可做。


2
我早期阅读的Forth程序的典型内存使用模式类似于汇编程序,因为它们使用预先安排的静态全局数据地址。之所以可行,是因为Forth能够在堆栈和特定地址之间传输数据。此外,它具有计算地址的能力。因此,有可能基于堆概念创建分配器库,并且分配器库将需要某种方式来处理堆的有限大小。如果一个Forth用户走了这条路,他们可能会想要并实现GC。
卡迪夫太空人

13

你是对的。但是基于堆栈的内容只是整个故事的一部分。例如,Java字节码解释器也基于堆栈(出于效率原因,编译后的代码会有所不同)。这告诉我们,任何语言都可以转换为堆栈语言。

重要的是堆栈外部的对象,那些对象的寿命可能超过当前方法的执行时间。只要语言没有类似malloc或的语言new,就没有此类对象,并且您不需要delete也不 GC。

缺乏动态内存分配的语言的用途非常有限。


不确定我是否同意最后一行,java字节码没有用吗?
jk。

@ jk。,java字节码具有动态内存分配。
彼得·泰勒

1
实际上,有几种基于堆栈的通用语言。看看factorcode.org
Yam

1
实际因素是垃圾收集
Andrea

1

如果语言要固有地支持动态数据结构,则需要进行垃圾回收。如果您想做C语言之外的任何事情,这几乎是必需的。没有它,您将只能使用固定大小的数据结构并自己管理内存。当然,这就是原始的Forth所做的事情,但是除非您只进行低级系统编码,否则您今天可能不想这样做。


1

如果语言使用静态分配而不是堆栈分配,则不需要垃圾回收。例如,带有-s(静态存储)选项的Fortran 77 在程序启动时分配所有内存,因此在运行时不会发生要释放的内存分配。尽管需要一些纪律,但可以编写程序,尤其是模拟程序以使用静态内存分配。静态分配消除了任何内存泄漏,并提高了缓存性能,因为编译器可以使用静态分析来确定要加载到缓存中的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.