现代C++与受控代码的对弈:性能 vs 生产力

最近,一场有趣的讨论在微软公司的Herb Sutter和Mono项目的Miguel de Icaza之间展开,话题是关于本地代码和Just-In-Time编译器的优点对比,双方对各自的观点都提出了比较深刻见解。把他们的观点汇总起来,其实就可以很好地反映出本地代码和受控代码的发展现状。

Herb Sutter的观点由他对于一个问题的回答而展开。这个问题是:“什么时候,优秀的JIT技术才能拯救受控代码?”Sutter对此的观点可总结如下:虽然C++和受控代码经常被人们拿来针锋相对地比较,但是,这两种语言在性能和生产力方面做出的基本权衡策略是完全不同的。

Herb Sutter 世界首屈一指的C++专家(伯乐在线配图)

 

Sutter认为,C++的策略,主要是在侧重在性能方面的提升,而不同的是,受控代码(也就是像Java/.NET这些基于虚拟机的代码)则侧重在如何提高程序员的生产力。更深一步,Sutter表示:首先,JIT编译技术并不是问题的主要矛盾。主要矛盾来自于更根本的因素,受控语言在设计伊始就考虑如何提高程序员生产力方面深思熟虑,而不惜以牺牲程序的运行的效率为代价

Miguel de Icaza在了解了Sutter的观点后,随后也提出了自己的观点。

“受控语言的设计者们在进行设计的时候,优先考虑的是语言的安全性问题,然后才是语言的性能。比如,对数组的越界访问是一种非法操作,当这种操作发生时,受控语言会让程序立刻中止运行,而不是等到其直接造成系统崩溃,或者是留下巨大的安全隐患漏洞。”

 

 

Miguel de Icaza, Linux 技术界的传奇人物,GNOME和Mono Project的核心人物

Miguel de Icaza, Linux 技术界的传奇人物,GNOME和Mono Project的核心人物

 

在关于基于JIT的语言方面,两位牛人对其是否能产生优化代码这一问题,有截然不同的观点。

“其次,就算是JIT本身的问题,一个JIT编译器产生的编译代码肯定不可能比常规的优化编译器产生的编译代码更好。因为JIT编译器的主要目的是怎么让程序编译得更快,而不是如何产生优化的代码(让其运行得更快)”,Herb Sutter这样说道。

但是,我对上述的说法有点不赞同。总的来说,上面的说法对于早期的JIT编译器没有问题,而且Sutter所指的可能就正是Microsoft早期的.NET JIT编译器。但是,现在的JIT编译器已经完全不同于他理解中的那种了。 Miguel de Icaza回应道。

de Icaza认为JIT编译器必须回应对产生代码质量的质疑:“…在产生代码质量和产生代码的速度的平衡性方面。JIT编译器更加侧重于如何缩短编译代码的时间,而不是产生代码的质量。”然而,Mono允许用户使用LLVM编译框架,产生更高质量的代码。de Icaza注释道:“【Mono用户】LLVM编译框架,也就是苹果Mac OS Lion操作系统使用的编译器,只要这个编译器进步了,Mono产生的代码的质量也会随之进步。”

选择LLVM编译框架做后端,能让Mono用户有机会根据他们特定项目的需要进行选择,是要提高编译的速度,还是要提高产生代码的质量。这就给项目提供了更大的灵活性,在开发进行中,需要反复进行编译的时候,可以选择提高编译速度来降低每次编译的时间。当项目接近结束的时候,则可以选在提高编译代码的质量,来提高终端用户的体验。

尽管JIT选择更加侧重语言的安全性,而不是语言的执行效率,但这并不意味着受控代码的运行时(runtime)执行效率将来不会改进。de Icaza提出了几个可改进的方面,包括意向,扩展虚拟机,限制动态语言特性,以及更好地支持语言特性和本地硬件之间的映射等等。

Sutter则发表了下列评论,作为他最初观点的补充。他认为C++从根本上就具有性能优势。

“就像‘保健品’和‘处方药’这两个东西有本质的区别一样,在语言性能方面,C++永远只是吃‘保健品’强身健体,而受控语言则是在吃‘处方药’治病救人。受控语言采取了那么多“卓越的手段”提升运行性能,也都是属于吃药治病的范畴。而且“保健品”吃得少,“处方药”吃得多,这种局面是无法避免的。你无法忽略“保健”的作用(某种程度上,你先“保健”,如果“保健”不行,再吃药也不迟。但是,如果你一开始不“保健”,等拖到需要“吃药”的程度,这个时候再“保健”就没有任何意义了。),如果你真的很在意程序的运行性能的控制,那就应该以优化程序运行性能为重(而不是用什么办法来补救性能的缺失)。

不知道读者对C++和受控代码之间的权衡有什么看法。开发者会推进受控代码不断发展,来弥补其在性能上的不足么?新的C++标准的语言特性又是否需要重新审视一下受控代码开发者的观点呢?

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

收藏 1 评论

关于作者:黄小非

黄小非:毕业于重庆大学计算机系,南开大学软件工程硕士,SCJP。 目前在一家国企信息中心任职软件开发工程师。主要技术兴趣为Java平台相关技术、系统构架、C/C++、计算机图形学等。(新浪微博:@黄小非) 个人主页 · 我的文章 · 64 ·  

相关文章

可能感兴趣的话题



直接登录
最新评论
  • zwq00000   2014/05/04

    这种口水仗有什么意思吗?
    受控语言真正的提高的是提供一种编写高质量的代码,提高编程语言的表述能力。
    性能本身不具备可比性,没有那个软件就为了计算1百万个数组,那不是真正的功能,只是教科书上的教学用例。
    用C++开发轻易不去触碰容易出问题的地方,比如多线程、并行计算之类的,因为开发成本太高,而在C#中这都是最基本的,写个方法丢到线程池子里面,太稀松平常了。

跳到底部
返回顶部