注:本文是我为《程序员》第11期技术专题《C++凤凰涅磐》所撰写的文章节选,未经许可,任何组织不得转载。
另:本文是节选,全文可见于11期技术专题。该专题除了有这篇访谈的全文之外,还有Stan Lippman和李建忠先生为了他们合作的新专栏“C++/CLI锐利体验”而给中国C++程序员们写的信,以及其他C++/CLI相关的文章。
------------------------------------------------------------------------------------
记者:你们是什么时候开始设计新的C++/CLI的呢?目的是什么?我的意思是说,你们觉得Managed C++ Extension失败了,是吗?
Stan:微软聘请我的时候,我对管理层的每一个人说,Managed C++把我惹火了,我明确告诉他们我不会是一个听话的士兵。当年我跟Bjarne Stroustrup一起工作的时候就是这样,对一些事情我有不同意见,我发表了我的意见,而且也做了必要的努力。当然最后可能是别人赢了,我的意见可能被搁在一边,但我不会是个顺民。
说正经的,如果要说Managed C++有一点成功之处,那就是它还能用,而且是把现有代码移植到新平台上的唯一途径。这真的很了不起,我确实感到惊讶。但是从编程语言的体验来讲,它实在是不怎么样。我觉得一部分原因是,MC++的设计者(对于标准C++)过分虔诚了。我比他们更敢于得罪Bjarne,而后来公司的Herb Sutter比我还勇敢。他们应该更坚定一些,他们太缩手缩脚,不够大胆。我在贝尔实验室学到一件事情,那就是你应该对你认为正确的东西保持坚定的信心和热忱。
我想说,MC++确实能够工作,而且是把C++放到.NET中并且包装起来的惟一办法。但是,它不是C++,它的实现就语言而言是不自然的,这一点伤害了很多人。
我之前说过,CLI并不仅仅是微软的平台,它是目前唯一有前景的技术。Java已经基本到头了,我是说它只是一种技术而已,它没有更远大的目标了,它已经竭尽所能了。而.NET是当前唯一一种前景远大的技术。就算这一代的编程语言发展到尽头,也不意味着这个平台本身发展到了尽头。所以,对一种语言来说,如果打算超越原生代码,就必须移植到.NET上。这就是我对C++的义务。(设计C++/CLI)的工作开始以后,很多人参与其中,尤其值得称道的是Herb Sutter,他非常非常重要,C++社群里的很多人都贡献了自己的力量。我很高兴。但是你知道,这并不能归功于我。
C++的路线是Bjarne确定的,我当然觉得这条路线是很成功的,我对于ISO C++的发展方向感到很振奋。但是,我确实不认为ISO C++有多么有趣,我说这话不是要冒犯谁,只是谈我的真实看法。ISO C++很了不起,但是它跟C99一样,只是对语言机制的一些修补和加强。它没有给我提供线程机制,也没有网络的支持。这事放在21世纪,简直是是一种犯罪。而.NET提供了完备的支持库。在我看来,这是C++早就应该做的事情。
你知道,整件事情很令人惊喜:我离开了C++的发源地,贝尔实验室,也没打算再回去,然而我居然还能够参与C++的改进工作,我很高兴。其实我并不认为现在的C++/CLI就很完美了,不过我们已经有了一些非常棒的想法,你们会在下一个版本里看到。
这对C++社群当然是一个挑战。我个人感到ISO C++社群已经变成一个闭关自守的社群了,我们要把它打开。这当然不是一个能取悦所有人的事情。有些人对我们的做法很反感。这跟当年发生过的事情是一样的。当年Bjarne创造C++的时候,很多用C的人也很反感。C++刚出来的时候,有些人觉得它是有史以来最烂的语言。他们要抛弃那些导致性能下降的机制,把虚函数戏称为“破烂函数”。我是说,在实验室内部就存在着这样对立的两派。现在我看到这一幕在重演,有些人警告说,微软正在搞阴谋。我们尽了很大的努力,虚心地听取社群的意见,邀请他们,倾听他们的声音,这一切正如Bjarne在1980年代中期所做的一样,当时他获得了管理层的许可,直接询问IBM和Apple对新语言的看法,其范围和深入程度超过了管理层事前的预期。我的观点是,我们是在发扬Bjarne的精神。所以我想,就算他不是绝对支持我们的做法,也不会是完全反对。
记者:Bjarne并不完全支持C++/CLI,是吗?
Stan: 他根本不需要如此。他本人就参与了这项工作。我和Herb Sutter在牛津的一次C/C++使用者会议上跟他交谈过,我们向他展示我们的设计,Herb花了很大的力气深入细节,Herb真是一个强人,他非常善于深入细节,相比之下我并不是一个很喜欢深入细节的人。我们每星期都跟他开会。Bjarne会建议我们采纳不同的思路,更重要的是,我们都能听到他的想法,他也知道我们的目的,所以,我觉得我们搞出来的这个语言还是不错的。
记者:也就是说,您觉得C++/CLI已经成功了?我是说,这次革新已经成功了?
Stan: 要我说,是一次进化,而不是革新,跟Bjarne当年往C中加入抽象数据类型和面向对象一样。在这些过程中,在不同的设计范型(paradigms)之间,总是会出现一些不和谐。跟CLI的整合是很困难的,因为CLI是最高统治者。举个例子,你试图在基类构造函数中调用派生类的虚函数,这应该是非法的,因为那个时候派生类对象还不存在,但是因为CLI的统治,我们对这种非法行为无能为力。再比如,如果你想绕过值类型的缺省构造函数,在CLI的统治下,也是不可能的。我是说,我们确实不得不在很多地方向CLI让步。那么是不是说我认为CLI问题多多呢,完全不是。像值类型构造函数这种问题很复杂,我无法在这里说清楚。总而言之,CLI还是不错的。
在微软内部存在很多争论,我并没有赢得每一场争论,即使我认为我应该赢,也不一定能赢。没人能百战百胜。但是Herb Sutter有能力使大家达成共识,从而确保C++/CLI在一个动态编程环境中拥有美好的未来。我认为C++/CLI是C++面对Java和C#挑战的一个合理的反应和完善。
记者:C++/CLI在未来的.NET平台上将扮演怎样的角色?
Stan:我们希望它能变成.NET平台上的系统编程语言。就是说,它可以用来开发那些驱动一切的程序。你不可能用C#来写.NET驱动程序,也不能用C#来写C#编译器,起码现在不行,但你可以用C++/CLI做到。你可以在C++/CLI上达到最高的效率和最大的能力,因为我们对于CLI模型的整合更为完整深入。C#的编程模型跟C++/CLI相比是有所不及的,没有我们这么“先进”。所以我觉得,如果你以前是一个C++程序员,现在打算学习.NET,C++/CLI是一个很好的选择。.NET编程是让人兴奋的,而C++/CLI让你能够发掘.NET的全部能力,这真的是很让人兴奋的事。
坦率的说,我对传统的编程已经感到厌倦了。我以前在梦工场的时候,在那里构建了一个Linux开发平台,在其上进行软件开发。这本身确实没什么不对,但是我的感觉是一下子回到了20年前。我被绑在了GCC上,这让我感到不舒服。我找到了更好的编译器,更快,产生的代码质量更好,但是我不能用,我们要确保与GCC的二进制兼容。这些事情让我烦燥,我觉得我花了20年时间改进计算平台,却一下子一无所得。
相比之下,.NET真的是一个有趣而又富于创新的技术。我经常跟人说,并不是因为我在微软,我才说.NET好,而是因为我觉得.NET好,才决定加入微软。
对于一个C++程序员,你可能跟我一样觉得.NET很有趣,C#当然是一个不错的选择,事实上我就写过一本C#的书。但是说实话,C#有点“傻瓜”。对于很多人来说这是好事,我们并不希望所有的人都被拖到机器层次上。但是如果你想要那种最终的能力,而且你有把握运用好,那么C++/CLI就是你的选择,此外别无他选。我觉得我们的工作赋予你们这样的能力,我自己就渴望这样的能力。