您怎么看待 C++/CLI?

来源:互联网 发布:php soap 传json 编辑:程序博客网 时间:2024/04/30 06:18
  来源:蚂蚁的 C/C++ 标准编程 作者:Bjarne Stroustrup 翻译:antigloss 等级:强烈推荐
发布于2007-02-03 15:53  

    C++/CLI 是对 ISO C++ 的一组扩展,它将 C++ 和微软的 CLI(通用语言架构 Common Language Infrastructure)极其完整地“捆绑”在一起。它已经通过 ECMA 进行了标准化(ECMA-372)。我很高兴它(C++/CLI)使得 C++ 可以很容易地使用 CLI 的所有特性,也为它远胜于它的前任“托管 C++(Managed C++)”感到欣喜。然而,C++/CLI 为了达到这些目的,却对 C++ 进行了各种语言特性上的扩展,以迎合 CLI 的各种特性(接口、属性、泛型、指针、继承、枚举等很多很多),我对此深表遗憾。这将成为混乱的主要源头。C++/CLI 比 ISO C++ 多出了大量新的语言上的便利,这会诱导程序员(不知不觉地)编写出不可移植的代码,而且这些代码和 MS Windows 却有着亲密接触。

    CLI 提供了一套访问系统设施(facilities)和应用程序的接口,而这套接口却和传统的接口大相径庭。特别是,这套接口的语义不能完全或者便利地用传统的编程语言来表达。一种形容 CLI 的方法是把它当作(局部的)“平台”或者“虚拟机”。它包含一套庞大的语言特性(继承、方法、循环构造 (loop constructs),回调机制 (callback mechanisms) 等),支持一套庞大的基础类库(即 BCL),还有一个精巧的元数据(metadata)系统。CLI 有时也被称为“语言中立者”。然而,如果一种语言不大量引入 CLI 的特性,它甚至不能使用 .NET 的基本设施(或者 MS Windows 将要添加的设施,如果 MS 的计划不变的话)。而且,如果一种语言不能表达所有这些特性,那它就不能应用于这个实作(.NET),因为 .NET 的资源是为其它(支持这些特性的)语言服务的。因此,CLI 是“语言中立者”这种说法是仅仅建立在所有语言为了成为 .NET 上的“一流”,都必须支持 CLI 的所有特性这个基础上的。

    我更希望绑定是通过少数原语(primitive)来完成的,而且这些原语应该能被任何编程语言用简单的函数调用和数据结构来表示,或者把这些原语封装于语言特有的库里。而 CLI 最多只对全盘接受 CLI 设施的语言提供这种支持。为了生成 CLI 模块,编程语言必须能够表达 CLI 的全部特性,包括原数据。只有能做到这些的编程语言才能成为 .NET 的系统编程语言。进而,MS C++ 小组断定,只有内建语言特性才能被用户接受。他们的设计反映出来的思维是:带 C++/CLI 扩展的 C++ 可以使用 CLI 的任何设施;使用 CLI 设施时,(C++/CLI)比其它语言更加简练;和其它语言相比,(C++/CLI)绝无多余花销。他们的目标是使 C++ 成为主流的 Windows 系统编程语言。

    一如既往,我极力强调可移植性,并且建议程序员在设计应用程序时,通过 ISO C++ 中明确定义的那些接口访问系统特定的设施(例如不要直接使用 C++/CLI)。在 Windows 上,这样做有时会比直接使用 C++/CLI 的设施来的麻烦,但这是获取可移植性和降低(平台)销售商依赖度的唯一途径。当然,如果一段代码的目的是为其它代码提供 CLI 接口,那么这种间接使用 CLI 的方法也是难以维护的。请注意,我知道系统特定扩展的必要性,我也知道提供这种扩展的 C++ 销售商并非只有微软,我只是强烈希望这种扩展能通过 ISO C++ 允许的“小巧的接口”来实现。

    如何处理系统特定的扩展是一个固有的难题。微软 C++ 小组,特别是 Herb Sutter,一直都在和 ISO C++ 标准委员会的其他成员讨论这个问题,以期最终理清 ISO C++ 及其超集 C++/CLI 的关系。在 ISO C++ 标准委员会,我们已经作出了许多有建设性的合作。同时,为了避免混淆 ISO C++ 和 C++/CLI 扩展,微软正在修改 VC++ 文档,以期清楚地区分 ISO C++ 和 C++/CLI(单纯写 C++ 即表示 ISO C++)。我希望其他销售商也会跟随这种潮流。

    如何称呼 C++ 的 CLI 绑定/扩展是一个充满争议的难题,我个人倾向于使用 C++/CLI 作为“ISO C++ 的 CLI 扩展”的缩写。在名称中保留 C++ 可以提醒人们(C++/CLI 的)基础语言是什么,并且有助于保持 C++ 为带 C++/CLI 扩展的 C++ 的严格子集。C/C++ 兼容性问题论证了保持子集严格性的重要性。

以下是一些关于C++/CLI的文档:

  • 欧洲计算机制造商协会 C++/CLI 标准
  • 英国 ISO C++ 小组的异议(包含一些代码样例)
  • ECMA 对英国 ISO C++ 小组(及其他人或组织)的异议的回复
  • Herb Sutter 写的 C++/CLI 设计原理

原文地址:http://www.research.att.com/~bs/bs_faq.html#CppCLI