为什么使用C++

问题

为什么使用C++?在你皱眉准备关掉这个网页之前,试着回答这样一个简单的问题。

答案是效率,是吗?每个人都知道答案。但是,我们应该以更专业的角度来讨论一种编程语言或是与之相关的事情。那么,让我再问你一个问题:效率是否是人们选择使用C++的唯一理由,为什么他们不用C呢?C的效率公认比C++高(当然,我知道,现已证明在某种程度上说,C并不比C++高效,但请不要在此挑错,因为即使他们是等效的,问题仍然存在)。

神话

我知道你可能会说,这是一种“择优选择”,因为毕竟C++就是设计成了C的优化,是C的扩充,可能它没有想象中的那么高效,但同时它却有很多梦幻的高水平的特征。那么问题就归结为“开发者真的需要这些梦幻特征吗?”我的意思是,毕竟我们都听说过KISS(Keep It Simple,Stupid!保持简单)和stuff(材料),我们也都听过这种说法——与C++相比,C更KISS,所以我们应该选择C。这样无休止的争论使得C和C++之间的比较变成了一个神话(或者是一片混乱)。令人惊讶的是,似乎很多人倾向于C,而理由是C++太难正确使用了。甚至是Linus也这么想。

这种现象产生的真正严重的影响是,驱使更多的人在C与C++之间权衡利弊的时候,他们选择了C;一旦他们开始使用C,他们很快就会感到满足和舒服,就是所说的“令人满意”的体验。这样,当争论产生的时候,他们就会站出来说与C++相比,C是更好的选择。而实际上,他们都没有真正试着使用过C++,或者他们根本不是足够好的C++程序员。而真实的答案,往往开始与“它取决于”。

那么,我说过“它取决于”,取决于什么?显然,在一些领域选择C比C++更好。例如,设备驱动程序的开发通常就不需要OOP/GP(面向对象程序设计/概念编程)技术。它只需要简单的数据操作;最重要的是,程序员能正确的知道系统如何工作,以及他们该做什么工作。再考虑OS(操作系统)的开发,我自己从来没有参与过任何OS的开发,但是读过大量OS代码(大部分是Unix),我感觉很多OS重要部分的开发也都不需要OOP/GP技术。

但是,这就意味着,在所有强调效率的领域,C都比C++好吗?实际上不是。

答案

让我们具体问题具体分析

首先,当人们关心效率的时候,实际上就关心两类效率——时间效率(例如:OS,运行时间,实时软件,高要求系统)和空间效率(例如:所有嵌入式系统)。但是,这种分类并不能真正帮我们决定应该选择C还是C++,因为C和C++在时间和空间上都是非常高效的。真正影响我们选择哪种语言(当然是在C和C++之间)的是商业逻辑(这里的“商业”并不是指“企业应用商业”)。例如,是不是使用OOP/GP来表达逻辑更好,或者是不是除了考虑数据和程序还应该考虑保持软件美观。

从这点上来说,我们可以模糊地把应用分为两类(当然前提是我们只关心C/C++,不关心java/C#/ruby/erlang等):低水平应用和高水平应用。低水平应用的意思就是,在这里并不需要那些梦幻抽象如OB(基于对象)/OOP和GP;高水平的意思当然就是需要了。显然,在所有需要C/C++的领域(由于它们的高效性)里,有大量“高水平”应用(参看在Bjarne Stroustrup主页上列出的),在这些领域,C++就会更有用。

不过,换个角度想想,即使在这些领域,程序员在他们的代码中不使用那些高水平的抽象,还是有他们应该使用C++的理由。为什么呢?因为你的代码不使用类和模板并不意味着不使用类库。考虑所有便捷的C++类库工具(即将有校准扩展tr1/tr2)的实用性,我认为在这些情况下,有非常充分的理由选择C++——编码的时候你可以仍然使用C的形式(以任何你想要的方式来保持KISS)。同时,你还可以使用强大的C++类库(例如,STL标准模板库,tr1/tr2组件等)。最终,就会发现这件可能会被很多人忽略的事情——有时KISS依靠抽象。我想,Matthew Wilson在他的新书“Extended STL,Vol1”的序言中,极其透彻地阐明了这个观点。书中提到了两段代码,分别用C和C++编写:

时间: 2024-10-28 06:25:24