7
为什么在垃圾收集语言中普遍缺少对象析构函数范式?
寻找有关垃圾收集语言设计决策的见解。也许语言专家可以启发我?我来自C ++背景,所以这个领域令我感到困惑。 似乎几乎所有具有OOPy对象支持的现代垃圾收集语言(如Ruby,Javascript / ES6 / ES7,Actionscript,Lua等)都完全省略了析构函数/定型化范例。Python似乎是唯一使用它的class __del__()方法。为什么是这样?在具有自动垃圾收集的语言中,语言是否存在功能/理论上的限制,从而无法在对象上有效实现析构函数/完成方法? 我发现非常缺乏这些语言将内存视为唯一值得管理的资源。套接字,文件句柄,应用程序状态如何?由于无法实现自定义逻辑以清除对象最终确定中的非内存资源和状态,因此我需要使用自定义myObject.destroy()样式调用来填充我的应用程序,将清除逻辑置于“类”之外,破坏尝试的封装,并降级我的应用程序由于人为错误而导致资源泄漏,而不是由gc自动处理。 什么是语言设计决策,这些决策导致这些语言无法对对象处理执行任何自定义逻辑?我必须想象有一个很好的理由。我想更好地理解导致这些语言不支持对象销毁/完成的技术和理论决策。 更新: 也许更好的方式表达我的问题: 为什么一种语言会具有带有类或类结构以及自定义实例化(构造函数)的对象实例的内置概念,却完全省略了销毁/最终确定功能?提供自动垃圾收集的语言似乎是支持对象销毁/完成的主要候选方法,因为他们知道当不再使用某个对象时会100%确定。但是,其中大多数语言都不支持它。 我认为在这种情况下可能永远不会调用析构函数,因为那将是核心内存泄漏,gcs旨在避免这种情况。我可以看到一个可能的论点是,直到将来某个不确定的时间,析构函数/ finalizer才会被调用,但这并没有阻止Java或Python支持该功能。 不支持任何形式的对象完成的核心语言设计原因是什么?