邓际锋ID:soloist
82044次访问,排名1090好友0人,关注者2
soloist的文章
原创 39 篇
翻译 0 篇
转载 0 篇
评论 189 篇
soloist的公告
欢迎吹毛求疵,感谢您对任何错误的指正,包括技术的、语法的、用词的、标点的、典故的、引用资料的……
最近评论
qingbai:lua绝对是个好东西。但国内除了java就是.net,其他东西没法活。因为程序员得工作,得吃饭。国内有哪家公司用lua?唉没办法呀。国外是一片繁荣,“百家争鸣”,国内是“青一色”的java和.net!无奈!
zhangyilan:尽管没有在实际代码的编写中碰到这个问题,不过也先学习一下,免得出现问题了搞出清楚情况。
ddrmsdos:这篇文章写的太好了,分析的非常仔细,以前常常碰到这类问题,终于解了我多年的心头之患......
ollydbg23:楼主的这篇文章写的非常好啊!
我看了以后,还是挺有收获感的,多谢多谢!
我也是对汇编,c++的比较感兴趣,有空可以交流一下!
w2001:写得很好
文章分类
收藏
    相册
    好博链接
    C++罗浮宫
    cpper
    fixopen
    fmddlmyy
    neoragex2002
    whinah
    云风
    梦想风暴
    沉思者
    许式伟
    负暄琐话
    辣子鸡丁
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 我看C++/CLI和.NET收藏

    新一篇: 学到的一个宏技巧 | 旧一篇: 整型表达式比较的潜在危险

        最近C++/CLI成了国内程序员关注的焦点,原因是它的开发人之一Stan Lippman来中国开技术大会并全力推介它,而且《程序员》杂志刊登了孟岩老兄对此人的专访,于是软件界一时群情激昂、人声鼎沸,各种说法也是不绝于耳。此专访的节选被放在孟岩自己的BLOG上,后头跟贴相当多(恐怕有上百条),不少人流露出对C++/CLI的反感甚至鄙夷,更有过火者对Stan Lippman本人也是大肆挞伐,说他是微软的无耻鼓吹手云云。我对C++/CLI没有研究,也没有在.NET上做过开发,对它们的了解都是源于技术大拿们的介绍,但是我仍然想谈谈自己的看法(不懂也敢说话?呵呵,姑妄听之吧)。

        在选择开发用语言上,我是一个非常保守的程序员,我最中意的语言是C/C++与汇编,开发工具用的最多的是Visual C++。顺便说一句,我曾经从事的并且最感兴趣的领域是游戏开发。从微软宣布.NET以来的相当长一段时间里,我对它都抱着极大的抵触情绪,认为它是一个吞食一切的庞大怪物,丑陋、臃肿与野心勃勃。至于C#,我更是毫无接触便认定它是个怪胎。我想,在中国或许有不少人和我一样有这种盲目敌视的心态吧。这是为什么呢?现在看来,最重要的原因无非一条,那就是微软的技术更新步伐越来越快,就算是保持距离跟随其后对不少人来说也是有心无力,所以我们由无能逐渐害怕,而由害怕又生出了仇恨。就像满清末期抵死反对维新的大臣一样,只不过他们有能力扼杀改革,而我们没有。

        最近一段时间,由于希望能做一点将形式化方法与面向对象技术结合的研究我开始了对Eiffel以及契约式开发方法(Design by Contract)的学习。国内听说过Eiffel的人可能不多,但是听说《Object-Oriented Software Construction》(《面向对象软件构造》)这本书的人应该不少。该书曾荣获1997年JOLT大奖,它详细阐述了面向对象开发方法的各个方面,对许多重要概念做了极为细致深入的分析,而Eiffel就是书中作者(Bertrand Meyer)带领读者发展出的一套运用在软件开发全过程中的面向对象标记法。可以把Eiffel看成一门面向对象的编程语言(虽然它不仅仅是一门编程语言),在这门语言中最重要的是引入了“契约”(contract)的概念并建立了直接支持此概念的语言机制。了解形式化方法的朋友肯定都知道前置断言(precondition)、后置断言(postcondition)、不变式(invariant),而contract就是Eiffel中它们的对应物。在人类社会中契约具有法律效力,它能明确地规定签约方的权利与义务,从而为营造一个权利与义务平衡,理性而稳定的社会提供基础。同样,契约可以通过明确程序中各种操作的权利与义务来精确地刻画它们的语义,由此构造高质量的软件才有了坚实的土壤。在学习了契约式开发思想之后我多么希望也能将它应用在其它语言中啊,尤其是C/C++。可是C/C++并没有直接支持contract的机制。孟岩曾经撰文(《Design by Contract原则与实践》的附录)介绍如何在C++中用assert来模拟它,但是局限性太大,很多关键的思想无法运用。就在昨天我看到一篇Bertrand Meyer于2000年写的文章"The significance of .NET" ,说他们已经开发出了一个基于.NET的叫Contract Wizard的软件,它能让你为.NET组件(无论是用什么语言写的)中的类以及类方法加上preconditions, postconditions 和class invariants,就象Eiffel中能够做的一样,最关键的是在此过程中你无需这个.NET组件的源代码,Contract Wizard直接对编译过的组件进行操作,更改它的metadata,然后生成一个新的带有契约的.NET组件。这就是说,以后我可以将我所需要的所有组件(不管有否源代码,不管用什么语言编写)都用与Eiffel中一致的contract武装起来,从而大大提高软件的质量与安全。很神奇,不是吗?而这一切都拜.NET中自描述的组件机制所赐。事实上Meyer的这篇文章还介绍了.NET的其它方面,比如语言间的互操作性(Language interoperability),这让程序员可以继承与扩展用不同语言写成的类;比如对象模型VOS(Virtual Object System),Meyer称之为微软“努力为各种语言定义的一个通用而适当的基础”,“而这个基础将在不同语言间起着桥梁的作用”(it is an attempt to define a suitable common base that can serve as a bridge between all these languages, and others.);比如虚拟机,微软一开始就全力提高MSIL(MicroSoft Intermediate Language)在CLR上的执行效率,这可从QUAKE2的.NET版本没有明显的效率损失得到验证。抛开对微软的偏见站在纯粹的技术角度来看,.NET难道不是一个体现了远见、活力与趣味的平台吗?而且随着ECMA(European Computer Manufacturers Association)将CLI标准化,它还成为了一个开放的平台,著名的Mono项目就是其在Linux上的实现。有的朋友可能会说不要拿技术权威的文章尤其是外国权威的英文文章来吓唬人。我不会狐假虎威,但是对于一个在软件领域有如此造诣的大师,如果他所说的是理性、客观且负责任的,我为什么不能相信他,又为什么不能推荐给大家,让大家能有更多的思考?

        C++/CLI是一个积极的尝试,在我看来它期望的是:在最大限度地利用.NET提供的各种先进功能的同时又最大限度地保持C++的编程模型。这是一件好事,尤其对那些喜欢C++而又必须在.NET平台上工作的人来说更是如此。讨厌C++/CLI的朋友,你们也别太过激动,毕竟你们仍然有选择Native C++的权利,没有人强迫你们。就我来说,由于游戏开发的要求,在相当长的时间里我仍然会固守C/C++以及ASM的阵地,但是同时我也极有兴趣探索C++/CLI这门新鲜的混血语言。即便是在游戏开发领域,.NET平台的许多技术也值得学习,事实上早有游戏运用了与.NET相似的技术。比如Unreal,它的逻辑部分便是由UnrealScript脚本语言写成,而这种脚本则运行在提供了多线程以及内存回收机制的虚拟机上,并且它也能与C/C++在源码级进行良好的互操作(比如在脚本中使用由C++写的class)。虽然这些技术的发展已行之有年,但.NET无疑是一个全新的且极有价值的借鉴对象。

        或许微软有许许多多霸道的做法,但是近年来它表现出的创造性却不得不令人佩服。我们可以很情绪化地咒骂C++/CLI,咒骂.NET,咒骂微软,甚至咒骂被微软雇佣了的Stan Lippman,可是我们失去的是什么呢?在上面提及的"The significance of .NET"这篇文章中,Bertrand Meyer虽然对.NET总体上持肯定态度,但是仍然批评了它的一些技术选择,比如继续提供重载overloading机制(Meyer一贯反对重载并撰有多篇文章阐述背后的理论,可惜他的真知灼见不是主流),可是这种有分量的技术批评却鲜见于我们的讨论中。我们在一次次的谩骂中发泄了心中的不满,但同时也在这一次次的谩骂中丧失了独立探索、实事求是、理性怀疑的科学精神。没有了这种精神,我们还有什么资格被称为“程序员”呢?

    发表于 @ 2004年11月12日 13:55:00|评论(loading...)|编辑

    新一篇: 学到的一个宏技巧 | 旧一篇: 整型表达式比较的潜在危险

    评论

    #zhu 发表于2004-11-18 19:11:00  IP: 218.75.123.*
    zhu ni zhe zhi
    #yy 发表于2004-11-18 22:00:00  IP: 61.187.64.*
    我很赞成你的观点,C++/CLI可能是有些不伦不类,但是,它是一门崭新的语言呢,谁还会这样想?!我们没有必要为了自己那点可怜的旧技术而否认新事物的强大,也没有必要硬要拿ISO-C++和C++/CLI作比较来判断后者的是非,站在技术前景的角度,我们应该欢迎C++/CLI的到来~!
    #Chris 发表于2004-11-21 22:59:00  IP: 222.18.0.*
    不错不错。我对你说到的.NET技术应用在游戏开发领域尤其感兴趣。
    #soloist 发表于2004-11-22 12:06:00  IP: 211.144.99.*
    其实通过脚本语言来与游戏引擎提供的接口进行交互来完成游戏逻辑部分已经成了一种比较流行的方式。脚本的引入是为了弥补C/C++编程模型的不足,使程序员能站在较高的抽象层次上描述诸如NPC的行为规则这样的东西,这其中的关键是脚本本身的编程模型、表达能力以及与开发引擎用语言之间的良好互动。我认为.NET值得借鉴的部分主要包括它的底层对象模型以及MSIL,这是使得多种语言能够互操作的核心。但是直接将.NET用作游戏的脚本引擎又似乎太大了点,而且做游戏不就图个乐吗?原封不动的照搬似乎少了点乐趣吧。^_^
    #刘未鹏 发表于2005-11-22 05:34:00  IP: 222.94.28.*
    其实C++/CLI的出现说明了两件事:
    C++仍然优于绝大部分语言,尤其是在语言本身的层面。
    C++没带可选GC。

    不过C++0x有加入可选GC的可能。其实BJ在98标准化之前就意识到了GC的重要性,还写了一个proposal,后来不知怎地又没得到实施。可能是当时GC虽重要但还没有到达普及的程度罢,而C++是冒不得这个险的。要是C++每隔五年标准化一次就好了。呵呵。
    同样,现在被认为是现代语言的核心特性的metadata(它所支持的refelection特性的确带来了很多好处)也不知是否会加入C++0x,BJ这次同样在这方面做了工作,一如以前对GC那样,其实BJ一直想让C++在分布式领域大展宏图,然而不论是在comp.lang.c++.moderated还是comp.std.c++上,我望穿秋水也看不到人们对metadata有多少关注。很多人乐于守在C++的小楼里自成一统,我也知道C++不差,没metadata也照样能活,COM就说明了这点,然而世界是功利的,我希望C++飞黄腾达,名利兼收,绝对不希望C++成为LISP那样的学术性语言,当然,后者是绝对不可能的。只不过C++要想与时俱进还真得在这些功利特性上做点文章,呵呵;-)
    #soloist 发表于2005-11-22 22:36:00  IP: 218.78.226.*
    这次C++技术大会上,BJ还说起过提GC建议这事。至于metadata,因为陈榕在会上做了个关于他们组件模型的演讲,而且网易的云风也在设计一个跨平台的二进制组件标准,所以大家就这个主题也请教了BJ。不过我好象没听出他对metadata进入标准有多大的积极性(申明一点,我的听力很差,有关这次大会的最全的资料到时会放在http://www.dreambrook.com)。

    我认为C++/CLI做的这些工作对整个C++社区都是很有好处的。李建忠在关于这个主题的演讲中说让原生的C++编程模型与CLI的编程模型无缝集成是设计者的最大目标,不过现在还没能做到那么好。引入可选GC后,GC上的对象与普通对象之间的交互应该是一个需要认真关注的问题吧。如果C++/CLI真能达成目标,ISO C++应该是可以借鉴很多东西的。

    另外我觉得C++/CLI与动态语言打交道应该会更容易,而与动态语言的交互能力我想也应成为ISO C++要努力的一个方向。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © soloist