ano*_*ous 3 c c# c++ java garbage-collection
没有垃圾收集器的其他语言背后的原因是什么?
为什么这些其他语言没有内置垃圾收集?为什么程序员有责任收集?
Nor*_*sey 20
没有垃圾收集的原因:
真正有效的收藏家直到1985年至1990年左右才开发出来.在此之前设计的语言,如果效率是目标,则没有垃圾收集.例子:Ada,C,Fortran,Modula-2,Pascal.
Bjarne Stroustrup认为,更好的语言设计可以使每项费用明确,并且"不为你不使用的功能付费".(参见他在第二届和第三届ACM会议上关于编程语言历史的论文.)因此,C++没有垃圾收集.
一些研究语言使用其他想法(区域,花式类型系统)来明确但安全地管理内存.这些想法特别适用于设备驱动程序,您可能无法负担分配的问题,或实时系统,其中内存成本必须是非常可预测的.
"其他语言"做 - 这个问题被标记C#
,.NET CLR绝对会执行自动垃圾收集.
我可以想到C++没有它的几个原因:
C++中的所有现有代码都使用显式内存管理,因此实现垃圾收集将是一个重大变化;
出于同样的原因.C++程序员已经习惯于显式内存管理,因此垃圾收集并不是一个重要的功能;
好的垃圾收集算法是相当新的,而C++在它们之前就已经过了很多.垃圾收集是一种水平功能,语言设计者必须对规范进行重大(和复杂)更改.简而言之,将垃圾收集器连接到现有语言比从一开始就将其设计为语言更困难,就像使用.NET和Java一样.
Java在虚拟机中运行,.NET使用类似的东西,而C++处理本机代码.在前一种情况下,GC更容易推理.
C++通常用于需要在严格的内存要求(即嵌入式系统)下运行的应用程序,在这些情况下,显式内存管理是必需的.我想某种"选择加入"GC可以解决这个问题,但语言设计者更难以正确实施.
硬件有没有垃圾收集器(也就是一些硬件其中有转发的指针,在一些垃圾收集器的建设有用的一个功能一些基本的支持,但是这远不是一个"GC硬件").相应地,装配没有GC.汇编是一种"编程语言"(尽管是最接近裸机的一种),所以他们就是这样:在广泛的现有编程语言中,有些人不会使用GC.
碰巧有效的 GC并不容易实现.很好的算法已经很长时间了.更重要的是,大多数优秀的GC算法都很好,因为它们执行一些复杂的操作,例如在RAM中移动数据元素; 这对于"实时GC"来说是必要的,它可以保证分配所花费的最长时间(当存在碎片时,您无法获得这样的保证,并且如果不在RAM中移动对象,则无法避免碎片).移动对象时,必须自动调整指向该对象的所有指针,这只有在编程语言提供强大的,不可避免的类型时才能完成.例如,使用C或C++无法做到这一点.在C中,打印出编码指针值的字节是合法的,然后让用户键入它们.GC移动对象时无法改变用户的大脑......
所以在实践中,没有强类型的语言是无GC的.这包括C,C++,Forth,各种汇编扩展语言......这并不妨碍某些人为这些语言编写GC实现,例如Hans Boehm用于C和C++的GC.但是,就语言标准而言,它确实意味着GC可能会失败(名义上"合法"的(奇怪的)程序.
还有一些类型很强但没有GC的语言,或者是因为他们的设计师不相信它,或者认为他们可以在没有它们的情况下做得更好,或者从额外的代码大小中畏缩(例如,Javacard,智能卡的Java,是GC)因为在一个具有8 kB代码和512字节RAM的环境中安装GC 并不容易).
最后,在设计的数千种编程语言中("自六十年代以来每周一次",我曾被告知),有些是由于酒精过多导致的深夜对话,所以不能假设所有编程语言的每个特征或非特征都是平衡理性思考的结果.
归档时间: |
|
查看次数: |
2144 次 |
最近记录: |