| ||||
| 如果说寄存器的使用是非常贴近实现层面的,那么各种控制变量就相对贴近设计层面了。当我在某个花括号外时,我可以肯定这对括号内的东西不会对我有任何影响,并且我也不需要去关心里面的东西,如果没了这个花括号,那么我需要阅读更多的代码才能推测出这些信息。 我一直没对确定性定过概念,如果要定概念,那就是:程序员对所采用的技术的运行情况的了解程度(及了解的难易程度),这就是确定性。 虽然我们无法改变栈的行为,但是我们能够很容易的了解及预测栈的行为,并且栈的行为在代码里是显式表达的(用花括号对)。 确定性带来的好处,首先是我们能够比较容易的理解自己所写出的程序,而这又是程序的维护和复用的前提。并不是说gc完全无法使用,但是如果能用栈的情况下仍然使用gc,那么用花括号所表达的那些信息就丢失了,这对于以后的开发是不利的。 恩,我承认现在我的很对想法都很主观,所以才要来讨论嘛~ ^_^ 但是在我看到其他人的文章或者帖子后,我才有了之前的种种想法。 很主观的说,不确定性对我来说就是个很有说服力的理由,如果我不知道我的工具的行为,我自然不敢用它,更何况它并没有人类的智慧。 至于编译器的优化,首先如果开启很高程度的优化,那么程序必须经过严密的测试才能确定这个优化不会带来负面影响,这是我在一些关于LSF的文章里看到的,所以现在的编译器优化还不能让人高枕无忧。另一方面,乱序执行对于多线程程序的开发的确会产生负面影响。 |
| |||
| 如果只是说对象的生存期是否确定的话,和gc完全扯不上关系。 我的C#里面一大堆using生存期都很确定的,对于那些string之流他爱活多久我也管不着。 要解放思想~~ 引用:
此帖于 2008-03-04 03:49 PM 被 cat 编辑. |
| |||
| 引用:
|
| ||||
| 手边没有典型的例子。我这么说吧: 在C里,花括号是对生命期的一种表达符号,无论是函数的,还是if、for的,或者单独的花括号对,它们都表达了一种嵌套的生命期。 一个极端的例子:一个函数里的内部变量是不会泄露到外面的,所以使用这个函数时要关注的仅仅是它的接口。但是如果没有用花括号来说明那些内部变量的生命期,那么意味着它们是可能泄漏到函数外的。虽然在外界操纵函数的内部变量是不好的,但是在没有明确限制的情况下,一个设计不好的接口很可能就会把内部变量泄漏出去,特别是类的成员函数,这就破坏了封装性。而函数内部的花括号对,其实也是类似于函数的微观模块。 想了半天没想出什么例子,毕竟还没看过一点显式生命期控制/描述都没有的语言…… 我那段话的意思只是说:应该赋予程序员尽量强大的表达工具,机器分析只是起弥补的作用。如果不要求程序员给出丰富的描述信息,然后再让程序来猜,那就不好了。 各种自动化技术是在帮助程序员,但是如果开始替代程序员,那就走向反面了。一直到现在,语言里仍然保留了goto。一直到现在C++也仍然保留了内嵌汇编的能力。 |
| ||||
| 突然想起来,C++里,程序员可以在函数接口上描述可能抛出的异常,也可以完全不描述。 如果一个函数明确的用throw()表示自己不会抛出异常,那么当以后要维护这个函数时,就能明白以前的使用很可能是基于“它不会抛出异常”这个假设的,那么现在的修改就要维持这一约束。可是如果不把这个信息用throw()描述出来,那么虽然一开始编译的时候编译器能够分析出来这个函数不会抛出异常,但是编译器不可能知道,这到底只是一个偶然的事实结果,还是程序员刻意的设计。前者意味着以后的修改可以使它抛出异常,而如果是后者,那么意味着以后的修改是不能让它抛出异常的。自动化分析只能知道这个函数现在是否会抛出异常,但是不知道它以后是否也应该维持这种状态。这时如果程序员不加以描述,那么以后维护时就可能会引入bug。 总体的意思就是说,有些东西,编译器只能分析出当前的状态,但是分析不出,在人脑的设计之中程序应该是怎样的;自动分析程序无法区分一个结果是偶然的结果,还是应该一直维持的约束。如果不加以描述,一段时间之后,人也难以分析清楚。 所以在程序中,给予程序员以丰富的表达手段,把设计信息在代码中表达出来,这比过度依赖自动化分析更好。 虽然不是针对栈的,但是大致能表达我的意思了。汗。 |
| |||
| 引用:
代码:
|
| |||
| 1。谁也没保证过i和j就一定会在栈上分配。编译器完全可以把它们放在寄存器里。 2。谁也没保证过i和j肯定占用各自独立的寄存器或者栈空间,编译器完全可以经过分析发现j使用的时候i已经用不着了,所以干脆节省了一个寄存器/栈空间和一次赋值操作。 3。甚至没有保证会分配任何寄存器/栈空间,编译器完全可以直接把常量1编进机器码,就根本不会出现所谓“局部变量”。 4。所有这些都跟程序员没关系,你关心的就是cout能打印出来那个值。其它的什么“意图”什么的扯不上。 此帖于 2008-03-06 12:35 AM 被 ajoo 编辑. |
| ||||
| 引用:
引用:
|
| |||
| 引用:
代码:
代码:
|