引用:
作者: fixopen 感觉sjinny的想法很好。其实现在也有这方面的研究。
归根结蒂是我们需要性能。而动态决定(GC)显然比静态决定性能低。当然,动态决定才用的技术跟静态决定才用的技术也有区别。动态决定是蛮力列举,找到垃圾(或者矿石),静态决定却一般依赖于源码分析。
源码分析最有活力也最流行的方式就是在编译器中嵌入的类型系统。Titanium语言所用的类型推理技术分析指针的辖域,能够作出比程序员手工调试程序更好的决定。ML Kit编译器用一个强有力的区域推论算法来代替大部分基于堆栈的内存管理方式的垃圾收集。 |
顶一下。
对呀对呀,静态代码分析才是王道。
让程序员在代码中手工加入delete是丑陋的,因为“什么时候这个对象不需要了”这个信息是代码本身就已经提供了,手工delete是冗余,增加了麻烦和出错机会。比如:
代码:
{
Foo foo = new Foo();
foo.doSomething();
} // 行3
这个代码本身就已经提供信息说:“foo在行3的时候就不需要了”,其实,如果编译器足够聪明,此处完全可以在栈上分配foo。额外再加上一个delete只是因为编译器或者运行时系统的无能罢了。
现在的gc是在运行时鼓捣,如果能让编译器在静态就把这些信息整理分析出来,然后在运行时以最优化的方式来处理垃圾,就是最理想的了。(不一定就是马上delete,内存释放操作很昂贵的说。也可能是在某个地方做一个标记,然后等待合适的时机统一清理)
当然,前提是:
1。语言一定要给编译器留出这个自由,不能让程序对编译器或者运行时的各种可能清理策略敏感。比如c++这种指针随便用就比较难,一旦某个对象给优化到栈上,程序崩溃了怎么办?
2。不能把资源生存期和内存管理混为一谈。资源管理需要确定性,一个数据库连接要在什么时候关闭,一个导弹要在什么时候发射,一点也含糊不得;而内存则不然,应该让编译器和运行时自由选择最优的清理策略。