Memory 在运行时不包含垃圾收集器的情况下,垃圾收集语言能否编译为非垃圾收集语言?

Memory 在运行时不包含垃圾收集器的情况下,垃圾收集语言能否编译为非垃圾收集语言?,memory,compiler-construction,garbage-collection,Memory,Compiler Construction,Garbage Collection,据我所知,当托管语言(如Haxe)能够并且想要编译为非托管语言(如C++)时,它在运行时包含某种形式的垃圾收集器 我想知道是否有可能在中间表示/抽象语法树中完全抽象掉内存管理,这样就不需要垃圾收集器,并且可以使用默认行为(堆栈分配一直有效到作用域结束,堆分配一直有效到释放) 谢谢大家! 如果我理解正确,您是在问,是否可以使用垃圾收集语言并将其编译为非垃圾收集语言中的等效程序,而不引入内存错误或泄漏,只需在正确的位置添加frees即可(即,不进行引用计数或以其他方式跟踪引用,或以任何方式实现垃圾收

据我所知,当托管语言(如Haxe)能够并且想要编译为非托管语言(如C++)时,它在运行时包含某种形式的垃圾收集器

我想知道是否有可能在中间表示/抽象语法树中完全抽象掉内存管理,这样就不需要垃圾收集器,并且可以使用默认行为(堆栈分配一直有效到作用域结束,堆分配一直有效到释放)


谢谢大家!

如果我理解正确,您是在问,是否可以使用垃圾收集语言并将其编译为非垃圾收集语言中的等效程序,而不引入内存错误或泄漏,只需在正确的位置添加
free
s即可(即,不进行引用计数或以其他方式跟踪引用,或以任何方式实现垃圾收集算法,或在运行时执行任何其他可视为垃圾收集的操作)

不,这是不可能的。要做到这一点,你必须能够静态地回答“程序中的点是什么,在这个点之后给定的对象不再被引用”,这是一个非平凡的语义属性,因此根据Rice定理是不可判定的

您可以定义一个受充分限制的语言子集(比如“一次只有一个活动变量可以包含对对象的强引用,其他任何变量都必须使用弱引用”),但该子集中的编程将与原始语言中的编程大不相同,因此这样做没有多大意义



也许更重要的是:现有代码不太可能符合该子集。因此,如果有一个编译器可以将我的代码编译成高效的无GC本机代码,但只有在我完全重新编写代码以适应该语言的一个笨拙子集的情况下,我为什么不改用Rust重新编写该项目呢?尤其是因为与不在子集中编写的库进行互操作可能也不可行。

有点像
rust
所做的事情?如果我理解正确,在被什么释放之前生存?你的问题在术语上体现了矛盾。我指的是程序员手动释放,比如调用free()在C中@Eugene我对Rust不太熟悉,但经过一点研究,我认为它在编译时在代码中插入语句,以便在不再使用时释放内存。这就是你的意思吗?@Eugene据我所知,Rust有引用计数指针。弱引用不适当地强制执行所有权也会导致对于那些仍然认为生命周期总是可以预测的人,他们可能会尝试预测
var l=new ArrayList(Collections.nCopies(10,new Object());For(var r=new Random(System.currentTimeMillis());r.nextInt(100)!=0;)l.set(r.nextInt(l.size()),r.nextBoolean()?new Object():l.get(r.nextInt(l.size()));
,它创建了多少个对象,以及在代码结束时哪些对象是可回收的(甚至不是多线程的)…