精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>C、C++语言基础>>关于GP,OO的一场私底下的讨论>>关于GP,OO的一场私底下的讨论6

主题:关于GP,OO的一场私底下的讨论6
发信人: wintereagle()
整理人: wenbobo(2002-11-26 13:56:34), 站内信件
这封信,myan说的很多问题都是一针见血,特别是对gp的本质的讨论让我豁然开壤。

恶魔兄,你好! 
每每以为自己可能会闲下来,但到时候发现还是非常忙。不过我这次一定要 
抽一点时间与你讨论一番。 

首先解决几个小问题。我觉得.NET中的unsafe还不是心目中的GC典范。甚至 
我对于一种程序语言里通过设置两种不同的代码执行模式这种创举,也是持审慎的 
态度。我担心这一点会给软件引来另一种复杂性,当然这需要实践来检验。所谓召 
之即来,挥之即去,我是指必须具备以下两个特征: 

1. 程序员可以在某个时间要求系统回收全部垃圾,然后进行下面的操作。 
2. 程序员可以自己负责资源的回收。而如果属于程序员责任的资源被泄漏,系统 
仍然可以回收。这比较困难,但有的时候我们确实需要控制对象的生存期。跟 
你说的lifecycle有相似之处,但是不同点是,系统GC仍然可以回收这部分内存。 
在一个没有指针的语言里,这也许更容易实现。 

第一点我认为是基本的。 

关于经济学与人类选择行为的关系,虽然我没有研究,但是很愿意更多的了解这 
方面的观点。我个人对于人类选择行为的观点,是比较倾向于非决定论。这还是卡尔 
波普的影响。我觉得不会有任何理论能够全然决定人类的选择行为。更不能依据某种 
理论去预测。特别是对于我们来说,很多问题并不是对于整体趋势难以把握,而是 
一些随机程度很高的事件会对我们每个个人的现实生活有很大的影响。比如,我们都 
认可未来的计算以网络为平台,但知道这一点对你我而言没有更多的意义。而究竟是 
哪家能获胜?这个难以确定的事件却是对我们影响却很大。我的意思是说,历史的总 
体脉络或许是可以把握的,但是这种总体趋势对于生命短暂的个人来说,没什么特别 
切实的意义。相反,一种预测,越是对于普通人有意义,就越具有随机性,越可能错 
误。 
无论你从那个理论出发,道理都仅存在于已经逝去的事实之中。永远不要忽略随机影 
响。 

回到正题。我认为程序设计领域中唯一颠簸不破的真理就是两个字:抽象。而软 
件 
产业所面临的主要敌人是什么呢?我认为不是规模,也不是技术难度,而是对象的变 
化。 
无论是需求变化,还是平台变化,体系变化,给软件生产带来的压力,几乎可以说是 
一 
切问题的根源。如果软件开发所面对的对象是静态的,那么不论多大规模,都不是不 
可 
逾越的问题。软件工程学科从几个方面入手来对付变化,比如从程序开发过程,程序 
员的组织,资源分配等等,这些都是很重要的。而从程序设计、软件设计的发展来 
讲, 
对付这个难题的办法就是抽象。OO建立了一种抽象方式,而Template建立了另一种抽 
象, 
仅从从这个角度上讲,template本身就具有非常重大的意义。GP/STL都只不过是这种 
抽象能力的一种直接展示。 

OO的原始思想是模拟现实世界,每个对象都负有自己的责任,而通过接口与外界 
交互,这就是一种抽象。发展到今天,实际上再回过头去看,这种理念多么清晰!但 
是 
可能现在看来比较天真。的确,世界是由objects构成的,但是却很难完全用objects 
来描述。所以,今天无论你在那里看到一个优秀的面向对象设计,你都会发现很多 
不是object的object,完全不能归结为对于现实世界的描述,已经跟当初的原始动机 
分道扬镳,在一种自我补充和自我完备的方向上发展出又一套难以掌控的方法论。对 
此 
我的观点,就是上次所说,并不是一种责备,而是认为这是一种正常的、必然的变 
化。 
我欢迎这种变化。软件设计本来就是很难的,没有银弹,OO的发展只不过又一次验证 
了这个论点。 

再来看template,GP,首先可以肯定的说,它们不是银弹。但是参数化类型这种 
抽象方式与OO在出发点上是截然不同的。我并不认为这是OO的补充,实际上追溯历史 
渊源,template的父辈是汇编语言和C语言中的宏,远比OO来得早。与宏不同的是, 
template把简单的前处理器文本替换工作转移到编译器中,所带来的一个显而易见 
的好处是,类型检察能力。但是隐藏在这个好处之后的真正要点是,编译器所处的 
位置在编译过程中是跨度很大的,因此它可以收集足够的信息,执行必要的智能计 
算。 
换句话说,不再把编译器当成简单的翻译工具,而把它当成智能的代码产生机。我认 
为 
template和Ada中的generic是真正面对编译器的这一能力而构造的概念系统。所以 
当然它们是最直接的GP表述方式,所以我说是主战场。关于编译期计算,我可以举一 
个 
最简单的例子: 

template <bool> 
struct Static_Assert; 

template <> 
struct Static_Assert<true> {}; 

就是这么一个小小的结构,你可以用它代替Assert,用法如下 
Static_Assert<your expression>(); 

如果表达式true,则什么都不发生,并且系统在运行时不付出任何代价。如果 
表达式为false,则编译期间一定会报错。用这个结构,你不用再去定义甚么 
#ifdef _DEBUG 之类的,也不必付出任何不必要的代价。使用模板,你可以作出 
if...else,while等各种结构。 

我的意思是说,template的概念实质上是对编译器的编程。所以在GP的意义上, 
它的视点最高。 

至于语法复杂性,这的确是个问题。但是目前没有更好解决办法。 

还有很多想说的,但是时间限制,就道这里结束吧。 
我从来不上QQ。 

孟岩 
10月25日 









[关闭][返回]