﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-小海豚-随笔分类-收集</title><link>http://www.cppblog.com/susu/category/1519.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 23 May 2008 02:55:06 GMT</lastBuildDate><pubDate>Fri, 23 May 2008 02:55:06 GMT</pubDate><ttl>60</ttl><item><title>[转]多层架构 简述</title><link>http://www.cppblog.com/susu/archive/2008/04/17/47410.html</link><dc:creator>学习才能进步</dc:creator><author>学习才能进步</author><pubDate>Thu, 17 Apr 2008 09:13:00 GMT</pubDate><guid>http://www.cppblog.com/susu/archive/2008/04/17/47410.html</guid><wfw:comment>http://www.cppblog.com/susu/comments/47410.html</wfw:comment><comments>http://www.cppblog.com/susu/archive/2008/04/17/47410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/susu/comments/commentRss/47410.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/susu/services/trackbacks/47410.html</trackback:ping><description><![CDATA[使用多层架构进行系统开发是现今系统设计的流行趋势。通过分解业务细节，将不同的功能代码分散开来，更利于系统的设计和开发，同时为可能的变更提供了更小的单元。<br><br>以下就是一个典型的多层体系结构图。<br><br>
<div style="OVERFLOW-X: auto; WIDTH: 100%"><a href="http://www.rainsts.net/uploads/200607/24_142206_mt.png" target=_blank><img alt=uploads/200607/24_142206_mt.png src="http://www.rainsts.net/uploads/200607/24_142206_mt.png"></a></div>
<br><br>首先我们以&#8220;订单(Order)&#8221;为例，进行一个简单的业务分解。<br><br>1. 订单自然包括订单的内容(OrderInfo)，其中有诸如订单编号、商品名称、数量，以及金额等信息。<br>2. 有了订单信息，我们还需要一个存储订单的场所，那么自然需要有个操作读写的对象(OrderAccess)。<br>3. 为了外界能进行相关的订单操作，我们还需要有个业务逻辑对象(Order)，它提供创建新订单，向订单插入/删除商品，保存订单等操作。<br><br>通过上面的分析，我们基本上可以将一个业务逻辑完整地分割为：<br><br>业务实体 ---&gt; OrderInfo<br>数据访问 ---&gt; OrderAccess<br>业务逻辑 ---&gt; Order<br><br>基于系统架构考虑，我们将这些对象分别放置在不同的逻辑单元中，这些逻辑单元就组成了&#8220;多层&#8221;。<br><br>业务实体层(Model) ---&gt; 业务实体 ---&gt; OrderInfo<br>数据访问层(DAL) ---&gt; 数据访问 ---&gt; OrderAccess<br>业务逻辑层(BLL) ---&gt; 业务逻辑 ---&gt; Order<br><br>同样以上面订单为例，我们进一步讲述各层对象的实现细节。<br><br>1. 客户基本上只依赖于 Order 和 OrderInfo，通过他们就可以操作业务的全部，它并不关心业务存储等细节。<br><br>2. 大多数时候我们会将 OrderAccess 设计成 Internal Protected 方式，OrderAccess 可以是一个抽象类或者接口。我更习惯于将其实现为抽象类，因为某些方法是调用其他方法来实现的，抽象类的设计可以减少实现类的代码数量。另外将该抽象类设计成工厂方法模式，通过 IoC 或者 "配置反射" 来获得具体的实现类，可以减少层之间的耦合，也便于数据系统的替换。<br><br>3. Order 多数时候可以实现为 Singleton 或者静态类，它只是提供了一系列的方法来操作某些逻辑，通过接受 OrderInfo 参数来获取信息。其本身无需保存任何状态。如果需要实现购物车，只需将 OrderInfo 存储到 Session 之中即可。<br><br>通过上面的例子，我们还可以发现多层的另外一个好处就是更利于团队协作开发。架构设计人员无需考虑具体的数据库实现代码，而将设计重点放在业务层面；数据库开发人员自然也可将重心放在数据库访问优化上。团队成员之间不再是一人负责一个业务模块，不再有了 n 个数据访问类，不再有 n 种不同的对象模式等等。从传统的 "瓦罐作坊" 演变为 "工业流水线"，更利于根据技术能力和业务熟悉度的差别来划分不同的角色。<br>
<img src ="http://www.cppblog.com/susu/aggbug/47410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/susu/" target="_blank">学习才能进步</a> 2008-04-17 17:13 <a href="http://www.cppblog.com/susu/archive/2008/04/17/47410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]多层架构 简述</title><link>http://www.cppblog.com/susu/archive/2008/04/17/47411.html</link><dc:creator>学习才能进步</dc:creator><author>学习才能进步</author><pubDate>Thu, 17 Apr 2008 09:13:00 GMT</pubDate><guid>http://www.cppblog.com/susu/archive/2008/04/17/47411.html</guid><wfw:comment>http://www.cppblog.com/susu/comments/47411.html</wfw:comment><comments>http://www.cppblog.com/susu/archive/2008/04/17/47411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/susu/comments/commentRss/47411.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/susu/services/trackbacks/47411.html</trackback:ping><description><![CDATA[使用多层架构进行系统开发是现今系统设计的流行趋势。通过分解业务细节，将不同的功能代码分散开来，更利于系统的设计和开发，同时为可能的变更提供了更小的单元。<br><br>以下就是一个典型的多层体系结构图。<br><br>
<div style="OVERFLOW-X: auto; WIDTH: 100%"><a href="http://www.rainsts.net/uploads/200607/24_142206_mt.png" target=_blank><img alt=uploads/200607/24_142206_mt.png src="http://www.rainsts.net/uploads/200607/24_142206_mt.png"></a></div>
<br><br>首先我们以&#8220;订单(Order)&#8221;为例，进行一个简单的业务分解。<br><br>1. 订单自然包括订单的内容(OrderInfo)，其中有诸如订单编号、商品名称、数量，以及金额等信息。<br>2. 有了订单信息，我们还需要一个存储订单的场所，那么自然需要有个操作读写的对象(OrderAccess)。<br>3. 为了外界能进行相关的订单操作，我们还需要有个业务逻辑对象(Order)，它提供创建新订单，向订单插入/删除商品，保存订单等操作。<br><br>通过上面的分析，我们基本上可以将一个业务逻辑完整地分割为：<br><br>业务实体 ---&gt; OrderInfo<br>数据访问 ---&gt; OrderAccess<br>业务逻辑 ---&gt; Order<br><br>基于系统架构考虑，我们将这些对象分别放置在不同的逻辑单元中，这些逻辑单元就组成了&#8220;多层&#8221;。<br><br>业务实体层(Model) ---&gt; 业务实体 ---&gt; OrderInfo<br>数据访问层(DAL) ---&gt; 数据访问 ---&gt; OrderAccess<br>业务逻辑层(BLL) ---&gt; 业务逻辑 ---&gt; Order<br><br>同样以上面订单为例，我们进一步讲述各层对象的实现细节。<br><br>1. 客户基本上只依赖于 Order 和 OrderInfo，通过他们就可以操作业务的全部，它并不关心业务存储等细节。<br><br>2. 大多数时候我们会将 OrderAccess 设计成 Internal Protected 方式，OrderAccess 可以是一个抽象类或者接口。我更习惯于将其实现为抽象类，因为某些方法是调用其他方法来实现的，抽象类的设计可以减少实现类的代码数量。另外将该抽象类设计成工厂方法模式，通过 IoC 或者 "配置反射" 来获得具体的实现类，可以减少层之间的耦合，也便于数据系统的替换。<br><br>3. Order 多数时候可以实现为 Singleton 或者静态类，它只是提供了一系列的方法来操作某些逻辑，通过接受 OrderInfo 参数来获取信息。其本身无需保存任何状态。如果需要实现购物车，只需将 OrderInfo 存储到 Session 之中即可。<br><br>通过上面的例子，我们还可以发现多层的另外一个好处就是更利于团队协作开发。架构设计人员无需考虑具体的数据库实现代码，而将设计重点放在业务层面；数据库开发人员自然也可将重心放在数据库访问优化上。团队成员之间不再是一人负责一个业务模块，不再有了 n 个数据访问类，不再有 n 种不同的对象模式等等。从传统的 "瓦罐作坊" 演变为 "工业流水线"，更利于根据技术能力和业务熟悉度的差别来划分不同的角色。<br>
<img src ="http://www.cppblog.com/susu/aggbug/47411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/susu/" target="_blank">学习才能进步</a> 2008-04-17 17:13 <a href="http://www.cppblog.com/susu/archive/2008/04/17/47411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP协议的信息交换过程</title><link>http://www.cppblog.com/susu/archive/2007/04/09/21542.html</link><dc:creator>学习才能进步</dc:creator><author>学习才能进步</author><pubDate>Mon, 09 Apr 2007 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/susu/archive/2007/04/09/21542.html</guid><wfw:comment>http://www.cppblog.com/susu/comments/21542.html</wfw:comment><comments>http://www.cppblog.com/susu/archive/2007/04/09/21542.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/susu/comments/commentRss/21542.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/susu/services/trackbacks/21542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，简单介绍基于HTTP协议的客户/服务器模式的信息交换过程，如图2-4所示，它分四个过程，建立连接、发送请求信息、发送响应信息、关闭连接。<br>图2-4
<p>&#160;</p>
<p align=center><img src="file:///C:/Documents%20and%20Settings/new/桌面/HTTP协议的运作方式--.files/2214189231.gif" border=0></p>
<p><br>　　在WWW中，&#8220;客户&#8221;与&#8220;服务器&#8221;是一个相对的概念，只存在于一个特定的连接期间，即在某个连接中的客户在另一个连接中可能作为服务器。WWW服务器运行时，一直在TCP80端口(WWW的缺省端口)监听，等待连接的出现。<br>　　下面，讨论HTTP协议下客户/服务器模式中信息交换的实现。　　1.建立连接　　连接的建立是通过申请套接字(Socket)实现的。客户打开一个套接字并把它约束在一个端口上，如果成功，就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。<br>　　2.发送请求<br>　　打开一个连接后，客户机把请求消息送到服务器的停留端口上，完成提出请求动作。<br>　　HTTP/1.0　　请求消息的格式为：<br>　　请求消息=请求行(通用信息|请求头|实体头)CRLF[实体内容]<br>　　请求　行=方法　请求URL　HTTP版本号　CRLF<br>　　方　　法=GET|HEAD|POST|扩展方法<br>　　U　R　L=协议名称+宿主名+目录与文件名<br>　　请求行中的方法描述指定资源中应该执行的动作，常用的方法有GET、HEAD和POST。不同的请求对象对应GET的结果是不同的，对应关系如下：<br>　　对象　　　　　　GET的结果<br>　　文件　　　　　　文件的内容<br>　　程序　　　　　　该程序的执行结果<br>　　数据库查询　　　查询结果<br>　　HEAD——要求服务器查找某对象的元信息，而不是对象本身。<br>　　POST——从客户机向服务器传送数据，在要求服务器和CGI做进一步处理时会用到POST方法。POST主要用于发送HTML文本中FORM的内容，让CGI程序处理。<br>　　一个请求的例子为：<br>　　GEThttp://networking.zju.edu.cn/zju/index.htmHTTP/1.0<br>　　头信息又称为元信息，即信息的信息，利用元信息可以实现有条件的请求或应答。<br>　　请求头——告诉服务器怎样解释本次请求，主要包括用户可以接受的数据类型、压缩方法和语言等。<br>　　实体头——实体信息类型、长度、压缩方法、最后一次修改时间、数据有效期等。<br>　　实体——请求或应答对象本身。<br>　　3.发送响应<br>　　服务器在处理完客户的请求之后，要向客户机发送响应消息。<br>　　HTTP/1.0的响应消息格式如下：<br>　　响应消息=状态行(通用信息头|响应头|实体头)　CRLF　〔实体内容〕<br>　　状态行=HTTP版本号　状态码　原因叙述<br>　　状态码表示响应类型<br>　　1&#215;&#215;　　保留<br>　　2&#215;&#215;　　表示请求成功地接收<br>　　3&#215;&#215;　　为完成请求客户需进一步细化请求<br>　　4&#215;&#215;　　客户错误<br>　　5&#215;&#215;　　服务器错误<br>　　响应头的信息包括：服务程序名，通知客户请求的URL需要认证，请求的资源何时能使用。<br>　　4.关闭连接<br>　　客户和服务器双方都可以通过关闭套接字来结束TCP/IP对话<br></p>
<p align=center><img src="file:///C:/Documents%20and%20Settings/new/桌面/HTTP协议的运作方式--.files/2214177174.gif" border=0></p>
<p align=center><img src="file:///C:/Documents%20and%20Settings/new/桌面/HTTP协议的运作方式--.files/2141735975.gif" border=0></p>
<p align=center><img src="file:///C:/Documents%20and%20Settings/new/桌面/HTTP协议的运作方式--.files/2141754971.gif" border=0></p>
<p align=center><img src="file:///C:/Documents%20and%20Settings/new/桌面/HTTP协议的运作方式--.files/2214189231.gif" border=0></p>
</font>
<img src ="http://www.cppblog.com/susu/aggbug/21542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/susu/" target="_blank">学习才能进步</a> 2007-04-09 16:57 <a href="http://www.cppblog.com/susu/archive/2007/04/09/21542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树问题</title><link>http://www.cppblog.com/susu/archive/2007/04/09/21541.html</link><dc:creator>学习才能进步</dc:creator><author>学习才能进步</author><pubDate>Mon, 09 Apr 2007 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/susu/archive/2007/04/09/21541.html</guid><wfw:comment>http://www.cppblog.com/susu/comments/21541.html</wfw:comment><comments>http://www.cppblog.com/susu/archive/2007/04/09/21541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/susu/comments/commentRss/21541.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/susu/services/trackbacks/21541.html</trackback:ping><description><![CDATA[二叉树是一种非线性的数据结构，在对它进行操作时，总是需要逐一对每个数据元素实施
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 操作，这样就存在一个操作顺序问题，由此提出了二叉树的遍历操作。所谓遍历二叉树就&nbsp;&nbsp;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 是按某种顺序访问二叉树中的每个结点一次且仅一次的过程。这里的访问可以是输出、比 </p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 较、更新、查看元素内容等等各种操作。<br></p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 二叉树的遍历方式分为两大类：一类按根、左子树和右子树三个部分进行访问；另一类按</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 层次访问。下面我们将分别进行讨论。</p>
<p align=left><br>&nbsp;&nbsp;&nbsp;&nbsp;<strong>1、 按根、左子树和右子树三部分进行遍历 </strong></p>
<p align=left>遍历二叉树的顺序存在下面6种可能：</p>
<p align=left>&nbsp;&nbsp;&nbsp; TLR（根左右）, TRL（根右左）</p>
<p align=left>&nbsp;&nbsp;&nbsp; LTR（左根右）, RTL（右根左）</p>
<p align=left>&nbsp;&nbsp;&nbsp; LRT（左右根）, RLT（右左根）</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 其中，TRL、RTL和RLT三种顺序在左右子树之间均是先右子树后左子树，这与人们先左后右</p>
<p align=left>的习惯不同，因此，往往不予采用。余下的三种顺序TLR、LTR和LRT根据根访问的位置不同分别</p>
<p align=left>被称为先序遍历、中序遍历和后序遍历。</p>
<p align=left>（1）先序遍历</p>
<p align=left>若二叉树为空，则结束遍历操作；否则</p>
<p align=left>访问根结点；</p>
<p align=left>先序遍历左子树；</p>
<p align=left>先序遍历右子树。</p>
<p align=left>（2）中序遍历若二叉树为空，则结束遍历操作；否则</p>
<p align=left>中序遍历左子树；</p>
<p align=left>访问根结点；</p>
<p align=left>中序遍历右子树。</p>
<p align=left>（3）后序遍历</p>
<p align=left>若二叉树为空，则结束遍历操作；否则</p>
<p align=left>后序遍历左子树；</p>
<p align=left>后序遍历右子树；</p>
<p align=left>访问根结点。</p>
<p align=left>例如。以下是一棵二叉树及其经过三种遍历所得到的相应遍历序列</p>
<p align=left><img height=126 src="http://210.44.195.20/data/ja/48.jpg" width=449></p>
<p align=left>二叉树的两种遍历方法：</p>
<p align=left>（1）对一棵二叉树中序遍历时，若我们将二叉树严格地按左子树的所有结点位于根结点的左</p>
<p align=left>侧，右子树的所有结点位于根右侧的形式绘制，就可以对每个结点做一条垂线，映射到下面的</p>
<p align=left>水平线上，由此得到的顺序就是该二叉树的中序遍历序列<br><img height=173 src="http://210.44.195.20/data/ja/49.jpg" width=267></p>
<p align=left>（2）任何一棵二叉树都可以将它的外部轮廓用一条线绘制出来，我们将它称为二叉树的包线，</p>
<p align=left>这条包线对于理解二叉树的遍历过程很有用。</p>
<p align=left><img height=162 src="http://210.44.195.20/data/ja/50.jpg" width=239></p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 由此可以看出：（1）遍历操作实际上是将非线性结构线性化的过程，其结果为线性序列，</p>
<p align=left>并根据采用的遍历顺序分别称为先序序列、中序序列或后序序列；（2）遍历操作是一个递归的</p>
<p align=left>过程，因此，这三种遍历操作的算法可以用递归函数实现。</p>
<p align=left>（1）先序遍历递归算法<br>void PreOrder(BTree BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (BT) { Visit(BT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreOrder(BT-&gt;Lchild);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreOrder(BT-&gt;Rchild); <br>}</p>
<p align=left>（2）中序遍历递归算法<br>void InOrder(BTree BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InOrder(BT-&gt;Lchild);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Visit(BT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InOrder(BT-&gt;Rchild);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p align=left>（3）后序遍历递归算法<br>void PostOrder(BTree BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp; if (BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostOrder(BT-&gt;Lchild);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostOrder(BT-&gt;Rchild);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Visit(BT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p align=left><strong>&nbsp;&nbsp; 2 、按层次遍历二叉树</strong></p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 实现方法为从上层到下层，每层中从左侧到右侧依次访问每个结点。下面我们将给出一棵</p>
<p align=left>二叉树及其按层次顺序访问其中每个结点的遍历序列。<br><img height=415 src="http://210.44.195.20/data/ja/51.jpg" width=457></p>
<p align=left>void LevelOreder(QBTree BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp; for (i=1;i&lt;=BT.n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; if (BT.elem[i]!='#') Visite(BT.elem[i]);<br>}</p>
<p align=left>二叉树用链式存储结构表示时，按层遍历的算法实现</p>
<p align=left>访问过程描述如下：</p>
<p align=left>访问根结点，并将该结点记录下来；</p>
<p align=left>若记录的所有结点都已处理完毕，则结束遍历操作；否则重复下列操作。</p>
<p align=left>取出记录中第一个还没有访问孩子的结点，若它有左孩子，则访问左孩子，并将记录下来；</p>
<p align=left>若它有右孩子，则访问右孩子，并记录下来。</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 在这个算法中，应使用一个队列结构完成这项操作。所谓记录访问结点就是入队操作；</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; 而取出记录的结点就是出队操作。这样一来，我们的算法就可以描述成下列形式：</p>
<p align=left>（1）访问根结点，并将根结点入队；</p>
<p align=left>（2）当队列不空时，重复下列操作：</p>
<p align=left>从队列退出一个结点；</p>
<p align=left>若其有左孩子，则访问左孩子，并将其左孩子入队；</p>
<p align=left>若其有右孩子，则访问右孩子，并将其右孩子入队；</p>
<p align=left>void LevelOrder(BTree *BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!BT) exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitQueue(Q); p=BT; //初始化<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Visite(p); EnQueue(&amp;Q,p); //访问根结点，并将根结点入队<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!QueueEmpty(Q)) { //当队非空时重复执行下列操作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeQueue(&amp;Q,&amp;p); //出队<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!p-&gt;Lchild) {Visite(p-&gt;Lchild);EnQueue(&amp;Q,p-&gt;Lchild); //处理左孩子<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!p-&gt;Rchild) {Visite(p-&gt;Rchild);EnQueue(&amp;Q,p-&gt;Rchild); //处理右孩子<br>&nbsp;&nbsp; }<br>}</p>
<p><br>&nbsp;&nbsp; 五、<strong>典型二叉树的操作算法</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp; 1、 输入一个二叉树的先序序列，构造这棵二叉树</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 为了保证唯一地构造出所希望的二叉树，在键入这棵树的先序序列时，需要在所有空二叉</p>
<p>&nbsp;&nbsp;&nbsp; 树的位置上填补一个特殊的字符，比如，'#'。在算法中，需要对每个输入的字符进行判</p>
<p>&nbsp;&nbsp;&nbsp; 断，如果对应的字符是'#'，则在相应的位置上构造一棵空二叉树；否则，创建一个新结</p>
<p>&nbsp;&nbsp;&nbsp; 点。整个算法结构以先序遍历递归算法为基础，二叉树中结点之间的指针连接是通过指针</p>
<p>&nbsp;&nbsp;&nbsp; 参数在递归调用返回时完成。</p>
<p>算法：</p>
<p>BTree Pre_Create_BT( ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getch(ch);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ch=='#') return NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //构造空树<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else { BT=(BTree)malloc(sizeof(BTLinklist)); //构造新结点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BT-&gt;data=ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BT-&gt;lchild =Pre_Create_BT( );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //构造左子树<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BT-&gt;rchild =Pre_Create_BT( );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //构造右子树<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return BT;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><strong>&nbsp;&nbsp; 2、 计算一棵二叉树的叶子结点数目</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这个操作可以使用三种遍历顺序中的任何一种，只是需要将访问操作变成判断该结点是否</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 为叶子结点，如果是叶子结点将累加器加1即可。下面这个算法是利用中序遍历实现的。</p>
<p>算法：</p>
<p>void Leaf(BTree BT,int *count) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Leaf(BT-&gt;child,&amp;count); //计算左子树的叶子结点个数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (BT-&gt;lchild==NULL&amp;&amp;BT-&gt;rchild==NULL) (*count)++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Leaf(BT-&gt;rchild,&amp;count); //计算右子树的叶子结点个数<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><strong>&nbsp;&nbsp; 3、 交换二叉树的左右子树</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong> 许多操作可以利用三种遍历顺序的任何一种，只是某种遍历顺序实现起来更加方便一&nbsp;&nbsp;</p>
<p>些。而有些操作则不然，它只能使用其中的一种或两种遍历顺序。将二叉树中所有结点的左右</p>
<p>子树进行交换这个操作就属于这类情况。</p>
<p>算法：</p>
<p>void change_left_right(BTree BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (BT) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; change_left_right(BT-&gt;lchild);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; change_left_right(BT-&gt;rchild);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BT-&gt;lchild&lt;-&gt;BT-&gt;rchild;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }</p>
<p><strong>&nbsp;&nbsp; 4 、求二叉树的高度</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这个操作使用后序遍历比较符合人们求解二叉树高度的思维方式。首先分别求出左右子树 </p>
<p>的高度，在此基础上得出该棵树的高度，即左右子树较大的高度值加1。</p>
<p>算法：</p>
<p>int hight(BTree BT) {&nbsp;&nbsp;&nbsp;&nbsp; //h1和h2分别是以BT为根的左右子树的高度<br>&nbsp;&nbsp;&nbsp;&nbsp; if (BT==NULL) return 0;<br>&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h1=hight(BT-&gt;lchild);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h2=hight(BT-&gt;right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return max{h1,h2}+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; 六、<strong>树、森林与二叉树的转换</strong></p>
<p><strong>&nbsp;&nbsp; 1、 树、森林转换成二叉树</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 将一棵树转换成二叉树的方法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 将一棵树转换成二叉树实际上就是将这棵树用孩子兄弟表示法存储即可，此时，树中的每</p>
<p>个结点最多有两个指针：一个指针指向第一个孩子，另一个指针指向右侧第一个兄弟。当你将</p>
<p>这两个指针看作是二叉树中的左孩子指针和孩子右指针时，就是一棵二叉树了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 特点：一棵树转换成二叉树后，根结点没有右孩子。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 将森林转换成二叉树的方法与一棵树转换成二叉树的方法类似，只是把森林中所有树的根 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结点看作兄弟关系，并对其中的每棵树依依地进行转换。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 2 、二叉树还原成树或森林</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这个过程实际上是树、森林转换成二叉树的逆过程，即将该二叉树看作是树或森林的孩子</p>
<p>兄弟表示法。比如，若二叉树为空，树也为空；否则，由二叉树的根结点开始，延右指针向下</p>
<p>走，直到为空，途经的结点个数是相应森林所含树的棵数；若某个结点的左指针非空，说明这</p>
<p>个结点在树中必有孩子，并且从二叉树中该结点左指针所指结点开始，延右指针向下走，直到</p>
<p>为空，途经的结点个数就是这个结点的孩子数目。</p>
<img src ="http://www.cppblog.com/susu/aggbug/21541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/susu/" target="_blank">学习才能进步</a> 2007-04-09 16:25 <a href="http://www.cppblog.com/susu/archive/2007/04/09/21541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向对象编程</title><link>http://www.cppblog.com/susu/archive/2007/04/06/21416.html</link><dc:creator>学习才能进步</dc:creator><author>学习才能进步</author><pubDate>Fri, 06 Apr 2007 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/susu/archive/2007/04/06/21416.html</guid><wfw:comment>http://www.cppblog.com/susu/comments/21416.html</wfw:comment><comments>http://www.cppblog.com/susu/archive/2007/04/06/21416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/susu/comments/commentRss/21416.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/susu/services/trackbacks/21416.html</trackback:ping><description><![CDATA[<center>
<h1>面向对象编程</h1>
</center>
<div><font face=Verdana>　　<a href="http://www.itisedu.com/phrase/200603050951565.html" target=_new><u><font color=#800080>面向对象编程</font></u></a>（<a href="http://www.itisedu.com/phrase/200604240958155.html" target=_new><u><font color=#0000ff>Object Oriented Programming</font></u></a>，<a href="http://www.itisedu.com/phrase/200604240956125.html" target=_new><u><font color=#0000ff>OOP</font></u></a>，<font face=Verdana color=#0000ff><a href="http://www.itisedu.com/phrase/200604240957495.html" target=_new><u>面向对象程序设计</u></a></font>）是一种<a href="http://www.itisedu.com/phrase/200603021438435.html" target=_new><u><font color=#0000ff>计算机</font></u></a>编程<a href="http://www.itisedu.com/phrase/200604241328115.html" target=_new><u><font color=#0000ff>架构</font></u></a>。OOP 的一条基本原则是<a href="http://www.itisedu.com/phrase/200602281649395.html" target=_new><u><font color=#0000ff>计算机程序</font></u></a>是由单个能够起到子<a href="http://www.itisedu.com/phrase/200604232224305.html" target=_new><u><font color=#0000ff>程序</font></u></a>作用的单元或<a href="http://www.itisedu.com/phrase/200603090845215.html" target=_new><u><font color=#0000ff>对象</font></u></a>组合而成。OOP 达到了<a href="http://www.itisedu.com/phrase/200602281725525.html" target=_new><u><font color=#0000ff>软件工程</font></u></a>的三个主要目标：重用性、灵活性和扩展性。为了实现整体运算，每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和<a href="http://www.itisedu.com/phrase/200603302222545.html" target=_new><u><font color=#0000ff>组件</font></u></a>：
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组件 － 数据和功能一起在运行着的计算机程序中形成的单元，组件在 OOP 计算机程序中是模块和结构化的基础。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抽象性 － 程序有能力忽略正在处理中信息的某些方面，即对信息主要方面关注的能力。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 封装 － 也叫做信息封装：确保组件不会以不可预期的方式改变其它组件的内部状态；只有在那些提供了内部状态改变方法的组件中，才可以访问其内部状态。每<a href="http://www.itisedu.com/phrase/200603090857555.html" target=_new><u><font color=#0000ff>类</font></u></a>组件都提供了一个与其它组件联系的接口，并规定了其它组件进行调用的方法。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多态性 － 组件的引用和类集会涉及到其它许多不同<a href="http://www.itisedu.com/phrase/200603051002565.html" target=_new><u><font color=#0000ff>类型</font></u></a>的组件，而且引用组件所产生的结果得依据实际调用的类型。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继承性 － 允许在现存的组件基础上创建子类组件，这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组，而且还可以定义新类为现存的类的扩展，这样就可以将类组织成树形或网状结构，这体现了动作的通用性。 </p>
<p>　　由于抽象性、封装性、重用性以及便于使用等方面的原因，以组件为基础的编程在脚本语言中已经变得特别流行。Python 和 Ruby 是最近才出现的语言，在开发时完全采用了 OOP 的思想，而流行的 Perl 脚本语言从版本5开始也慢慢地加入了新的<a href="http://www.itisedu.com/phrase/200603101726185.html" target=_new><u><font color=#0000ff>面向对象</font></u></a>的功能组件。用组件代替&#8220;现实&#8221;上的实体成为 JavaScript（ECMAScript） 得以流行的原因，有论证表明对组件进行适当的组合就可以在英特网上代替 HTML 和 <a href="http://www.itisedu.com/phrase/200604231236585.html" target=_new><u><font color=#0000ff>XML</font></u></a> 的文档对象模型（DOM）。&nbsp;&nbsp;</p>
<p><br><strong>一、oop的基本思想</strong></p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OOP的许多原始思想都来之于Simula语言，并在Smalltalk语言的完善和标准化过程中得到更多的扩展和对以前的思想的重新注解。可以说OO思想和OOPL几乎是同步发展相互促进的。与函数式<a href="http://www.itisedu.com/phrase/200602281641255.html" target=_new><u><font color=#0000ff>程序设计</font></u></a>（functional-<a href="http://www.itisedu.com/phrase/200604232129205.html" target=_new><u><font color=#0000ff>programming</font></u></a>）和逻辑式程序设计（logic-programming）所代表的接近于机器的实际计算模型所不同的是，OOP几乎没有引入精确的数学描叙，而是倾向于建立一个对象模型，它能够近似的反映应用领域内的实体之间的关系，其本质是更接近于一种人类认知事物所采用的哲学观的计算模型。由此，导致了一个自然的话题，那就是OOP到底是什么？[D&amp;T 1988][B.S 1991] .。在OOP中，对象作为计算主体，拥有自己的名称，状态以及接受外界<a href="http://www.itisedu.com/phrase/200603090938465.html" target=_new><u><font color=#0000ff>消息</font></u></a>的接口。在对象模型中，产生新对象，旧对象销毁，发送消息，响应消息就构成OOP计算模型的根本。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象的产生有两种基本方式。一种是以原型（prototype）对象为基础产生新的对象。一种是以类（<a href="http://www.itisedu.com/phrase/200604231359565.html" target=_new><u><font color=#0000ff>class</font></u></a>）为基础产生新对象。原型的概念已经在认知心理学中被用来解释概念学习的递增特性，原型模型本身就是企图通过提供一个有代表性的对象为基础来产生各种新的对象，并由此继续产生更符合实际应用的对象。而原型-委托也是OOP中的对象抽象，代码共享机制中的一种。一个类提供了一个或者多个对象的通用性描叙。从形式化的观点看，类与类型有关，因此一个类相当于是从该类中产生的实例的集合。而这样的观点也会带来一些矛盾，比较典型的就是在继承体系下，子集（子类）对象和父集（父类）对象之间的行为相融性可能很难达到，这也就是OOP中常被引用的---子类型（subtype）不等于子类（subclass）[Budd 2002]。而在一种所有皆对象的世界观背景下，在类模型基础上还诞生出了一种拥有元类（metaclass）的新对象模型。即类本身也是一种其他类的对象。以上三种根本不同的观点各自定义了三种基于类（class-based）,基于原型（prototype-based）和基于元类（metaclass-based）的对象模型。而这三种对象模型也就导致了许多不同的<a href="http://www.itisedu.com/phrase/200602281700255.html" target=_new><u><font color=#0000ff>程序设计语言</font></u></a>（如果我们暂时把静态与动态的差别放在一边）。是的，我们经常接触的C++,Java都是使用基于类的对象模型，但除此之外还有很多我们所没有接触的OOPL采用了完全不一样的对象模型，他们是在用另外一种观点诠释OOP的内涵。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么是oop的基本思想呢？把组件的实现和接口分开，并且让组件具有多态性。不过，两者还是有根本的不同。oop强调在程序构造中语言要素的语法。你必须得继承，使用类，使用对象，对象传递消息。gp不关心你继承或是不继承，它的开端是分析产品的分类，有些什么种类，他们的行为如何。就是说，两件东西相等意味着什么？怎样正确地定义相等操作？不单单是相等操作那么简单，你往深处分析就会发现&#8220;相等&#8221;这个一般观念意味着两个对象部分，或者至少基本部分是相等的，据此我们就可以有一个通用的相等操作。再说对象的种类。假设存在一个顺序序列和一组对于顺序序列的操作。那么这些操作的语义是什么？从复杂度权衡的角度看，我们应该向用户提供什么样的顺序序列？该种序列上存在那些操作？那种排序是我们需要的？只有对这些组件的概念型分类搞清楚了，我们才能提到实现的问题：使用模板、继承还是宏？使用什么语言和技术？gp的基本观点是把抽象的<a href="http://www.itisedu.com/phrase/200604232134205.html" target=_new><u><font color=#0000ff>软件</font></u></a>组件和它们的行为用标准的分类学分类，出发点就是要建造真实的、高效的和不取决于语言的算法和数据结构。当然最终的载体还是语言，没有语言没法编程。stl使用c++，你也可以用ada来实现，用其他的语言来实现也行，结果会有所不同，但基本的东西是一样的。到处都要用到二分查找和排序，而这就是人们正在做的。对于容器的语义，不同的语言会带来轻微的不同。但是基本的区别很清楚是gp所依存的语义，以及语义分解。例如，我们决定需要一个组件swap，然后指出这个组件在不同的语言中如果工作。显然重点是语义以及语义分类。而oop所强调的（我认为是过分强调的）是清楚的定义类之间的层次关系。oop告诉了你如何建立层次关系，却没有告诉你这些关系的实质。<br>（这段不太好理解，有一些术语可能要过一段时间才会有合适的中文翻译——译者）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面向对象的编程方法OOP是九十年代才流行的一种软件编程方法。它强调对象的&#8220;抽象&#8221;、&#8220;封装&#8221;、&#8220;继承&#8221;、&#8220;多态&#8221;。我们讲程序设计是由&#8220;数据结构&#8221;+&#8220;算法&#8221;组成的。从宏观的角度讲，OOP下的对象是以编程为中心的，是面向程序的对象。我们今天要讲的<a href="http://www.itisedu.com/phrase/200604231256315.html" target=_new><u><font color=#0000ff>OOD</font></u></a>是面向信息的对象，是以用户信息为中心的。 </p>
<p><strong>二、OOP技术的历史</strong></p>
<p>　　面向对象技术最初是从面向对象的程序设计开始的，它的出现以60年代simula语言为标志。80年代中后期，面向对象程序设计逐渐成熟，被计算机界理解和接受，人们又开始进一步考虑面向对象的开发问题。这就是九十年代以Microsoft Visual系列OOP软件的流行的背景。 </p>
<p>　　传统的结构化分析与设计开发方法是一个线性过程，因此，传统的结构化分析与设计方法要求现实系统的业务管理规范，处理数据齐全，用户能全面完整地其业务<a href="http://www.itisedu.com/phrase/200603101518295.html" target=_new><u><font color=#0000ff>需求</font></u></a>。 </p>
<p>　　传统的<a href="http://www.itisedu.com/phrase/200602282202575.html" target=_new><u><font color=#0000ff>软件结构</font></u></a>和设计方法难以适应软件生产自动化的要求，因为它以过程为中心进行功能组合，软件的扩充和复用能力很差。 </p>
<p>　　对象是对现实世界实体的模拟，因面能更容易地理解需求，即使用户和分析者之间具有不同的教育背景和工作特点，也可很好地沟通。 </p>
<p>　　区别面向对象的开发和传统过程的开发的要素有：对象识别和抽象、封装、多态性和继承。 </p>
<p>　　对象(<a href="http://www.itisedu.com/phrase/200604231338435.html" target=_new><u><font color=#0000ff>Object</font></u></a>)是一个现实实体的抽象，由现实实体的过程或信息牲来定义。一个对象可被认为是一个把数据（属性）和程序（方法）封装在一起的实体，这个程序产生该对象的动作或对它接受到的外界信号的反应。这些对象操作有时称为方法。对象是个动态的概念,其中的属性反映了对象当前的状态。 </p>
<p>　　类(Class)用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 </p>
<p>　　由上分析不难看出，尽管OOP技术更看中用户的对象模型，但其目的都是以编程为目的的，而不是以用户的信息为中心的，总想把用户的信息纳入到某个用户不感兴趣的&#8220;程序对象&#8221;中。 </p>
<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'"><font face=Verdana>
<p><font face=Verdana><strong>三、OOP 的优缺点</strong></font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; OOP 的优点：使人们的编程与实际的世界更加接近，所有的对象被赋予属性和方法，结果编程就更加富有人性化。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; OOP 的也有缺点，就 C++ 而言，由于面向更高的逻辑抽象层，使得 C++ 在实现的时候，不得不做出性能上面的牺牲，有时候甚至是致命的 ( 所有对象的属性都经过内置多重指针的间接引用是其性能损失的主要原因之一；不过，笔者的局限性在于未使用过 VC++ 外的<a href="http://www.itisedu.com/phrase/200603010948085.html" target=_new><u><font color=#0000ff>面向对象语言</font></u></a>，所以不是十分肯定，哈哈，有人笑出来了&#8230; )。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在计算机速度飞速发展的今天，你可能会说，一丁点的性能牺牲没什么大不了。是的，从面向对象的角度，使的编程的结构更加清晰完整，数据更加独立和易于管理，性能的牺牲可以带来这么多的好处，没有理由不做稳赚的生意吧？</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过，在某些对速度要求极高特殊场合，例如你做的是电信的交换系统，每秒钟有超过百万的人同时进行电话交换，如果，每一个数据交换过程都是一个对象，那么总的性能损失将是天文数字！！</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者这个例子不够贴身，再举个例子吧。假如你受聘于一个游戏设计公司，老板希望做出来的游戏可以更多的兼顾到更多的<a href="http://www.itisedu.com/phrase/200604231234155.html" target=_new><u><font color=#0000ff>电脑</font></u></a>使用者，游戏每秒钟的运行的帧可以更多，子弹和爆炸物可以更多、更华丽。那么，你会发现使用 C++ 会使你的程序变得笨拙，无法满足你的需求，除非你非得要你的游戏运行于奔腾四的机器上 ( 如果不是，而你又坚持用 C++ 的对象编程，那么请减少主角的枪的威力吧 )。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你是冥顽不宁的人，你说不相信 OOP 会有性能上的损失，那么，我记得曾看到在 CSDN 上关于 VB 和 VC 执行效率的讨论的文章，讲述的就是使用了 MFC 以后，执行效率甚至低于 VB 开发出来的东西。请各位验证一下：如果使用的是纯粹的 C 语言语法的话，那么一定会比在 VB 编出来的东西要快很多 ( GetTickCount 函数可以查阅 MSDN ,如果想更加精确一些，可以使用 QueryPerformanceCounter 函数 )。</font></p>
<p><font face=Verdana><strong>四、OOP的未来（撰文/Bjarne Stroustrup &amp; Tim Lindholm&nbsp;&nbsp; 编译/孟岩）</strong></font></p>
<p><font face=Verdana>在未来三年，程序员编写代码的方式会发生那些变化？</font></p>
<p><font face=Verdana>Stroustrup: 在C++中，假如没有合适的库在背后支撑，完成任何重要的工作都可能是很复杂的。而一旦有了合适的库，任何东西都可以被我们操控于股掌之间。因此，构造和使用程序库的重要性与日俱增。这也暗示我们，泛型程序设计(generic programming)将会越来越多地被运用。只有通过GP，我们才能确保库的通用性和高效率。我还预期在分布式计算和&#8220;组件（components）&#8221;应用领域会出现喜人的增长。就大部分程序员而言，通过使用方便适用的程序库，这些开发工作会变得简单明了。</font></p>
<p><font face=Verdana>现在有一个趋势，编译器厂商试图把其特有的&#8220;对象模型&#8221;和图形界面(GUI)细节推销给用户。比如微软的COM和Inprise的类属性&#8220;properties&#8221;。对于用户来说，这既不必要，也不情愿。我所希望看到的程序库，应该是用标准C++打造，界面灵活，值得信赖的程序库。通常，这些界面应该是平台无关的。C++的表达能力极强，即使不使用大量的宏，也应该足以达成这一要求。就算有些地方无法百分之百的遵守这一原则，也应该将对于平台和厂家的依赖性限制起来。这个目标的完成情况，可以反映<a href="http://www.itisedu.com/phrase/200602282117345.html" target=_new><u><font color=#0000ff>软件工具</font></u></a>产业对于应用程序开发行业的关注程度。我怀疑目前对于那些独立的、跨平台厂商来说，并不存在相应的市场。如果能够建立这样的市场，也许能够促进厂商们为客户做出&#8220;真正有用的&#8221;产品。 </font></p>
<p><font face=Verdana>Lindholm: 对于编写代码的开发者来说，主要的驱动力量仍将是两个：网络和分布式——也就是设计和开发非单机软件的需求。大部分的应用程序将不会是孤零零地运行在单一设备上，而是运用了类似<a href="http://www.itisedu.com/phrase/200604241156485.html" target=_new><u><font color=#0000ff>EJB</font></u></a>和JSP之类技术的，平台无关的分布式程序。程序员们将不得不面对分布式计算的重重险阻。这将对许多程序员所依赖的<a href="http://www.itisedu.com/phrase/200603061631585.html" target=_new><u><font color=#0000ff>设计模式</font></u></a>、技术和直觉构成严峻的挑战。这是选择编程语言之前必须认识到的，尽管不同语言的设计特性可能促进或者阻碍这一转化。</font></p>
<p><font face=Verdana>在网络应用的增长中，一个很重要的部分是小型移动设备和特殊Internet设备的爆炸性增长。这些设备各有各的<a href="http://www.itisedu.com/phrase/200602281634075.html" target=_new><u><font color=#0000ff>操作系统</font></u></a>，或者只在某种特定的设备领域内有共同的操作系统。我们现在还可以一一列举出这些设备——家庭接入设备、蜂窝电话、电子报纸、PDA、自动网络设备等等。但是这些设备领域的数量和深入程度将会很快变得难以估量。我们都知道这个市场大得惊人，PC的兴起与之相比不过小菜一碟。因此在这些设备的应用程序市场上，竞争将会相当残酷。获胜的重要手段之一，就是尽快进入市场。开发人员需要优秀的工具，迅速高效地撰写和调试他们的软件。平台无关性也是制胜秘诀之一，它使得程序员能够开发出支持多种设备平台的软件。</font></p>
<p><font face=Verdana>我预期的另一个变化是，我们对于代码(Java)和数据(XML)协同型应用程序的开发能力将会不断提高。这种协同是开发强大应用程序的核心目标之一。我们从XML的迅速流行和ebXML规范的进展中，已经看到了这个趋势。ebXML是一个针对<a href="http://www.itisedu.com/phrase/200603011335015.html" target=_new><u><font color=#0000ff>电子商务</font></u></a>和国际贸易的，基于XML的开放式基础构架，由联合国贸易促进和电子商务中心(UN/CEFACT)与结构性信息标准推进组织(OASIS)共同开发。 </font></p>
<p><font face=Verdana>我们能否期望出现一个真正的面向组件(<a href="http://www.itisedu.com/phrase/200604251501485.html" target=_new><u><font color=#0000ff>component</font></u></a>-oriented)的语言？它的创造者会是谁呢？</font></p>
<p><font face=Verdana>Stroustrup: 我怀疑，这个领域中之所以缺乏成果，正是因为人们——主要是那些非程序员们——对&#8220;组件&#8221;这个意义含糊的字眼寄予了太多的期望。这些人士梦想，有朝一日，组件会以某种方式把程序员赶出历史舞台。以后那些称职的&#8220;设计员&#8221;只需利用预先调整好的组件，把鼠标拖一拖放一放，就把系统组合出来。对于软件工具厂商来说，这种想法还有另一层意义，他们认为，到时候只有他们才保留有必要的技术，有能力编写这样的组件。</font></p>
<p><font face=Verdana>这种想法有一个最基本的谬误：这种组件很难获得广泛欢迎。一个单独的组件或<a href="http://www.itisedu.com/phrase/200603061723295.html" target=_new><u><font color=#0000ff>框架</font></u></a>(<a href="http://www.itisedu.com/phrase/200604241001145.html" target=_new><u><font color=#0000ff>framework</font></u></a>)，如果能够满足一个应用程序或者一个产业领域对所提出的大部分要求的话，对于其制造者来说就是划算的产品，而且技术上也不是很困难。可是该产业内的几个竞争者很快就会发现，如果所有人都采用这些组件，那么彼此之间的产品就会变得天下大同，没什么区别，他们将沦为简单的办事员，主要利润都将钻进那些组件/框架供应商的腰包里！</font></p>
<p><font face=Verdana>小&#8220;组件&#8221;很有用，不过产生不了预期的杠杆效应。中型的、更通用的组件非常有用，但是构造时需要非同寻常的弹性。</font></p>
<p><font face=Verdana>在C++中，我们综合运用不同共享形式的类体系(class hierarchies)，以及使用templates精心打造的接口，在这方面取得了一定的进展。我期待在这个领域取得一些有趣和有用的成果，不过我认为这种成果很可能是一种新的C++程序设计风格，而不是一种新的语言。 </font></p>
<p><font face=Verdana>Lindholm: 编写面向组件的应用程序，好像更多的是个投资、设计和程序员管理方面的问题，而不是一个编程语言问题。当然某些语言在这方面具有先天优势，不过如果说有什么魔术般的新语言能够大大简化组件的编写难度，那纯粹是一种误导。 </font></p>
<p><font face=Verdana>微软已经将全部赌注押在C#上，其他语言何去何从？</font></p>
<p><font face=Verdana>Stroustrup: C++在下一个十年里仍然将是一种主流语言。面对新的挑战，它会奋起应对。一个创造了那么多出色系统的语言，绝不会&#8220;坐视落花流水春去也&#8221;。</font></p>
<p><font face=Verdana>我希望微软认识到，它在C++(我指的是ISO标准C++)上有着巨大的利益，C++是它与IT世界内其他人之间的一座桥梁，是构造大型系统和<a href="http://www.itisedu.com/phrase/200603112246585.html" target=_new><u><font color=#0000ff>嵌入式系统</font></u></a>的有效工具，也是满足高性能需求的利器。其他语言，似乎更注重那些四平八稳的商用程序。 </font></p>
<p><font face=Verdana>竞争</font></p>
<p><font face=Verdana>C#会不会获得广泛的接受，并且挤掉其他的语言？</font></p>
<p><font face=Verdana>Lindholm: 通常，一种语言既不会从别的语言那里获利，也不会被挤掉。那些坚定的Fortran程序员不还用着Fortran吗？对于个人来说，语言的选择当然因时而异，但就整体而言，语言的种类只会递增，也就是说，它们之间的关系是&#8220;有你有我&#8221;而不是&#8220;有你没我&#8221;。</font></p>
<p><font face=Verdana>对于一个新语言的接受程度，往往取决于其能力所及。Java技术被迅速接受，原因是多方面的，Internet和World Wide Web接口，在其他技术面前的挫折感，对于Java技术发展方向的全面影响能力，都是原因。另一个重要的原因是Java独立于厂商，这意味着在兼容产品面前可以从容选择。</font></p>
<p><font face=Verdana>C#是否会获得广泛接受？视情况而定。总的来说，那些对于平台无关性和厂商无关性漠不关心的程序员，可能会喜欢C#。那些跟微软平台捆在一起人当然可能想要寻找VB 和VC的一个出色的替代品。但是对于程序跨平台执行能力特别关注的程序员，将会坚守Java之类的语言。这种能力对于多重访问设备（multiple access devices）和分布式计算模型至关重要，而Java语言提供了一个标准的、独立于厂商运行时环境。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>Stroustrup: C#的流行程度几乎完全取决于微软投入的资金多少。看上去C#的兴起肯定会牺牲掉其他一些语言的利益，但是事实上未必如此。Java的蓬勃发展并没有给C++带来衰败。C++的应用仍然在稳定增长（当然，已经不是爆炸性的增长了）。也许其他的语言也还能获得自己的一席之地。</font></p>
<p><font face=Verdana>不过，我实在看不出有什么必要再发明一种新的专有语言。特别是微软，既生VB，何需C#？</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>不同OOP语言各有什么优势和劣势？</font></p>
<p><font face=Verdana>Stroustrup: C++的优点自始至终都是这么几条：灵活、高效，而且并非专有语言。现在ISO C++标准的出现，巩固了最后一点。</font></p>
<p><font face=Verdana>我认为C++的高效是它最基本的优点。这种高效来自于其特有的数据和计算模型，较之Java和C#，这种模型更加贴近机器。不过，哪些程序才真正地渴望这么高的效率？这是个问题。我认为这类程序非常多。人们对于计算机的期望，永远都超越硬件科技的发展速度。很显然，Java和C#的设计者的想法不同，他们认为，在很多地方效率问题无关紧要。</font></p>
<p><font face=Verdana>C++主要的缺点，归罪于糟糕的教育（是那些始终认为C++是个纯粹面向对象语言的人，和那些把C++当成C语言变体的人导致了这种情况），归罪于不同平台上的不一致性，归罪于不完整、不标准的编译器实现，归罪于平台无关的系统级程序库的缺少。</font></p>
<p><font face=Verdana>这些问题归于一点，就是缺乏一个卓越的厂商，能够满足整个C++社区的需求，勇于投入大量的资金开发必要的程序库。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>Lindholm: Java技术的成功，是因为它在合适的时间，出现在合适的地点，而且合理地选择了语言和计算平台的支持目标。Java并不是在所有场合都优于其他OOP语言，但是对于出现的新问题能够解决得很出色。它面向Internet计算环境，避免了C++中晦涩的结构，成功翻越了继承机制的恼人问题。垃圾收集机制显著地提高了生产率，降低了复杂度。在网络背景下使用虚拟机，以及有关安全性和动态加载的一系列设计选择，迎合了正在出现的需求和愿望。这些特性使Java不仅成为现有程序员的新武器，而且也为新的程序员创造了繁荣的市场空间。</font></p>
<p><font face=Verdana>此外，Java拥有一个标准化的、二进制形式的类库，提供了必要的（当然并非充分的）平台与厂商无关性。平台与厂商无关性要求一项技术必须有清晰的规范，摒弃那些阻碍二进制标准实施的特性。C++虽然有一个ISO标准，但其实甚至对于相同系统与相同指令体系的各个平台，也提不出一个实用的、各版本兼容的二进制标准。</font></p>
<p><font face=Verdana>历史上很多使用虚拟机的语言饱受责难，是因为其不够出色的性能问题，而这要归过于缓慢的解释器和糟糕的垃圾收集器。Java的早期实现也因为同样的问题受到严厉的批评。但是自那时起，业界向新的虚拟机实现技术投入了大量资金，取得了显著的效果，如今在大部分场合，Java的性能跟常规的静态编译语言相比毫不逊色。这使得程序员在获得平台和厂商无关性的同时，也不必付出性能上的代价。</font></p>
<p><font face=Verdana>C++并没有强制使用<a href="http://www.itisedu.com/phrase/200602281513385.html" target=_new><u><font color=#0000ff>面向对象方法</font></u></a>，因此为了编写出色的面向对象代码，就要求程序员们有相当强的纪律性。很多公司就是因为这个原因放弃了C++。作为语言，Java的一个突出的优点就是强制面向对象方法，不允许非面向对象的结构。</font></p>
<p><font face=Verdana>C#介于C++和Java之间，脚踏两只船，因此既不够安全，又失之复杂。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>对于公司来说，采用新的语言要付出巨大代价。雇不到好的程序员（没人熟悉这种新语言），培训费用高得惊人，学习过程中生产率和产品质量下降，多年的经验随风消逝，等等。一种语言如何克服这些障碍？</font></p>
<p><font face=Verdana>Lindholm: 说得很对，采用新东西确实常常开销巨大。不过问题是：这个新东西是否能够节省更多的开支，或者提供巨大的改进，获取合理的回报？很多公司发现，转向Java技术不论在开发的后端（尽快进入市场、快速迭代开发、维护简单性）还是前端（跨平台发布，适用范围从低端设备到高端服务器的技术，安全性），都能节省大笔的开销。</font></p>
<p><font face=Verdana>对于新事物的接纳，常常是在痛楚的压力之下。很大程度上，这正是Java所经历的。Java的产生，是对当时很多系统的缺陷所做出的反应。Java技术通过下面的手段减轻了开发者的痛楚：1) 顾及了网络计算方面的需求，是应运而生。2) 在技术能力的抉择上，保持良好的品位，顾及了大众的心理。3) 采用适度强制性策略推行设计决定。此外，Java技术已经成为大学教学中的主流，这同样保证了Java开发者队伍的不断壮大。</font></p>
<p><font face=Verdana>但是最重要的一点是，再没有另一种程序设计技术，能够像Java那样允许程序员开发基于Internet的不同平台之上的应用程序。Java平台在这方面的杰出表现，已经被大量的实例证明。Java已经成为Internet上的缺省应用程序平台，Java APIs也成为Internet应用程序开发的天然平台。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>Stroustrup: 微软和Sun把大笔的金钱扔在Java、VB和C#中，并不是因为他良心发现，也不是因为他们真的相信这些语言能够带给程序员更美好的生活，而是利益使然。</font></p>
<p><font face=Verdana>有一个说法，认为软件工具厂商如果能够把应用程序开发者的专业技术任务负担起来，将获取巨大的经济利益。我对其背后的经济分析颇为怀疑，我认为这很难成为现实，特别是当应用程序开发者使用开放的、标准化的工具时，他们可以有多种选择，从而使上面的想法更加不可能。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>多年以前，C++就已经具有泛型能力(也就是templates和STL)，有运算符重载，有枚举类型？我们会不会在Java的未来版本中看到这些特性？Java是不是应该纳入这些特性呢？</font></p>
<p><font face=Verdana>Strousturp:从1988-89年起，C++就已经有了templates。但是我们花了不少时间来了解如何最好地运用这个工具，早期各厂家对于template的支持在品质上也有很大的差异。有些编译器厂商动作迟缓，至少有一个主要的编译器厂商（好像是指微软，微软在Visual C++4.0才开始支持template，在此之前一直声称template是过于复杂而又没什么用的技术，时至今日，Visual C++对于template的支持在主流编译器中都属于最差的一档——译者注）暗中鼓励声名狼藉的反template宣传，直到他们自己终于学会了这项技术为止。直到今天，对于template的支持在品质上仍然有待改进。</font></p>
<p><font face=Verdana>你上面提到的那些特性，我认为Java（还有C#）应该，也肯定会逐渐引入。那些对于程序员来说最有用的语言特性和概念，将会逐渐集中，成为各家主流语言的必然之选。也就是说，我认为类似析构函数和模板特殊化之类的机制，远远比枚举等机制重要得多。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>Lindholm：Java技术成功的原因之一，就是很清楚哪些不该做。我们得多问几个为什么：这项特性是不是必不可少？增加它会带来哪些开销？运算符重载是C++中一项极其强大的特性，但是它也大大增加了C++语言的复杂度，很多人都难以招架。Java在各种可能的权衡之中，做出了明智的抉择，找到了能力与需求之间的完美平衡点。</font></p>
<p><font face=Verdana>当然，Java也会发展，而且最重要的是，现在是开发者们在推动发展。Java增加泛型能力这件事，很好地展示了Java是如何通过整个开发者社群的参与，在权衡中决定正确的平衡点。关于增加泛型类型（generic types）的&#8220;Java规格申请&#8221;（Java Specification Request, JSR）已经进入<a href="http://www.itisedu.com/phrase/200604241437025.html" target=_new><u><font color=#0000ff>JCP</font></u></a>（<a href="http://www.itisedu.com/phrase/200604241454455.html" target=_new><u><font color=#0000ff>Java Community Process</font></u></a>）程序，而且已经开发了很长一段时间（参见 http://java.sun.com/aboutJava/communityprocess/之JSR-014）。现在，在JCP中，有超过80个JSRs正在讨论中，这充分体现了整个体系对开发者的积极反馈和高度合作，这正是驱动Java平台不断进化的动力。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>发展 vs. 革新(Evolution vs. Revolution)</font></p>
<p><font face=Verdana>C++是一种发展型的语言，Java和C#似乎更像是革新型语言（它们是从头设计的）？什么时候，革新型的语言才是必需的呢？</font></p>
<p><font face=Verdana>Lindholm: Java技术并非凭空出世，反而更像是发展型的。Java所有的特性，在Java平台推出之前，都至少已经存在于另一种环境之中。Java的贡献在于，在众多的特性和权衡中，做出了合理的选择，使得产品既实用，又优雅。Java技术对于程序员的态度是：抚养，但不溺爱。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>Stroustrup：从技术上讲，我并不认为Java和C#是什么&#8220;从头设计的&#8221;革新型语言。倘若Java是从技术原则出发，从头设计，大概就不会模仿C/C++那种丑陋和病态的语法了（不必惊讶，Stroustrup在很多场合表示过，C++采用C的语法形式，实在是迫于兼容性。他本人更偏爱Simula的语法——译者）。</font></p>
<p><font face=Verdana>我认为，只有当程序员们面对的问题发生了根本的变化的时候，或者当我们发现了全新的、极其优越的程序设计技术，又完全不能为现存语言所支持的时候，我们才需要全新的语言。问题是，我们恐怕永远也碰不到那些&#8220;根本&#8221;、&#8220;全新&#8221;的情况。</font></p>
<p><font face=Verdana>我以为，自从OOP问世以来，可称为&#8220;根本&#8221;的新型程序设计技术，唯有泛型程序设计（generic programming）和生成式程序设计（generative programming）技术，这两项技术主要是源于C++ templates技术的运用，也有一部分曾经被视为面向对象和函数式语言(functional languages)的次要成分，现在都变成正式、可用和可承受的技术了。我对于目前C++模板(template)程序设计的成果非常兴奋。例如，像POOMA, Blitz++和MTL等程序库，在很多地方改变了数值计算的方式。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>Java和C#的一个&#8220;卖点&#8221;，就是它们的简单性。现在Java是不是快失去这个卖点了？</font></p>
<p><font face=Verdana>Stroustrup：新语言总是宣称自己如何如何简单，对老语言的复杂性颇多非议。其实这种所谓的&#8220;简单性&#8221;，简单地说，就是不成熟性。语言的复杂性，是在解决现实世界中极为烦琐和特殊的复杂问题的过程中逐渐增加的。一个语言只要活的时间够长，总会有某些地方逐渐复杂起来，或者是语言本身，或者是程序库和工具。C++和Java显然都不例外，我看C#也一样。如果一种语言能够度过自己的幼年时代，它会发现，自己无论是体积还是复杂性都大大增加了。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>Lindholm：Java技术的的功能在增加，需要学习的东西也在增加。不过功能的增加并不一定带来复杂性的增加。Java技术的发展，并没有使学习曲线更加陡峭，只是让它继续向右方延展了。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>标准</font></p>
<p><font face=Verdana>标准化语言和开放型语言各自的优点和缺点何在？</font></p>
<p><font face=Verdana>Lindholm：对于一个开放、不允许专有扩展、具有权威的强制性标准语言或者运行环境来说，不存在什么缺点。允许专有扩展就意味着允许厂商下套子绑架客户。特别重要的是，必须让整个平台，而不只是其中一部分完全标准化，才能杜绝厂商们利用高层次的专有<a href="http://www.itisedu.com/phrase/200604241228185.html" target=_new><u><font color=#0000ff>API</font></u></a>下套子。客户要求有选择厂商的自由，他们既要有创造性，又需要兼容性。</font></p>
<p><font face=Verdana></font>&nbsp;</p>
<p><font face=Verdana>Stroustrup：对于一个语言，如C/C++来说，建立正式标准（如ISO标准）最大的好处，在于可以防止某一个厂商操纵这种语言，把它当成自己的摇钱树。多个厂商的竞争给用户带来的是较低的价位和较好的稳定性。</font></p>
<p><font face=Verdana>专有语言的好处，一是流行，二是便宜（不过等你被套牢了之后，情况就会起变化），三是对于商业性需求可以做出快速的反应。</font></p>
<p><font face=Verdana>标准化语言的特点之一是，它不能忽略特殊用户的需求。比如我在AT&amp;T中所考虑的东西，其规模、可靠性和效率要求，跟那些普通厂商关注的大众软件相比，根本不可同日而语。那些公司很自然只关注主要的需求。</font></p>
<p><font face=Verdana>然而，多数大机构和身处前沿的公司，都有着特殊的需求。C++的设计是开放、灵活和高效的，能够满足我所能想象的任何需求。跟其他的现代语言相比，C++的家长式作风可谓少之又少，原因就在这。当然，不能赞赏这一点的人会诟病C++的&#8220;危险&#8221;。</font></p>
<p><font face=Verdana>拥有正式和开放标准的语言主要是为编程工具的使用者和客户服务的，而拥有专属&#8220;标准&#8221;的语言，主要是为厂商服务的。<br></font></p>
</font></span></font></div>
<img src ="http://www.cppblog.com/susu/aggbug/21416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/susu/" target="_blank">学习才能进步</a> 2007-04-06 17:08 <a href="http://www.cppblog.com/susu/archive/2007/04/06/21416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>真实的C++之父</title><link>http://www.cppblog.com/susu/archive/2007/04/06/21412.html</link><dc:creator>学习才能进步</dc:creator><author>学习才能进步</author><pubDate>Fri, 06 Apr 2007 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/susu/archive/2007/04/06/21412.html</guid><wfw:comment>http://www.cppblog.com/susu/comments/21412.html</wfw:comment><comments>http://www.cppblog.com/susu/archive/2007/04/06/21412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/susu/comments/commentRss/21412.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/susu/services/trackbacks/21412.html</trackback:ping><description><![CDATA[<p align=center><strong><span>真实的</span></strong><strong><span><font face="Times New Roman">C++</font></span></strong><strong><span>之父</span></strong><strong></strong></p>
<p align=center><span>——</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>访谈录</span></p>
<p align=center><span>赵玉勇</span></p>
<h2><span><font face=ARIAL>Bjarne Stroustrup</font></span><span>简介</span></h2>
<p>&#160;</p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>许多重要人物之所以成名，或者是因为其改变了历史或者是因为其创造了历史，</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生，</span><span><font face="Times New Roman">C++</font></span><span>之父，属于后者；归结个人成功的原因，理由可能有许多，但他只有浅显的两个一点点：他比多数人天真和理想主义那么一点点；比多数人花在解决问题上的时间多一点点。</span></p>
<p><span><font face="Times New Roman">C++</font></span><span>程序设计语言是一种承前启后，被数以百万计的程序员应用在各个领域中的语言，我们正在使用的</span><span><font face="Times New Roman">Windows</font></span><span>操作系统，我们上网用的浏览器</span><span><font face="Times New Roman">IE</font></span><span>无不是出自</span><span><font face="Times New Roman">C++</font></span><span>的手笔。</span></p>
<p><span><font face="Times New Roman">C++</font></span><span>是一种重要的和比较流行的计算机语言之一，也是未来十年内仍然发挥重要作用的语言。</span><span><font face="Times New Roman">C++</font></span><span>语言是一种通用的应用广范的程序设计语言，是一种既支持传统的结构化程序设计，又支持面向对象程序设计的系统复杂的语言。</span><span><font face="Times New Roman">C++</font></span><span>对</span><span><font face="Times New Roman">C</font></span><span>语言的扩充首先由</span><span><font face="Times New Roman"> Stroustrup</font></span><span>先生于</span><span><font face="Times New Roman">1980</font></span><span>年在贝尔实验室提出的，于</span><span><font face="Times New Roman">1983</font></span><span>年改名为</span><span><font face="Times New Roman">C++</font></span><span>。尽管</span><span><font face="Times New Roman">C++</font></span><span>的祖先</span><span><font face="Times New Roman">C</font></span><span>语言是世界上最受喜爱和应用最广的专业程序设计语言之一，但</span><span><font face="Times New Roman">C++</font></span><span>的发明是必需的。</span><span><font face="Times New Roman">C++</font></span><span>的本质就是让程序员理解和管理更大更复杂的程序。而对这种语言有着最大贡献的</span><span><font face="Times New Roman">C++</font></span><span>之父又是怎样一个人呢？</span></p>
<p><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生，</span><span><font face="Times New Roman">1950</font></span><span>年生于丹麦港口城市奥尔胡斯，</span><span><font face="Times New Roman">1975</font></span><span>年在奥尔胡斯大学毕业，</span><span><font face="Times New Roman">1979</font></span><span>年获得剑桥大学计算机科学博士学位。他是</span><span><font face="Times New Roman">C++</font></span><span>语言的设计者和实现者，现在是得克萨斯州</span><span><font face="Times New Roman">A&amp;M</font></span><span>大学计算机系教授。</span><span><font face="Times New Roman">1979</font></span><span>年他来到美国的新泽西州并加入贝尔实验室，与</span><span><font face="Times New Roman">C</font></span><span>语言之父、</span><span><font face="Times New Roman">1983</font></span><span>年图灵奖得主</span><span><font face="Times New Roman">Dennis Ritchie</font></span><span>以及大名鼎鼎的</span><span><font face="Times New Roman">Brian Kernighan</font></span><span>（两人合著《</span><span><font face="Times New Roman">C</font></span><span>程序设计语言》）共事多年，期间参与了贝尔实验室的</span><span><font face="Times New Roman">C</font></span><span>语言标准化活动。他的研究兴趣十分广泛，包括分布式系统、操作系统、仿真、设计以及编程，</span><span><font face="Times New Roman">Bjarne</font></span><span>还积极推动</span><span><font face="Times New Roman">C++</font></span><span>的</span><span><font face="Times New Roman">ANSI/ISO</font></span><span>标准化。</span></p>
<p><span><font face="Times New Roman">20</font></span><span>世纪</span><span><font face="Times New Roman">90</font></span><span>年代以后，</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>步入人生的最辉煌时期。</span></p>
<p><span><font face="Times New Roman">1990</font></span><span>年，</span><span><font face="Times New Roman">Bjarne</font></span><span>荣获《财富》杂志评选的&#8220;美国</span><span><font face="Times New Roman">12</font></span><span>位最年轻的科学家&#8221;称号。</span></p>
<p><span><font face="Times New Roman">1993</font></span><span>年，由于在</span><span><font face="Times New Roman">C++</font></span><span>领域的重大贡献，</span><span><font face="Times New Roman">Bjarne</font></span><span>获得了</span><span><font face="Times New Roman">ACM</font></span><span>该年度的</span><span><font face="Times New Roman"> Grace Murray Hopper</font></span><span>大奖并成为</span><span><font face="Times New Roman">ACM</font></span><span>院士（成立于</span><span><font face="Times New Roman">1947</font></span><span>年的</span><span><font face="Times New Roman">ACM</font></span><span>协会是历史最悠久、目前世界上最大的教育和科学计算协会，成为</span><span><font face="Times New Roman">ACM</font></span><span>院士是个人成就的里程碑）。</span></p>
<p><span><font face="Times New Roman">1995</font></span><span>年，</span><span><font face="Times New Roman">BYTE</font></span><span>杂志颁予他&#8220;近</span><span><font face="Times New Roman">20</font></span><span>年来计算机工业最具影响力的</span><span><font face="Times New Roman">20</font></span><span>人&#8221;的称号。</span></p>
<p><span>除了他的专业研究领域外，他对历史，通俗文学，摄影，运动，旅行和音乐等有广泛的兴趣。他对</span><span><font face="Times New Roman">C++</font></span><span>语言的推广也做出了极大的贡献，他写的书&#8220;</span><span><font face="Times New Roman">The C++ Programming Language</font></span><span>《</span><span><font face="Times New Roman">C++</font></span><span>程序设计语言》&#8221;已经成为这种语言中最为流行的学习资料，至少被翻译成</span><span><font face="Times New Roman">18</font></span><span>种语言。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<h2><span>给中国程序员最美好的祝愿</span></h2>
<p><span><font face="Times New Roman">2004</font></span><span>年</span><span><font face="Times New Roman">12</font></span><span>月</span><span><font face="Times New Roman">8</font></span><span>日，杭州，</span><span><font face="Times New Roman">C++</font></span><span>之父</span><span><font face="Times New Roman">Bjarne Struostrup</font></span><span>先生再次来到中国。我们有幸采访到了这位大师！请看大师给中国程序员的最美好祝愿。</span></p>
<p><strong><span>问：</span><font face="Times New Roman"> </font></strong><strong><span>您对中国和中国的程序员有什么认识？您想对他们说点什么吗？</span></strong></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><span>中国是个大国，并且她有许许多多有趣的文化。我想和中国程序员说的和对其他国家的程序员说的是一样的，所以我有如下的回答：优秀软件所具有的特点和技术在全世界都是通用的。</span></p>
<p>&#160;</p>
<p><span>图</span><span><font face="Times New Roman"> C++</font></span><span>之父给中国程序员最美好的祝愿</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>现在，成为一名电脑高手是许多年轻学生的梦想，面对</span><span><font face="Times New Roman">Stroustrup</font></span><span>这样一位大师级人物的出现，最令我们感兴趣的问题莫过于：</span><span><font face="Times New Roman">Bjarne</font></span><span>成为大师的历程是什么样子的呢？</span></p>
<p><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生出生的奥尔胡斯市是日德兰半岛东海岸的一个美丽的小城，那里每家都有自己的小公寓，公寓里有个小院，小院是孩子们踢足球的地方，那时，成为一名足球明星比成为一名电脑高手是更可行的想法，做一名电脑名星好象是很遥远的事情，因为个人不太可能拥有一台昂贵的计算机。很幸运，在大学时他就用上了系里的计算机，它叫</span><span><font face="Times New Roman">GIER</font></span><span>，是一台旧的丹麦计算机，有一个房间那么大，程序都写在磁带上面，他用它学习</span><span><font face="Times New Roman">Algol 60</font></span><span>程序设计。</span><span><font face="Times New Roman"> </font></span></p>
<p><span>而对</span><span><font face="Times New Roman">Bjarne</font></span><span>生活产生质的变化的事情是什么呢？</span><span><font face="Times New Roman"> </font></span></p>
<p><span>他认为在他的发展生涯中，最关键的一个项目是在剑桥大学攻读博士学位时用</span><span><font face="Times New Roman">Simula67</font></span><span>计算机做的模拟分布式系统。做这个项目除了使他成为一名顶尖的程序设计高手外，更使他养成了程序员应具有的沟通和交流能力，这为他后来的发展奠定了坚实的基础。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<h2><span><font face=ARIAL>B</font></span><span>与</span><span><font face=ARIAL>C</font></span></h2>
<p><span><font face="Times New Roman">Bjarne</font></span><span>和</span><span><font face="Times New Roman">C</font></span><span>有缘。</span></p>
<p><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生和</span><span><font face="Times New Roman">C</font></span><span>（</span><span><font face="Times New Roman">China</font></span><span>中国）有缘，对他来说中国是一个神秘、美丽而有趣的国度。</span></p>
<p><span><font face="Times New Roman">Bjarne</font></span><span>两度亲密接触中国，第一次是</span><span><font face="Times New Roman">2002</font></span><span>年，曾在中国的几所大学讲学，而第二次是在浙江大学参加</span><span><font face="Times New Roman">ICESS</font></span><span>国际会议</span><span>（<span>ICESS 2004, <a href="http://www.cs.zju.edu.cn/icess2004/">http://www.cs.zju.edu.cn/icess2004/</a>）</span></span><span>。</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生两年前在中国有过长时间的旅程，而在杭城的日子恰逢阴雨，这次到来对晴天的期望是强烈的，何况有杭州西湖美景。作为丹麦人，也就是卖火柴的小女孩诞生的地方，也就是安徒生童话诞生的国度，和中国有着很深的渊源，安徒生童话里恰巧里面有一篇《夜莺》，那里写到了中国，而</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生对于</span><span><font face="Times New Roman">C</font></span><span>（中国）的认识又是什么呢</span><span><font face="Times New Roman">?</font></span></p>
<p><span>他的回答很微妙，他自然知道安徒生童话，他也很喜欢它们，《夜莺》中描绘的中国纯是虚构，与当时的中国可能有也可能没有任何关系，安徒生创造了那个&#8220;中国&#8221;来泛指多个国家及其统治者。而作为一个教育者，他对中国的教育老祖师孔老夫子也有自己独到的见解。</span></p>
<p><span>作为第二个</span><span><font face="Times New Roman">C</font></span><span>，自然就是</span><span><font face="Times New Roman">C++</font></span><span>了。勿庸置疑，</span><span><font face="Times New Roman">C++</font></span><span>对于</span><span><font face="Times New Roman">IT</font></span><span>的分量，和对于</span><span><font face="Times New Roman">Bjarne</font></span><span>个人的影响，都是巨大的。还有一个</span><span><font face="Times New Roman">C</font></span><span>，就是计算机，且看下面他如何描述自己与计算机的联系。</span><strong></strong></p>
<p><strong><span>问：</span><font face="Times New Roman"> </font></strong><strong><span>您的生活是怎样和计算机联系在一起的？</span></strong></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><span>我也不晓得自己到底是怎样和计算机联系在一起的。当我上高中时，不知什么原因总觉得计算机科学是数学的某种实用形式。而事实不完全是这样，或者至少从软件的发展上看并不是如此，但正是这种误解使得我在还不知计算机为何物时选择了</span><span><font face="Times New Roman"> </font></span><span>&#8220;计算机科学数学&#8221;</span><span><font face="Times New Roman"> </font></span><span>，作为我学习的专业，并获得了我的硕士学位。我写完第一个程序后，就着了迷，曾没有回过头。正象大家所看到的，很幸运，我找到了一个使自己的才能可以很好地发挥的位子。</span></p>
<p><strong><span>问：您怎样教育自己的孩子和学生们？</span><span><font face="Times New Roman"> </font></span></strong></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><span>多数情况下，我是通过实例来进行教学的。我认为多数人过高的估计了言语的影响力，而过低的估计了这种影响力是怎样达到的过程。我尽量通过把理论和实践相结合起来以更</span><span>好地达到目的，这样可以比仅用理论或仅用实践示例来教育更能取得事半功倍的成效。我尽量举出实例，从这些活生生的实例中引导归纳出一般的规则和概念。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span><font face="Times New Roman">C++</font></span><span>是怎样炼成的，是什么促成了</span><span><font face="Times New Roman">C++</font></span><span>语言？这象迷一样绕在我们的心头；那什么又是计算机语言呢？后者弄懂了，前者看起来也许就更简单了！且看大师的回答：</span></p>
<p><strong><span>问：</span><font face="Times New Roman"> </font></strong><strong><span>您觉得计算机语言和我们人类的语言有什么不同呢？</span></strong></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><span>计算机语言要比人类语言简单的多，并且精确的多，那也是它应该具有的方式。我不赞成用自然语言去指令电脑的想法。一种程序语言是专家们的工具，并且和普通人相比，是对所有的专家来说用更加专业、定义的更加精确的符号和术语来表达的工具。</span></p>
<p><span>当然两者也有相同之处。那些用的较多的语言比那些使用率较小的语言拥有更多的俗语、表达方式、词汇，这一点无论是计算机语言还是自然语言都是一样的。语言还有一个倾向就是越来越易学，但却很难精通，象Ｃ<span>++ 和英语。在两种语言当中，我们都希望能从最初的基本的应用到真正的掌握。另外一个相同之处就是语言的发展都要适应一个群体的需求，并且一个大的群体或者说社区本身就有重要意义，因为作为这个群体的一部分可以让你有更多的人来进行互动并且有更多的机会可以使用。所有鲜活的语言都是通过获得新的术语、俗语和表达方式来得到发展的。在C++中我们已经看到了关于模板技术的迅猛发展，始因是STL（注：STL指标准模板库，后面我们将采访STL之父 Stepanov先生，他确实有许多精彩的言论，和</span></span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生相比，毫不逊色），也就是经常提到的泛型编程（</span><span><font face="Times New Roman">generic programming</font></span><span>）</span><span>和模板元程序（</span><span><font face="Times New Roman">template metaprogramming</font></span><span>）</span><span>。以后几年里，我们将会在新的<span>ISO C++标准中看到，比1998年标准中对模板技术更强的支持和更广的应用。</span></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>那么，究竟是什么促成了</span><span><font face="Times New Roman">C++</font></span><span>语言呢？</span><span><font face="Times New Roman"> </font></span></p>
<p><span>他的研究生涯给了他很大灵感，他所在的</span><span><font face="Times New Roman">AT&amp;T</font></span><span>贝尔实验室是一个光荣的群体，那里有一群非常出色的研究人员，那里有许多著名的</span><span><font face="Times New Roman">IT</font></span><span>人物，他们彼此间的影响十分深远。他曾经和</span><span><font face="Times New Roman">C</font></span><span>语言之父</span><span><font face="Times New Roman">Dennis Ritchie</font></span><span>亲密接触十多年，他们的办公室相距不远，</span><span><font face="Times New Roman">C++</font></span><span>语言受</span><span><font face="Times New Roman">C</font></span><span>的影响是巨大的。而对于</span><span><font face="Times New Roman">C++</font></span><span>来说，尤其值得我们推崇的是：作为一种学术性语言，他是从商业性语言的重围中杀出的。</span></p>
<p><span><font face="Times New Roman">1979</font></span><span>年</span><span><font face="Times New Roman">Bjarne</font></span><span>在剑桥完成学业后，到了贝尔实验室从事研究工作，</span><span><font face="Times New Roman">20</font></span><span>世纪</span><span><font face="Times New Roman">80</font></span><span>年代，</span><span><font face="Times New Roman">AT&amp;T</font></span><span>曾拔款</span><span><font face="Times New Roman">5000</font></span><span>美元作为市场预算，创建一门语言的决心可能由此而始。在那里，开始研究几个与分布式计算有关的项目。可是工作进展得并不顺利，因为那时几乎所有程序设计工具都不适合完成此类工作。所以，他决定自己开发一个名为&#8220;带类的</span><span><font face="Times New Roman">C</font></span><span>&#8221;的工具，它既允许以类似于</span><span><font face="Times New Roman">Simula</font></span><span>的方式组织程序（这种方式现在被称为面向对象），同时也支持在硬件层次上进行系统软件开发。从</span><span><font face="Times New Roman">1980</font></span><span>年开始，&#8220;带类的</span><span><font face="Times New Roman">C</font></span><span>&#8221;被应用于贝尔实验室的很多应用领域，在应用过程中，他又学到了很多东西，而</span><span><font face="Times New Roman">C++</font></span><span>正是以&#8220;带类的</span><span><font face="Times New Roman">C</font></span><span>&#8221;为基础并结合了一些我们学到的新东西发展而来的。</span><span><font face="Times New Roman">1983</font></span><span>年夏天，</span><span><font face="Times New Roman">Rick Mascitti</font></span><span>给起了</span><span><font face="Times New Roman">C++</font></span><span>的名字，这个名字也象征着两种语言之间巨大的渊源。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<h2><span>生活中更有意义的事情</span></h2>
<p><span>对于</span><span><font face="Times New Roman">Bjarne</font></span><span>来说，生活中更有意义的事情是什么呢？是学习和教育。这看起来象个沉重的话题，而在</span><span><font face="Times New Roman">Bjarne</font></span><span>身上却显得如此生动，作为教育家，</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生本身便是一个成才的典范，他出身于农场和&#8220;蓝领工人&#8221;家庭，他在专业领域孜孜耕耘，取得了不菲业绩。先是</span><span><font face="Times New Roman">AT&amp;T</font></span><span>的研究者，现在又兼任教席，</span><span><font face="Times New Roman">Bjarne</font></span><span>从研究室又走进了大学，直接面对大学的新学生！</span></p>
<p><span><font face="Times New Roman">C++</font></span><span>是</span><span><font face="Times New Roman">Bjarne</font></span><span>生命中最重要的事情，而还有一些更有意义的事情。</span></p>
<p><span>他对大学教育情有独衷，他现在是</span><span><font face="Times New Roman">A&amp;M</font></span><span>大学的教授，这种行动便是很好的说明，在这里，以一种在</span><span><font face="Times New Roman">AT&amp;T</font></span><span>研究所中无法采用的方式将研究和教学结合起来。他认为教学是一种与工业生产不同的能影响世界并使其变得更加美好的方式，而且大学里的研究工作的成果与曾经进行的工业研究的并不相同</span><span><font face="Times New Roman"> - </font></span><span>不是说它更好，仅仅只是不同而已。</span></p>
<p><span>他的一些教育观点也非常值得我们深思：</span></p>
<p><span>他说，不要只学习计算机和编程，要积累一种或多种领域的经验，要有其他专业知识，这样就能明白什么东西值得我们去编程实现。另外，学习多种语言也是他一再强调的，如果只学一种，容易导致想象力的僵化。他本人爱好广范，精通多种计算机语言。</span></p>
<p>&#160;</p>
<p><span><font face="Times New Roman"></font></span>&nbsp;</p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><strong><span>问：您觉得怎样才是学编程的好方法？学习语言时一种好的工具是不是必需的？</span></strong></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><font face="Times New Roman"> </font><span>这是过去一年左右里一直占据我大部分注意力的一个问题。我志愿教授电子工程<span>/ 计算机工程专业大学一年级的学生编程，我认为我们目前教编程的传统方法不够严谨也不够广阔。我们社会的文明进步是建立在软件上的，因而必须培养更好的软件专家。我认为已经到了我开始培养新手程序员的时候了，在我此之前我都是把精力放在专家上。我基本的设想是让学生成为专家，使他们最终能够编出可靠并且别人可以信赖的软件，这就意味着在培养新手时要求更高，要将重点放在对程序正确性和处理错误的训练上。既然目标是为了制造现实世界中可用的软件，我也非常重视标准库的应用和设计。对于C++标准库工具的教学，例如向量（vector）和字符(string)从第一周就该开始应用，在第一个月之内类（class）就应该介绍，在第二个月之内介绍图形（graphics）和继承性（inheritance）。这种方法和传统的方法不同，那些教学方法往往花费数周的时间来区分那些令人迷惑的C++基本类型，并且浪费宝贵的时间来处理诸如声明和循环上的一些迷人耳目的语法细节。我称我的方法为&#8220;深度优先法&#8221;，因为我们首先教我们的学生足够的知识去做一些有用的工作，然后才在这有限的基础上拓宽他们的理解能力和对工具的使用能力。</span></span></p>
<p><span>我所有的教学都是在实例的基础上进行的。我通过典型的例子来使学生理解，用亲身的体会来解释一些规则。自然地，我要求学生写大量代码</span><span><font face="Times New Roman">—</font></span><span>如果你不读也不写大量代码的话你就学不会编程。第一阶段如下，学生必须经过亲身写代码，体会解题过程中出现的实际问题；第二个阶段必须好好体会亲身所犯的错误，并且学会克服他们。这其中，调试、错误处理，还有学会将大问题分解成小问题，从最小的组件来编程是非常重要的。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><strong><span>问</span><span><font face="Times New Roman">:</font></span></strong><strong><span>数学和计算机科学有什么关系吗？</span></strong></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><font face="Times New Roman"> </font><span>两者并没有很强的直接联系，但是有一部分编程的实质包含在里面<span>-- -象学数学一样，编程有时也需要很严密的思维。自从古希腊以来，数学就被用来训练人们的逻辑思维，并且我觉得如果不用数学的话很难想象怎样才能编出好程序来。当然也有一些计算机领域，用到高深的数学知识。然而，这些领域通常是非常专业的。数学，特别是数学思维是计算机的一个支柱。经验主义是另一支柱，通过观察和测量来帮助理解实际的发展，用以调整我们的系统和行为。两方面我们都需要。计算机科学不是仅仅用来证明定理的，也不是仅仅用来收集数据的。为了有效地实践计算机科学和发展高质量软件，更同时需要数学和经验的训练。</span></span></p>
<p><strong><span>问：</span></strong><font face="Times New Roman"> </font><strong><span>您以前在欧洲学习而现在在美国工作，您觉得欧美有什么学术传统区别？怎样才算是一种好的大学教育呢？尤其对计算机科学来说。现在的大学有部分学生中途退学，您怎样看待这一现象呢？</span></strong></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><span>这很难回答。欧洲和美国都幅员辽阔，而且有很多不同的学术传统。真的不好总结，并且在两地都有一些非常好的大学科系，这不是很容易区别和下结论的。</span></p>
<p><span>很少有学生离开学校去开公司，较多的是离开学校去从事一些有较高收入的工作，但大多数人还是完成了学业。我印象中那些放弃了计算机科学学习转而投入业界工作的是会为此感到后悔的。从长期眼光来看学位对一个好工作来说是重要的，特别是学生在他们最后一年或最后几年的学习。当然也确实有些相反的例子，但那些人通常永远不会再从事真正的技术工作，而转为商业管理人员了，如果那是他们想做的，那一个学位并不是必须的。我一直认为<span>:一个学生如果还未获得学位，最好不要离开学校。</span></span></p>
<p><strong><span>问：我们经常批评我们现在的<span>C++教育不够现代、不够科学，您是通过&#8220;深度优先法&#8221;来教授学生的，您是否觉得在一个学生学习早期有些难吗？我们该如何做呢？</span></span></strong></p>
<p><strong><span>Bjarne Stroustrup</span></strong>：<span>这是必然的。传统的教授编程的方法是不行的，学完这些课程的学生写不出很好的代码。说得更激进一点，他们甚至不知道什么是好的代码！我的方法可以避免这种情况发生。我已在<span>300 名学生身上实验成功。对于程序员来说这是非常关键的——包括新程序员——了解基本概念和基本技能。但仅仅了解程序设计语言的基本构造是不够的。另一方面，如果没有一种编程语言我们就不可能教授编程的技能和规则，因此，对一种语言工具充分掌握，做尽可能多的练习是必需的。</span></span></p>
<p><span>很显然，这种教育问题不仅仅局限于<span>C++语言。我的方法可以应用于任何其他语言。</span></span></p>
<p>&nbsp;</p>
<h2><span>面向金钱、面向未来和面向对象</span></h2>
<p>面向对象是个有趣的问题，<span>C++正是和面向对象有着非常联系的语言，作为一种非商业化语言，他已经影响了世界范围数十亿美元的设计决策。而还有许多语言具有这种特点,因而，关于各种语言的争论喋喋不休地进行了几十年。</span></p>
<p>当有人问<span>Bjarne Stroustrup先生：有人说Java是纯粹面向对象的，而C#更胜一筹，而还有很多人说它们纯粹是面向金钱的。以您之见呢？</span></p>
<p><span>Bjarne 的回答非常风趣：我喜欢&#8220;面向金钱&#8221;这个词 :-) 还有Andrew Koenig的说法"面向大话"我也喜欢。C++可不面向这两个东东。对这点我还想指出，我认为纯粹性并非什么优点。C++的优点恰恰在于其支持多种有效的编程风格（多种思维模型吧，如果你一定要这么说）及其组合。最优雅最有效也最容易维护的解决方案常常涉及到一种以上的风格（编程模型）。如果一定要用吸引人的字眼，C++是一种多思维模型的语言。在软件开发的庞大领域，需求千变万化，起码需要一种支持多种编程的设计风格的通用语言，而且很可能需要一种以上呢。再说，世界之大，总容得下好几种编程语言吧？那种认为一种语言对所有应用和每个程序员都是最好的看法，根本就是荒谬的。</span></p>
<p>他上面的回答很好地告诉了我们面向对象和面向金钱的关系，也给我们的争论划上了圆满的句号。</p>
<p><strong><span>问：您对面向对象是怎样理解的？它是不是一种好的可接受的编程思考方式？有没有学习</span><span><font face="Times New Roman">OO</font></span></strong><strong><span>必须的有用的工具？</span></strong></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><span>OO 技术在现在软件发展的扮演了非常重要的角色，但并不是唯一的方法。象泛型程序设计（generic programming）,用C++ 模板是另一种方法，这些方法必须通过综合应用来，才能创造出：一流的、最可读的、最易于维护的、最高效的程序。但没有任何一种方法是适合所有要求的。</span></p>
<p><span>我主要用<span>C++来编程。我觉得C++是一种学习和实践OO思想很好的编程语言。</span></span></p>
<p>&#160;</p>
<p><span>图</span><font face="Times New Roman"> </font><span>敢问路在何方</span></p>
<p><strong><span>问：</span><font face="Times New Roman"> </font></strong><strong><span>您能对</span><span><font face="Times New Roman">IT</font></span></strong><strong><span>的将来做一下预测吗？将来我们最有可能用什么语言</span></strong><span>？</span></p>
<p><strong><span><font face="Times New Roman">Bjarne Stroustrup</font></span></strong><strong><span>：</span></strong><span>一个聪慧的幽默大师曾经说过：预测是困难的，特别是对将来的预测。但是我认为未来十年之内我们用的东西在今天的实验室里是能够看到的。另外我们将用的最主要的语言也是今天最主要的。我们不可能因为一些新东西和一些更好的东西的出现就重组整个工业领域，因此在五到十年之内，我们还是用<span>C, C++, COBOL, Fortran, Java, Perl, Python，也许还有C#，和其它许多种语言。没有一种语言能适合所有用途，并且好的程序员都懂并且都能用好几种语言。懂好多种语言和多种程序设计技术会使我们可以更好地编程。</span></span></p>
<p><span>对于<span>IT我不想说太多，很显然：我们会继续依赖IT并且它会延伸到越来越多的领域。当然，肯定会有失败，通常是因为过度的滥用引起的——但是在十年以后我们受IT的影响肯定要比今天大得多。</span></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<h2><span>人物印象</span></h2>
<p>&#160;</p>
<p><span><font face="Times New Roman"></font></span></p>
<p><span>很幸运，通过电邮采访的同时终于有机会和大师面对面。想象中的大师和面对面见到的有太多的意想不到，用一个词来形容是&#8220;谦逊&#8221;。</span></p>
<p><span><font face="Times New Roman">Bjarne</font></span><span>到杭州下了飞机，便扑向美丽的西湖，同去的是他的好友</span><span><font face="Times New Roman">STL</font></span><span>之父</span><span><font face="Times New Roman">Alex Stepanov</font></span><span>先生。在未去杭州之前，</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生通过电邮告诉我杭州城的美；去了之后，少有的好天气让我们碰上了，爽；夜里在旅馆见到了久违的大师，一夜之间见到两位大师，更爽！</span></p>
<p><span>我对</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生有着特殊的感情，觉得他象位慈父，而他正和我的父亲同样的年纪。大师，慈父！接触越多，对</span><span><font face="Times New Roman">Bjarne Stroustrup</font></span><span>先生的感触越深。到了杭城，见到大师其人，这种感觉越来越浓厚，他又象海，既有热情，又能包容。</span></p>
<p><span>采访大部是通过</span><span><font face="Times New Roman">E</font></span><span>—</span><span><font face="Times New Roman">mail</font></span><span>进行的，采访的过程中对我的问题孜孜以求，给我的回答细微备至，</span><span><font face="Times New Roman">E</font></span><span>—</span><span><font face="Times New Roman">mail</font></span><span>的好处在此发挥到了极致，大洋这边的我沐着阳光，那边的他在挑灯夜书。</span></p>
<p><span>唯有谢谢众多</span><span><font face="Times New Roman">C++</font></span><span>程友和非</span><span><font face="Times New Roman">C++</font></span><span>朋友对我的支持，唯有大师再来杭城时，到最好的茶馆将上好的龙井泡上，亲手送到大师的手中！</span></p>
<p align=right><span><font face="Times New Roman">2004</font></span><span>年</span><span><font face="Times New Roman">12</font></span><span>月</span><span><font face="Times New Roman">19</font></span><span>日</span></p>
<img src ="http://www.cppblog.com/susu/aggbug/21412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/susu/" target="_blank">学习才能进步</a> 2007-04-06 16:35 <a href="http://www.cppblog.com/susu/archive/2007/04/06/21412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>去掉桌面图标的背景颜色四法！ </title><link>http://www.cppblog.com/susu/archive/2006/04/21/6000.html</link><dc:creator>学习才能进步</dc:creator><author>学习才能进步</author><pubDate>Fri, 21 Apr 2006 02:22:00 GMT</pubDate><guid>http://www.cppblog.com/susu/archive/2006/04/21/6000.html</guid><wfw:comment>http://www.cppblog.com/susu/comments/6000.html</wfw:comment><comments>http://www.cppblog.com/susu/archive/2006/04/21/6000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/susu/comments/commentRss/6000.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/susu/services/trackbacks/6000.html</trackback:ping><description><![CDATA[
		<p>经常有人遇到这样的问题：默认情况下电脑桌面上的图标背景色都是透明的，但有时不知道为什么图标突然有了背景色，很不好看。特别是图标很多的时候，下面告诉大家几个去掉背景的方法：</p>
		<p>① 我的电脑-右键-属性--高级-性能-设置--视觉效果 ， 选中“在菜单下显示阴影” </p>
		<p>②如果不行就看看：桌面右键-排列图标-“在桌面上锁定web项目”，选了那一项就会不透明   </p>
		<p>③还是不行的话：桌面右键－－属性－－桌面－－自定义桌面－－Web－－把所有的勾都去掉 </p>
		<p> ④ 最后一招 ：在“运行”中输入“gpedit.msc”，打开组策略；在“用户配置→管理模板→桌面→Active  Desktop”中，点活动桌面属性选定“未被配置”，点禁用活动桌面属性选定“已禁用”；最后打开控制面板，在经典视图中打开系统，在“性能→高级选项→性能→视觉效果”里选取“在桌面上为图标标签使用阴影”即可(默认情况下，最后一步可忽略)。</p>
		<p>经过以上几步基本可以去掉桌面图标和文字的背景色了。。</p>
<img src ="http://www.cppblog.com/susu/aggbug/6000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/susu/" target="_blank">学习才能进步</a> 2006-04-21 10:22 <a href="http://www.cppblog.com/susu/archive/2006/04/21/6000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>