正在阅读:C++语言风格流变史C++语言风格流变史

2005-05-19 15:11 出处: 作者:王咏刚 责任编辑:xietaoming

7. 读不懂的代码——兼容并包的语言风格

    说到标准C++语言风格,有必要给大家看一段非常古怪但也非常有趣的代码。你看得懂下面这段C++代码吗?它是真正的C++代码吗?

%:include <iostream>
using namespace std;
%:define MAX 5
void main()
<%
    int m<:MAX:>;
    int i = 1;
    for (i = 0; i < MAX; i++)
    <%
        m<:i:> = i;
        if (i not_eq 3 and i < 5)
            cout << i << endl;
    %>
%>

    这是我自己编写的一段代码。你也许无法在Visual C++环境下运行它,但它的语法的确符合1998年C++标准的规定。在GNU C++环境下,我曾成功地将其编译为可执行程序。

    简单说来,这段风格诡异的C++代码其实是根据C++标准中关于可替换标记(Alternative Tokens)的规定而编写的。该规定的设计初衷是要适应欧洲某些国家的标准字符集缺少“{”、“#”等标点符号(特别是在一些传统的终端设备上)的现状。严格地讲,这算不得一种真正的语言风格,但类似的规定的确体现了ANSI/ISO委员会在语言设计上兼容并包的宽广胸襟。

8. C++Builder——Borland的复兴之路

    Borland公司在发布了Borland C++ 3.1之后,就因为不思进取而将C++开发工具的市场拱手让给了Microsoft[4]。在经历了Borland C++ 4.0、4.5和5.0等版本的失败后,1997年,Borland推出了全新的C++开发工具C++Builder。这个在市场上为Borland挽回了颜面的产品不但在界面风格上与Borland的支柱产品Delphi别无二致,甚至还在产品内部直接照搬了Delphi的VCL(Visual Component Library)库。结果,使用C++Builder开发的代码天生就受到了Delphi风格的传染,长相酷似Pascal语言了(以下代码取自C++Builder 6.0的示例代码):

class TFormClrDlg : public TForm
{
published: // IDE-managed Components
    TColorDialog *ColorDialog;
    TButton *Button;
    TPanel *Panel1;
    void fastcall ButtonClick(TObject *Sender);
private:    // User declarations
public: // User declarations
    virtual fastcall TFormClrDlg(TComponent* Owner);
};

    说实话,尽管C++Builder在市场上的表现不错,但我还是不喜欢Borland将C++语言与Delphi中的Object Pascal语言刻意混淆的做法。也许在Borland这种做法的背后有提高产品通用性、缩短产品开发周期等体面的理由,但使用C++Builder开发出的代码在外表上已经离标准C++风格越来越远了。

    值得注意的是,Borland于2003年推出了其下一代C++开发工具 ——C++BuilderX。让人哭笑不得的是,这一次Borland居然将C++开发环境构筑在了用Java语言实现的PrimeTime平台上,这多少将C++语言推向了一种极为尴尬的处境。不过,C++BuilderX也为我们带来了一些好消息:在后续的版本中,C++BuilderX将集成vxWindows框架库[5],在这种框架下开发的C++代码显然要比使用VCL的代码具备更多的标准C++风格。

9. Visual C++ .NET——革命还是叛逆?

    Microsoft将C++引入.NET环境的举动其实比Borland还要激进。单从风格上说,使用Visual C++ .NET开发的代码可能兼具MFC、ATL、标准C++、.NET托管代码等多种不同的风格。其中,对C++语言本身影响最大的,当然要数.NET托管代码为C++注入的若干新鲜血液了:

#using <mscorlib.dll>

using namespace System;
using namespace System::Reflection;
using namespace System::Security::Permissions;

public __value enum SomeStuff {
    e1 = 1,
    e17 = 17
};

[attribute(AttributeTargets::Class, AllowMultiple=true)]
public __gc class ABC {
public:
    ABC(int __gc[]) {}
    ABC() {}
    ABC(int) {}
    ABC(int, float) {}
    ABC(SomeStuff) {}
    ABC(String*) {}
    int rgnField __gc [];
    double rgdField __gc [];
    double dField;
};

    上述代码来自MSDN中的示例程序。看到Microsoft大刀阔斧地为C++语言引入的垃圾收集、Attribute属性等新特性和新技术,看到.NET托管代码新奇得近乎离经叛道的语言风格,我不知道是应该为Microsoft在发展通用语言平台上的努力而欢呼雀跃,还是应该为C++在C#语言阴影下日渐屈居.NET大戏中的配角而灰心丧气。也许,语言风格和程序员的感受在Microsoft眼中,都是些不值一提的小事,它们哪能和.NET的宏伟战略及Microsoft的强大帝国相提并论呢?

10. 回顾和展望

    语言风格的变迁从一个侧面反映了技术思想和产业需求的嬗变规律。从1979年Stroustrup完成第一个Cpre预处理程序算起,C++语言来到这个世界上已经快满25个年头了。这是一种在实践中诞生、成长和发展起来的语言。也许,Stroustrup从一开始就压根儿也没想把它设计成像Smalltalk那样纯粹的面向对象语言。开放性、高效率、兼容性和扩展性的需求将C++语言塑造成了一种典型的多模式(Multiparadigm)语言。无论是C++早期对Simula语言的继承,还是后来对Smalltalk、Ada、Clu等语言的借鉴,无论是ANSI/ISO标准风格的迅速普及,还是Visual C++ .NET在技术创新上的不懈努力,所有这些历史变迁都说明,C++在风格上的多样性主要源自C++语言本身“海纳百川”的胸襟和气概。

    5年以后,当C++步入而立之年的时候,它会给我们带来新的惊喜吗?我们还会看到更加新奇的C++语言风格吗?也许,没有谁能给出准确的答案。但作为程序员,我们至少应该知道:无论面对什么样的软件需求,无论使用什么样的思维方式,C++语言都赋予了我们选择语言风格的最大自由;当我们真正理解了C++语言的精神实质之后,这种自由也必将成为所有优秀软件和优雅代码的坚实基础。

参考文献

[1] 刘勰. 文心雕龙·序志.
[2] Stroustrup B. C++ 语言的设计和演化. 北京: 机械工业出版社, 2002
[3] Stroustrup B. Learning Standard C++ as a New Language. C/C++ Users Journal. pp 43-54. May 1999.
[4] 李维. Borland 传奇. 北京: 电子工业出版社, 2003
[5] 李维. 细说Borland C++BuilderX. 程序员. 2003.11

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品