`

c java c++的比较

阅读更多
现在最有前途的一般认为是java和c#如下面所述:
C#诞生之日起,关于C#与Java之间的论战便此起彼伏,至今不辍。抛却Microsoft与Sun之间的恩怨与口角,客观地从技术上讲,C#与Java都是对传统面向对象程序设计在组件化软件时代的革新之果,可谓殊途同归。虽说两个语言有着"90%的重叠",但那另外"10%的较量"也往往能够左右一个天平的方向。本文将携90%之共,论10%之异,对两个语言做纯技术品评。文章不涉及两个语言的公司,市场等台面后的事情--虽然这往往也会影响人们对编程语言的选择。也不预备得出谁是谁的Killer,读者应该选择谁的问题。"语言选择乃艺术而非技术问题",业界早有定论,无需多言。

  C#和Java都提出了对传统C++艰深,晦涩的语法语义的现代改良。在语法方面,两者都摈弃了C++中函数及其参数的const修饰,宏代换,全局变量和全局函数等许多华而不实的地方。在继承方面,两者都采用了更易于理解和建构的单根继承和多接口实现的方案。在源代码组织方面,都提出了声明与实现于一体的更好的逻辑封装。在类型系统方面,两个语言都在中间语言IL或字节代码的基础上提出了映射(Reflection)这样的概念,彻底革新了传统C++运行时类型鉴别的问题。但在大刀阔斧地对C++进行改革的同时,C#显得更为保守,它对很多原来C++中很好的性质予以了保留,如基于栈分配的轻量级的结构类型,枚举类型,引用(ref),输出(out),数组(params)修饰的参数传递方式等,这些在Java中都被很可惜地丢掉了。在基本类型和单根继承的对象之间的类型统一方面C#提出的box/unbox要比Java的包装类显得高明,效率也要好。

  对C++不安全的指针及内存分配方式,C#和Java都提出了托管执行环境。效率问题是托管执行环境一直以来令人诟病的地方,Java虚拟机(JVM)的解释执行方式曾经让很多开发者"慢的不可忍受"。C#的JIT编译方式为C#在这块战场上赢得赞声一片,某些C#托管代码甚至比传统C++代码都快。虽然现在各厂商实现的Java平台也都一致地采取了JIT编译方式,但C#在这方面的比较优势非常明显--C#的目标编译语言IL从设计初始就把效率摆在了重要的地位,而Java的字节代码的设计却有些鲁莽。托管执行环境经过几年的实践,在现代软件界已经达成了共识,效率的牺牲换来的是高度安全的代码--当然前提是牺牲的效率必须足够的小,至少可以忍受。值得指出的是在这里C#同样"念念不忘老一辈C++程序员",C#允许我们在unsafe上下文中进行指针操作。数组的索引越界检查,类型安全在C#和Java中都被提到了相当的高度。在异常处理方面,不管从内置支持,还是从执行效率来讲,C#都较Java略胜一筹。

  "一次编程,多处执行"是程序设计一直以来的一个诉求,尤其是在现代互联网络时代。在跨平台方面,Java的支持和实现都是为人称道的,虽然JVM的速度仍然让人备感头疼。而C#虽然在底层构造方面对移植性进行了充分的考虑,但至少目前还没有成熟的,经过检验的产品。C#在跨平台方面似乎更热衷于XML Web Services互操作,而不是跨平台编程。但C#通过其基础语言构造(CLI)对二十多种主流语言的对象级的互操作支持,又极大地提升了C#的技术地位。和COM组件廉价地互操作也为C#挣到不少分数--保持一个兼容的体系对现代软件工业非常重要,也是对广大开发人员负责任的表现。

  面向组件无疑是当代软件开发的主流。C#对组件编程甚至到了"迷恋"的地步,这与6年前就出道的Java不可同日而语--当然这是时代问题。C#通过属性,索引器,委派,事件,操作符重载,特征,版本等实现了其对组件编程的第一手的支持。虽然这些在Java中都可以通过方法,接口或者适配器来间接地实现,但软件业的历史告诉我们这无论对编程效率或者逻辑设计都是一种极大的损伤--高级语言首先面对的是人,而不是机器。除去这些语言层面的组件支持机制,.NET平台也为组件的配置,运行,管理等提供了一揽子解决方案,而为组件开发量身定做的Visual Studio.NET更是令人兴奋,这都为C#的组件编程开辟了广阔的天地。在其他技术方面Java的微弱劣势尚且可以忽略不计,但在组件编程方面Java相较于C#却有着不可治愈的硬伤。尤其对于从C++和Visual Basic背景过来的开发人员,C#在这方面有着不可抵挡的魅力和诱惑。

  鉴于XML Web Services在下一代企业分布式计算中的地位,我们有必要在这方面对两个语言有一个简单的交代。在XML Web Services的操作方面,.NET平台直接在IL中间语言中的内置XML支持使得C#与生俱来地成为下一代Web服务的首选,这是通过API集来支持Web服务的Java所不能比的。在C#中,XML,SOAP,UDDI,WSDL等底层协议被构建成了面向开发人员的组件,而Java中这些仍然是JAX(Java XML API)等底层协议的操作函数。当然这种局面可能仅仅是时间问题,一个强大的高效的Web Services组件模型对Java来说并不是不可逾越的鸿沟。

  在语言标准化方面,微软也史无前例地做出了令人赞赏的动作。目前C#及.NET平台基础构造已递交欧洲计算机制造商协会ECMA,经过标准化后的C#将可由任何厂商在任何平台上实现其开发工具及其支持软件,这为C#的发展提供了强大的驱动力。而Java在这方面虽有动作--JCP(Java Community Process),但无疑只能是准标准化。在组件化软件时代拥有一门像C++一样的标准化语言,对软件界尤其是广大开发人员非常重要。
当然两个语言的全面的技术品评绝非仅仅上述几点简单的罗列比较,其后端平台(C# for .NET, Java for J2EE),及其编程框架的支持,各语言相关工具的实现,现有的系统基础等等都对程序设计语言的发展产生相当的影响。从纯技术角度来讲,C#无疑较Java更具竞争力。争吵谁抄袭谁也没有意义--技术的发展本来就是一个相互借鉴的过程。纯技术较量也并不能决定这场论战的胜负--如果非要一决雌雄的话。软件界倒乐见竞争,经过市场锤炼的技术才能更好地为我们服务,让我们拭目以待!

 

分享到:
评论

相关推荐

    CPlus_to_Java_Converter;C++转java工具

    本文将围绕“CPlus_to_Java_Converter”这一工具,探讨如何将C++代码转换为Java代码,并分析这一过程中涉及的关键技术和挑战。 首先,我们要明确C++到Java的转换并非简单的语法替换,因为两者的语言特性差异显著。...

    面向对象编程C++和Java比较教程

    C++,由Bjarne Stroustrup设计,起源于C语言,是C的增强版,具有底层控制能力和高性能。C++支持类、封装、继承、多态等面向对象特性,并且包含了模板、STL(Standard Template Library)等高级特性,使得它在系统级...

    Java转C++代码工具 J2C

    Java转C++代码工具J2C是一个专门用于将Java源代码转换为等效C++代码的工具。这个工具对于那些需要在不支持Java或者需要利用C++特定性能特性的环境中迁移Java项目的人来说非常有用。在深入探讨J2C之前,我们先理解...

    C++库封装JNI接口-实现java调用c++

    这个头文件包含了Java方法的C/C++声明,供C++代码使用。 3. **编写C++代码**:在C++中实现本地方法。引入生成的头文件,并实现其中的方法。例如: ```cpp #include "MyNativeClass.h" JNIEXPORT void JNICALL ...

    java与C++互通加解密

    本次项目由于服务器之间需要通信加密,java和c++,自己只懂java,因此和同事(c)在网上找了好几个都测试不行,我们修改了其中一个,已通过测试,上传的是最基础的,需要复杂化的可自行修改。为了以后方便他人,贡献...

    C++与java比较

    在面向对象特性方面,C++为了兼容C语言,保留了指针,这使得C++更灵活,但也增加了指针错误的风险,可能导致程序崩溃。Java则不提供直接的指针操作,通过引用和垃圾回收机制来管理内存,提高了程序的稳定性和安全性...

    数据结构 C C++ JAVA

    C、C++ 和 Java 都是广泛用于实现数据结构的编程语言,每种语言都有其独特的特性和优势。 在C语言中,由于其低级特性,可以直接对内存进行操作,这使得C语言在实现数据结构时更加灵活,但同时也需要开发者具有较高...

    c/c++ 与java互通 AES加密解密,算法ECB

    最近需要和银行pos做数据通讯,银行端算法为java实现的 AES/ECB/PKCS5PADDING我也改不了, c/c++这边实现ECB算法本来就少,PKCS5PADDING的更是没有,索性自己动手。工作原因c和java都得熟悉,因此把java端和c/c++...

    JAVA c++比较 对比讲解二者不同 代码举例(英文版)

    C++最初是作为C语言的一种面向对象扩展而发展的。因此,它结合了过程化编程和面向对象编程两种不同的编程范式。JAVA则是一种纯粹的面向对象编程语言,所有的数据和函数都必须封装在类中。这一区别意味着C++支持更...

    java和C++通信结构体发送

    - **JNI(Java Native Interface)**:Java提供JNI接口,允许Java代码直接调用C/C++的库,但这通常不适用于网络通信。 - **Protocol Buffers**:Google开发的序列化框架,支持多种语言,包括Java和C++,可用于...

    android 的binder机制在java、c++层的实现

    本文将深入解析Binder在Java层和C++层的实现,并通过一个简单的模拟示例来阐述如何在不同进程中进行通信。 首先,让我们了解Binder的基本原理。在Java层,Binder是`android.os.Binder`类的一个实例,它作为接口暴露...

    非常好用java调用c++ dll文件demo

    JNI提供了一种方式让Java代码能够调用本地(native)代码,包括C和C++。这需要编写一个JNI头文件,定义C/C++函数的原型,然后编写对应的C++实现。最后,这个C++代码会被编译成DLL文件供Java调用。 以下是调用C++ ...

    各种学习资料 Android Python Java Java web C语言 C++ 教程 视频.zip

    各种学习资料 Android Python Java Java web C语言 C++ 汇编 Android逆向 Arm开发 51单片机 Photoshop 会声会影 Windows Unity cocos2dx 教程 视频 各种学习资料 Android Python Java Java web C语言 C++ 汇编 ...

    java与c/c++的区别

    Java 和 C/C++ 是两种广泛使用的编程语言,它们在设计理念、语法特性、性能及应用领域等方面存在显著区别。 首先,Java 是一种面向对象的语言,它强调封装、继承和多态等面向对象特性,同时提供了垃圾回收机制,...

    Thinking in C: Foundations for Java & C++

    Thinking in C: Foundations for Java & C++ by Chuck Allison produced by Bruce Eckel Chapter 1: Introduction and Getting Started40 MinutesStart Lecture Chapter 2: Fundamental Data Types41 ...

    java调用c c++程序实例

    在IT领域,跨语言通信是一项常见的任务,尤其是在Java和C/C++之间。Java因其平台无关性和丰富的库而广泛使用,而C/C++则以其高效和底层控制能力受到青睐。本实例探讨了如何在Java中调用C/C++编写的程序,以实现两者...

    语言 Java C++等语言LZMA压缩算法示例源码包

    它以其优秀的压缩比和快速的解压速度而闻名,被很多编程语言实现,包括Java、C++和C。下面将详细解释LZMA压缩算法的基本原理以及在Java、C++和C中的实现。 1. LZMA压缩算法原理: LZMA的核心思想是基于滑动窗口的...

    面向对象编程:C++与Java比较教程 英文版

    本书《面向对象编程:C++与Java比较教程》详细比较和对比了当今最流行的两种编程语言C++和Java,旨在教授互联网时代至关重要的技能和面向对象编程技术。作者Avinash C. Kak凭借其成功教授的课程,撰写了一本全面的...

Global site tag (gtag.js) - Google Analytics