C++断想

荣耀  2002

C++是一 门多范型(multi-paradigm)编程语言。

C++并非单单具有面向对象特性,它支持面向对象以及另外数种有用的编程风格。比如基于过程(procedure-based)、基于对象(object-based)、面向对象(object-oriented)、泛型编程(generic programming)等等。

那些具有根深蒂固的C情结的C++程序员大都习惯于生活在C风格程序设计之中,面向对象开发者则对OO风格着迷,而严肃的(前卫的)程序员正在探索着泛型编程技术

C++语言之所以如此成功,并不是因为其鼓吹者的煽风点火,而是它很好地解决了它适合解决的现实问题,比如低阶系统设计、特定领域企业级软件设计等。在这些领域,尚没有第二门语言能够象C++这样,理想地解决目标问题。

迄今为止,也没有第二门语言能够象C++这样,吸引如此之多的智力投入。C++自身的复杂性和解决现实问题的良好能力,使得它极具工业、学术研究价值。在C++之后,语言越发趋于“傻瓜”。

C++自身已经有二十多年的发展历史,但标准C++还只是一门年轻的语言。C++的标准化,对其持续发展至关重要。

当大多数语言朝着深度面向对象的方向执著发展时,早在大约15年前,C++就义无反顾地向模板和泛型编程技术大踏步前进。对模板和泛型编程技术的强力支持,使得C++根本不同于其它编程语言。

仅仅掌握C++面向对象编程技术,而对模板和泛型编程技术懵懵懂懂,等于只学会了一半C++。

别指望垃圾收集会成为一等C++语言特性,它违背了不止一条C++设计理念。比方说,不应该为用不到的东西付出代价,遇到可疑之处就提供手工控制手段,所有语言特性都必须能够承受得起,等等。这些设计理念,大都带有浓厚的学院派味道。

Bjarne Stroustrup拒绝深入评价Java和C#,他说,“我不是任何专有语言的爱好者,而是开放的正式标准的爱好者。”这样的理由,冠冕堂皇,让人无话可说。但是,我们还是要考虑到这里面毕竟有个人性格、所处环境、文化背景以及历史因素在内。

任何伟大的人物在从事任何伟大的事业时,都难免掺杂个人动机在内。一位语言设计师之所以会设计一门新的语言,首先应是出于对现有语言的不满,并对自己的语言设计理念坚信不疑。

C++最初的成功很大程度上是因为它完整地兼容C,C++最初的卖点也不过是更好的C。但长期以来,Bjarne Stroustrup最想从C++中拿掉的东西正是那些为了和C保持兼容的特性,这多少都具有一些讽刺意味。今天,Bjarne Stroustrup说,用C++来写C风格的程序对大多数应用来说不是使用C++的最佳方式,要成为真正的C++行家里手,你必须合理使用C++所提供的抽象机制和类型系统。

D&E一书中,Bjarne Stroustrup说道,“我们的历史从来都不是一张白纸,仅仅提供一种东西是不够的,我们还需要使人们能够从旧工具和旧思想转变到新东西中来。因此,假如C没有摆在那儿,C++无需与之兼容,我也会选择与另外的某种语言大体上兼容。假如一种作为基于C的语言但带有重大的不兼容性,或者想让一个白手起家的语言得到广泛应用,都会遇到更多的麻烦。”

这就是这门语言设计者的自白。这种设计出发点和Java以及C#是截然不同的,对设计哲学的不同崇尚,导致了今天存在这些不一样的语言,而对某种设计哲学的普遍认同,导致Java和C#如此酷似,而这,又无不与语言产生的历史背景和时代要求有关。

永远都不要指望Bjarne Stroustrup和ANSI/ISO标准委员会会从C++中拿掉象多重继承这样的诡异的玩意儿,或许,缺了诸如此类的语言特性,C++就不再是C++了。

一个人总可以站在自己的立场,杜撰出一套利于自己并力图说服别人的论点和论据。D&E解释了为什么C++会成为今天这个样子,你可以对Bjarne Stroustrup的解释点头称是,也可以对Bjarne Stroustrup的某些辩解不以为然,但是,从Bjarne Stroustrup对语言设计的折衷权衡考虑之中,我们应该能够领悟到不少语言设计乃至软件设计的思维方法。

D&E是、但也不仅仅是一部语言设计者的自我辩词。

单从诞生时间来看,C++是有些年头了。和Smalltalk、Eiffel这样的语言相比,C++的普及应用范围之广,有目共睹,和Java、C#这样的“现代语言”相比,似乎它不够时髦,但有一点毋庸置疑:C++在它擅长的工业领域取得的成就,现在将来Java和C#都难以望其项背。

C++会过时吗?对这个问题的最好的回答是,C++所擅长解决的问题领域会过时吗?或者说,C++所擅长解决的问题领域会消失吗?

Java和C#会危及C++的地位吗?Java已经存在数年,并已取得巨大的商业上的成功,但今天C++仍然保持着良好的发展势头,C#同样也没有能力挤掉C++。

我们可以注意到,和当初C++诞生时以“更好的C”为宣传口号不一样,今天,包括它的创建者在内,从来都没有人说过C#是更好的C++,尽管C#借用了大量的C++语法表达形式,但C#(也包括Java)同C++的设计理念存在着根本不同,因为它们要解决的目标问题领域,大不一样。

在C++所擅长解决的问题领域,比如说,低阶系统程序设计和严肃的嵌入式系统设计领域,C++真正的竞争对手,目前也只有C。事实上,在过去十几年以来,在C++的压力下,C的地盘就在不断紧缩。以后也不大可能在相同的领域出现可以和C++一较高下的语言。

在大多数高阶程序设计领域,许多语言都可以完成C++能够完成的任务,有些任务用别的语言甚至会比C++来得更便捷,但C++在运行效率、灵活性以及用户社团背景、资源等方面的优势,使得它一直处于有利的竞争位置。

但我相信 事实也已经证明,C++在攻城掠地的同时,也被Java、Object Pascal以及C#这样的语言所挤压,在某些高阶程序设计领域,C++的领地已经呈现紧缩趋势。

C++已经足够成熟,同时还有更加惊人的智力投入来保持其持续发展完善。但标准委员会的委员们向来都是以保守而不是激进而著称,不要指望ANSI/ISO标准委员会会轻易向C++语言自身加入更多的特性它已经够复杂的了,也别指望它们会轻易对C++进行删繁就简。

C++说到底不过是一门语言而已,它并非是一个系统或平台 — 它也拒绝成为一个系统或平台。作为一项国际标准,保持自身的纯洁至关重要。不过,可以肯定,已经成为标准C++的一个重要组成部分的标准库,将会不断膨胀。

从某种意义上说,库就是C++的平台。

-完-