为什么其他语言没有像Java垃圾回收器那样自动垃圾回收?
为什么其他语言没有像Java垃圾回收器那样自动垃圾回收?
其他语言没有垃圾收集器的原因是什么?
为什么这些其他语言没有内置垃圾收集?为什么程序员要负责收集垃圾?
硬件没有垃圾收集器(有些硬件具有一些转发指针的基本支持,这是构建一些垃圾收集器时有用的功能,但这远远不是“硬件中的GC”)。相应地,汇编没有GC。汇编是一种“编程语言”(尽管是最接近裸机的一种),所以你可以在广泛存在的编程语言谱系中找到:一些语言不会有GC。
恰巧的是,高效的GC不是容易实现的东西。为此开发出好的算法已经花费了很长时间。更重要的是,大多数优秀的GC算法之所以优秀,是因为它们执行了一些复杂的操作,例如在RAM中移动数据元素;这对于提供分配最大时间保证的“实时GC”是必要的(当存在分段时,您无法提供这样的保证,并且您无法避免移动RAM中的对象以避免分段)。当一个对象被移动时,必须自动调整指向该对象的所有指针,只有编程语言提供强大的无法规避类型才能做到这一点。例如,在C或C ++ 中无法完成此操作。在C中,将编码指针值的字节打印出来,并要求用户将它们打回是合法的。当GC移动对象时,GC无法改变用户的大脑...
因此,在实践中,没有强类型的语言是没有GC的。这包括C,C ++,Forth和各种带扩展语言的汇编...这并不妨碍有些人为这些语言编写GC实现,例如Hans Boehm的C和C ++ GC。这意味着,GC可能会因为“合法”而奇怪的程序而失败,这是在语言标准范围内的。
还有一些拥有强类型但没有垃圾回收机制的语言,这要么是因为它们的设计者并不相信垃圾回收机制,或者认为不需要它,或者害怕增加额外代码大小(例如,智能卡的Java,Javacard就是没有垃圾回收机制的,因为在只有8kB代码和512字节RAM的环境中安装垃圾回收机制是不容易的)。
最后,关于已经设计出来的数千种编程语言(“自上世纪六十年代以来,每周都设计一种”,有人曾对我这样说),有些是在酒后聊天时设计出来的,因此不能认为所有编程语言的每个特性或非特性都是平衡理性思考的结果。