`
liufei.fir
  • 浏览: 685240 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

原生代码卷土重来 C++欲东山再起

阅读更多
编程语言往往是各领风骚三五年。最初,炙手可热的新语言是Java;后来换成了Python,随后Ruby抢走了风头,之后又换成了JavaScript。而最近备受宠爱的语言可能大家最想不到的。信不信由你,2011年很可能是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,为文本数据而纠结。另一方面,不管手头的任务是什么,把每一个应用程序硬塞进同样的解释语言或受控代码环境同样不是正确的方法。

现在的计算机异常尖端先进、用途异常广泛、性能异常强大。要充分利用它们的功能,开发人员就应该使用尽可能广泛的工具。原生代码的卷土重来往正确方向迈出了可喜的一步。

原文标题:Hail the return of native code and the resurgence of C++

分享到:
评论

相关推荐

    Android Studio原生代码测试项目.zip

    android studio原生代码测试项目.zipandroid studio原生代码测试项目.zipandroid studio原生代码测试项目.zipandroid studio原生代码测试项目.zipandroid studio原生代码测试项目.zipandroid studio原生代码测试项目...

    Android应用源码之代码调用C++代码和C++代码调用代码.rar

    本压缩包文件"Android应用源码之代码调用C++代码和C++代码调用Java代码"提供了关于如何在Android应用中集成C++代码的示例,适用于那些想要深入了解跨语言编程的开发者。 1. **JNI(Java Native Interface)** JNI...

    Android 调用C++代码和C++代码调用源码.zip

    `stringFromJNI()`是一个原生方法,它的实现将在C++代码中。 在C++代码中,我们需要为Java中的原生方法创建对应的函数原型。这通常在`<native-method-name>.cpp`文件中完成,使用JNI的API定义函数: ```cpp #...

    C++播放音乐源代码

    C++并不是一个直接支持音频处理的原生语言,但通过第三方库和API,我们可以构建一个音乐播放器。这里,我们主要关注的是一个基于Visual Studio 2015(VS2015)的简单C++音乐播放器的实现。 首先,我们需要了解如何...

    C++调用Android函数工程

    JNI是Java平台提供的一种机制,它允许Java代码和其他语言写的代码进行交互,包括C++。下面我们将详细讲解这一过程的关键知识点。 首先,我们需要了解JNI的基本概念。JNI是Java平台的一部分,它为Java应用程序提供了...

    ionic capacitor调用原生本地代码 切换页面

    ionic capacitor调用原生本地代码 切换页面

    js 原生代码功能

    原生JavaScript功能代码

    Android 调用C++代码和C++代码调用源码-IT计算机-毕业设计.zip

    1. JNI(Java Native Interface):JNI是Java平台提供的一种原生接口,允许Java代码和其他语言写的代码进行交互。在Android中,我们通常通过JNI来调用C++代码。 2. 创建本地库:首先,需要创建一个Android.mk或...

    安卓Android源码——调用C++代码和C++代码调用源码.zip

    Android原生开发工具集(NDK)是实现这一目标的关键,它允许开发者使用C++和其他本地语言编写应用的一部分。 首先,Android应用程序主要由Java或Kotlin编写,运行在Dalvik或ART虚拟机上。但为了访问硬件加速功能或...

    C++开发语言源代码反编译工具

    C++开发语言源代码反编译工具

    基于ImageJ和OpenCv的16种自动二值化图像代码(C++)

    在这个项目中,Java代码被转换或重写为C++代码,以适应原生环境,减少了对Java运行时的依赖。 OpenCV库在二值化处理中提供了多种方法,如直方图阈值、Otsu's二值化、AdaptiveThreshold等。这些方法各有优缺点,适用...

    珊瑚SDK,Android原生代码嵌入cocos2dx代码!

    然而,对于某些特定的Android功能,如深度定制UI、硬件加速或系统级交互,直接使用C++可能并不方便,这时就需要与Android原生代码进行交互。 珊瑚SDK是专为这种交互设计的,它提供了Java API和C++接口,使得Cocos2...

    跨android和iOS平台的js和原生代码相互调用示例

    在这个场景下,JavaScript(JS)与原生代码(如Java for Android或Swift/Objective-C for iOS)的交互成为了一个关键的技术。本示例将探讨如何在Android和iOS平台上实现JS与原生代码的相互调用。 **1. JavaScript与...

    Android 调用C++代码和C++代码调用源码.rar

    在Android平台上,有时候为了性能优化或者利用已有的C/C++库,我们需要在Android应用中调用C++代码。这一过程通常涉及到Android的Native Abstraction Layer (NDK)和Java Native Interface (JNI)。本资源“Android ...

    c++动态加载c#编写生成的dll代码

    而C++是原生的、非托管的代码,不直接支持.NET框架。为了在C++中调用C#的DLL,我们需要借助COM(Component Object Model)或者P/Invoke技术。本文主要讲述P/Invoke的方式,因为它是.NET和非托管代码之间交互的常用...

    testCpp安卓调用C++的OPENCV

    2. **CMakeLists.txt配置**:为了构建原生C++代码,Android Studio使用CMake作为构建工具。在项目的`CMakeLists.txt`文件中,你需要指定源代码文件、库依赖和编译选项。例如,添加OpenCV库依赖的命令是`find_package...

    c++ 通过 clr 方式 封装 原生 c++ dll , 由c# 对其调用

    c++ 通过 clr 方式 封装 原生 c++ dll , 由c# 对其调用 通过创建c++ clr项目dll_test_net,其内部封装纯c++ dll (dll_test_cpp),然后c#项目 test_net调用dll_test_net。 所有项目由vs2008创建。 防入坑提示: clr...

    C#调用C++代码完整实例

    在IT领域,跨语言通信是常见的需求,尤其是在.NET框架下的C#编程中,有时需要调用C++编写的原生代码来利用其高效性或利用已有的库。本实例将详细讲解如何使用C#调用C++代码,通过DLL动态链接库实现功能。 首先,...

Global site tag (gtag.js) - Google Analytics