原生代码卷土重来 C++欲东山再起
上周,最新版的ISO C++标准被全体一致批准,这是C++语言13年来第一个重大修订版。新标准现在的官方名称是C++11,它引入的一些功能特性旨在更容易地针对现代并行处理架构开发软件,包括面向并行计算的Lambda表达式和新的数据类型。
倒不是说C++真的消亡了。与年代更久的同类语言C相比,C++对于系统编程和需要性能密集型原生代码的应用程序(如3D游戏引擎)来说仍是最流行的语言之一。
然而在其专门的小众领域之外,传统的系统编程在近些年已渐渐失宠。现在的程序员日益远离原生代码编译,改而青睐Java和.NET等受控代码环境。这种环境让他们可以不用操心内存管理和输入验证方面这样单调乏味的工作。另一些程序员为了获得Python、Ruby和JavaScript等动态语言在语法上的便利,愿意牺牲一些性能。
但是C++ 11出现在颇有意思的时间点。越来越多的人觉得,编程语言这个钟摆偏离原生代码也许太远了。现在该是钟摆往另一个方向摆回来的时候了。因而,C++发现自己多了几个原本最不可能的盟友。
原生代码最不可能的拥趸包括谷歌
谷歌恐怕是你最不会想到对原生代码有兴趣的一家公司。多年来,谷歌一直鼓吹桌面软件概念已过时了这一理念。在谷歌憧憬的理想环境下,应用程序完全在浏览器里面运行;为此,它开发出了Chrome OS来证明这一点。
不过连谷歌都认识到,有时候经过解释的JavaScript还不够。我在以前的文章中介绍过谷歌原生客户端(NaCl),这种沙箱环境让Chrome浏览器可以下载和执行原生二进制代码,以便处理性能密集型操作。这绝非谷歌在闲暇之余的试验活动;上周,谷歌在Chrome的最新测试版中发布了新版本的NaCl;这项技术头一次在默认情况下被启用。还有传闻称,谷歌悄然添加到最新版Chrome OS中的Netflix媒体流支持功能也依赖NaCl应用编程接口(API)。
NaCl也不是表明谷歌对原生代码的唯一认可。这家搜索巨头的Go编程语言之前就被广泛称为是“类似Java”,但这只说对了一部分。从语法上来讲,Go某些方面的确类似Java,但Go代码并不在虚拟机里面运行,而是直接编译成了原生代码。此外,谷歌甚至确保Go二进制代码不但可以在桌面上运行,还可以在谷歌应用程序引擎(Google App Engine)云计算环境里面运行。
很奇怪的是,这些举措使得谷歌与位于雷德蒙的竞争对手关系融洽和睦。作为世界上最大的桌面软件开发商,微软对待C++的态度一直比许多公司更友好。可是近些年来,原生C/C++开发人员觉得自己受到了一点冷落,因为微软把大部分精力投入到了C#,这是面向.NET平台的受控代码C衍生语言。
但这种情形似乎在发生变化。Visual Studio 2010已经支持C++11的大部分功能特性。今年7月,微软在其Channel 9开发人员网站上发布了一个新的视频系列,名为“Going Native”(使用原生代码),专门介绍原生代码方面的发展,特别强调C++。与此同时,目光敏锐的观察人士注意到了微软在9月召开的Build大会前夕居然没有.Net方面的宣传。Build大会之前名叫专业开发者大会(PDC)。
原生代码永不没落
早在Java时代之前就懂得编程的那些人自然完全明白为何人们重新对原生代码产生了兴趣。传统的软件开发方法有着悠久的传奇历史;有时候,经过充分优化的原生二进制代码仍是有可能从处理器获取最高性能的最佳方法。
话虽如此,原生代码也有其缺点。首当其冲的是我之前提到的安全问题。由于与C#和Java等受控语言相比,C和C++等语言让开发人员可以更接近底层硬件,所以要认真考虑的问题就多得多;缺乏经验的编程员可能会造成严重破坏。
移植性是另一个问题。对于处在Wintel环境下的Windows开发人员来说,编写可以在多种处理器架构上编译的代码从来不是个大问题,甚至在过去也是如此。然而换成了Unix环境,情况就不一样了。
现在,谷歌的NaCl环境重新带来了同样一些问题。Web开发人员习惯于自己开发的应用程序在任何基本上符合标准的浏览器中运行,但是NaCl模块与特定的处理器架构死死地绑在一起。想让同一个模块在x86、x64和ARM等处理器上都可以运行,你就得编译这三个不同的版本,然后把这三个版本都放到Web服务器上。对于长期习惯使用PHP和Perl的开发人员来说,这就需要一番适应。
但要牢记的最重要的问题是,为手头的任务选择合适的工具。谁也不想回到以前的糟糕年代:面对使用由C编写的CGI脚本的Web,为文本数据而纠结。另一方面,不管手头的任务是什么,把每一个应用程序硬塞进同样的解释语言或受控代码环境同样不是正确的方法。