在运行时不包含垃圾收集器的情况下,垃圾收集语言能否编译为非垃圾收集语言?
Can a garbage collected language compile to a non-garbage collected one without including a garbage collector in the runtime?
据我了解,当一种托管语言(如 Haxe)可以并且想要编译成一种非托管语言(如 C++)时,它会在运行时包含某种形式的垃圾收集器。
我想知道是否有可能在中间表示/抽象语法树中完全抽象出内存管理,这样就不需要垃圾收集器和默认行为(堆栈分配一直持续到范围结束和堆分配在释放之前一直有效)可以使用吗?
谢谢!
如果我没理解错的话,你问的是是否有可能采用垃圾收集语言并将其编译为非垃圾收集语言的等效程序,而不会引入内存错误或泄漏,只需添加 free
s 在正确的位置(即没有引用计数或以其他方式跟踪引用或以任何方式实施垃圾收集算法或在 运行 时间做任何其他可以被视为垃圾收集的事情)。
不,那是不可能的。要执行这样的操作,您必须能够静态地回答问题 "What's the point in the program, after which a given object is no longer referenced",这是一个非常重要的语义 属性,因此根据莱斯定理是不可判定的。
您可以定义一个充分受限的语言子集(类似于 "only one live variable may hold a strong reference to an object at a time and anything else must use weak references"),但在该子集中进行编程与使用原始语言进行编程有很大不同¹,因此没有太大意义在这样做。
¹ 也许更重要的是:现有代码极不可能符合该子集。因此,如果有一个编译器可以将我的代码编译为高效的 GC-free 本机代码,但前提是我完全重写我的代码以适应该语言的一个尴尬子集,为什么我不直接用 Rust 重写项目反而?特别是因为与未写入子集中的库的互操作也可能不可行。
据我了解,当一种托管语言(如 Haxe)可以并且想要编译成一种非托管语言(如 C++)时,它会在运行时包含某种形式的垃圾收集器。
我想知道是否有可能在中间表示/抽象语法树中完全抽象出内存管理,这样就不需要垃圾收集器和默认行为(堆栈分配一直持续到范围结束和堆分配在释放之前一直有效)可以使用吗?
谢谢!
如果我没理解错的话,你问的是是否有可能采用垃圾收集语言并将其编译为非垃圾收集语言的等效程序,而不会引入内存错误或泄漏,只需添加 free
s 在正确的位置(即没有引用计数或以其他方式跟踪引用或以任何方式实施垃圾收集算法或在 运行 时间做任何其他可以被视为垃圾收集的事情)。
不,那是不可能的。要执行这样的操作,您必须能够静态地回答问题 "What's the point in the program, after which a given object is no longer referenced",这是一个非常重要的语义 属性,因此根据莱斯定理是不可判定的。
您可以定义一个充分受限的语言子集(类似于 "only one live variable may hold a strong reference to an object at a time and anything else must use weak references"),但在该子集中进行编程与使用原始语言进行编程有很大不同¹,因此没有太大意义在这样做。
¹ 也许更重要的是:现有代码极不可能符合该子集。因此,如果有一个编译器可以将我的代码编译为高效的 GC-free 本机代码,但前提是我完全重写我的代码以适应该语言的一个尴尬子集,为什么我不直接用 Rust 重写项目反而?特别是因为与未写入子集中的库的互操作也可能不可行。