Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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
Java 非解释语言可以有垃圾收集器吗?_Java_Language Agnostic_Garbage Collection_Interpreter - Fatal编程技术网

Java 非解释语言可以有垃圾收集器吗?

Java 非解释语言可以有垃圾收集器吗?,java,language-agnostic,garbage-collection,interpreter,Java,Language Agnostic,Garbage Collection,Interpreter,非解释语言是否可能有垃圾收集器。解释语言让解释器逐行执行程序,因此解释器也可以为运行时提供GC。但是,在代码本身中不构建GC的情况下,是否可以为任何其他语言使用垃圾收集器呢?是的 具有智能指针实现的C++将在智能指针引用计数变为零时进行垃圾收集 你有垃圾收集。您并不是自己构建的。垃圾收集只要求以特殊方式标记指针变量,以便运行时能够识别它们并用于垃圾收集。它与解释/编译无关,而是需要特殊的运行时并为每个变量存储额外的数据。嗯,.NET语言(向IL-C#、VB.NET、MC++等发出的)不进行解释(

非解释语言是否可能有垃圾收集器。解释语言让解释器逐行执行程序,因此解释器也可以为运行时提供GC。但是,在代码本身中不构建GC的情况下,是否可以为任何其他语言使用垃圾收集器呢?

是的

具有智能指针实现的C++将在智能指针引用计数变为零时进行垃圾收集


你有垃圾收集。您并不是自己构建的。

垃圾收集只要求以特殊方式标记指针变量,以便运行时能够识别它们并用于垃圾收集。它与解释/编译无关,而是需要特殊的运行时并为每个变量存储额外的数据。

嗯,.NET语言(向IL-C#、VB.NET、MC++等发出的)不进行解释(特别是在使用NGEN的情况下),并且具有完全的垃圾收集


同样,java .< /p> ObjuleC 2已经有垃圾回收,并且还有C++的垃圾收集库。



我认为这是可能的,只要存在,该语言允许您检查对象,这样您就可以遍历对象树。

新的C++0x包含使垃圾收集实现更容易的功能。例如,参见./P> > P >是——

< P>在编译语言中的实际实现中,在这种情况下,C和/或C++,见BeHM GC在

< Haskell有垃圾收集,不管是编译成本机代码还是解释。< /P>我认为问题是关于跟踪垃圾收集,refcount不是替代品,这不是垃圾收集。连接多个对象,使它们有一个循环,并且它们永远不会被破坏,除非您手动打破循环。@sharptooth:与世界其他人讨论,而不是我:@dmitry vk:关于编写GC的问题,不是关于“跟踪”与“引用计数”的问题作为一种检测未使用指针的技术。@sharptooth--智能指针有其局限性。然而,它们是垃圾收集,并且不是您编写的代码。再说一次,如果你不喜欢这个定义,你必须和很多人讨论。搜索智能指针垃圾收集,你会得到很多点击率。解释良好的语言会给你一个运行时间。至少解释器作为运行时工作并运行垃圾回收器更容易。任何本机语言都会将操作系统作为运行时?因此没有GC?GC和解释是互不相关的。是的,解释语言可能更容易进行垃圾收集,但非解释语言也可以这样做。操作系统通常不支持垃圾收集,但许多语言运行时都支持垃圾收集。即使不以特殊方式标记指针变量,也可以使用所谓的保守GC,将所有内存内容视为潜在指针。请看另一个答案中Boehm的GC。你能解释一下它是如何工作的吗。这就像在你的程序中附加一个GC线程,不是吗?单独的线程与GC无关——Java就是这样做的。大多数C++(和Objto-C)在REF计数到达零的删除时间处理它。ObjuleC 2具有真正的垃圾收集;运行时遍历对象树。启用垃圾回收时,将忽略引用计数。我相信这是事件循环的一部分,但我不确定。我想知道你是否假设“解释”和“本机”之间存在错误的二分法。例如,Java和C#既不是“解释的”,也不是“本机的”——它们(本质上)在VM中运行,而是从IL运行。请您进一步解释一下:?关于这个对话,请参阅我回复中的注释。我相信HotSpot第一次解释(除非它看到循环或类似的东西),但随后将进行JIT编译。在这一点上,它肯定不会被解释。@Marc:我想说,Java源代码永远不会被解释,但Java字节码可能会被解释。在现实生活中,它被简单地解释,然后JIT编译。在.NET中,IL永远不会被解释,但Mono有一个IL解释器。请注意,JavaScript也不总是被解释的——现代JS引擎进行JIT编译。@Jon-为这一澄清干杯(尽管请参见JET/gcj)。事实上,MS.NET也有一个解释器——一个微框架。所以总结一下:Java/C#被编译成字节码/IL。字节码/IL通常(大多数执行时间,大多数环境)是JIT编译的;偶尔会有人解释。但是,将Java和C称为“解释语言”是一个错误,有时是解释语言。但不经常。“Java被解释”这句简单的话是非常误导的。