漫谈C++和JAVA

来源:互联网 发布:php文件怎么用打开手机 编辑:程序博客网 时间:2024/06/05 16:07

    这是我在CSDN上的第一篇博文,想来想去暂时不想写一些具体的问题,就大概讲讲我对程序设计语言的一些看法吧。

    本科4年接触了C,C++,JAVA还有一些解释型语言,也读了一些比较经典的书,虽然不敢说对程序设计有很深刻的认识,但多多少少也有了点自己的看法。

    C++和JAVA是当前工业界较为重量级的系统编程语言,而对于这两者的孰优孰劣的争论也从来没有停止过。今天我不想去讨论native code和字节码之间的好坏,也不想去讨论运行速度谁快谁慢之类的问题,就想对程序设计、语言特性谈谈自己的想法和感受。

    C++和JAVA都是非常典型的OOP语言。个人认为OOP的目的只有一个:有效控制程序复杂性。诸如类、封装、继承、多态等等OOP的概念,都是对大规模程序进行抽象的工具,以此来降低重复代码,或者说将程序复杂性置于可控的状态。C++和JAVA的目的是一样的,也就是说他们所要解决的问题是相同的,只不过解决问题的方法有所分歧。

    C++和JAVA一个众所周知的区别大概就是内存释放权了,这既是C++为人所诟病的地方,也是JAVA程序性能的瓶颈所在。内存释放权的取舍实质上是控制力和简易性无法两全的集中体现。这很难说谁是好的,谁是不好的,只能说在不同的场合对两者的需求各不相同,这也是C++历经这么多年依然可以在工业界占据很大席位的原因之一。

    C++和JAVA另一个分歧是内存布局。在计算机程序中有两个至关重要的内存区域,一个是堆,一个是栈。这两个内存区域的运行模式和生存周期是完全不同的。C++在这两个区域上的选择度更为灵活,C++既允许将对象存储在堆区,也允许将对象存储在栈区。而JAVA要严格很多,所有的对象都必须存储在堆区,栈区只存储基础类型数据和对象引用。这种严格的区分使得JAVA的内存布局更为清晰明了。

    此外还有的一点就是指针,指针使得C++中有传址和传值的区分,这对程序性能的影响是巨大的。而JAVA中实质上也存在这种区分,但由于对内存布局的严格区分使得JAVA中传址和传值的概念更加淡化了。另外我个人的感觉是,JAVA并不是取消了指针,而是所有的对象引用实际上就是一堆指针。例如,对于类Apple,有如下语句:Apple a=new Apple("a");Apple b=a;对象引用a和b实际上存储的就是Apple("a")在堆区中的地址,而b=a事实上也只是一个传址过程。

    在内存释放权和内存布局上的不同选择对两个语言产生的影响是非常广泛的。这也是C++比JAVA复杂的核心因素之一。对内存释放权的绝对控制、内存布局的多样化和传址传值的区分使得C++在类初始化,继承,析构等方面要远比JAVA复杂。就拿OOP中最基本的构造析构函数对来讲,C++中类的初始化会涉及到普通构造函数、复制构造函数以及赋值操作符(操作符重载),此外,构造函数还有使用初始化列表初始化和在函数体内对数据成员赋值两种区别。而JAVA构造函数的意义和内容更为简单明了,就是在创建新对象之前所做的一系列操作,一般是类成员的初始赋值。对于析构函数,C++的内存释放权大多数就是在析构函数中行使的。在对象生存期结束时触发析构函数,使得C++可以实现对对象内存的精准控制。而JAVA的做法更为干脆,因为收回了内存释放权,所以JAVA中就没有析构函数,所有的垃圾都由JVM统一处理。

    当然,C++的复杂性是冰冻三尺,非一日之寒,对C的兼容,新特性的不断加入,甚至是一些兼顾人们使用习惯的语法糖,都成了C++庞大臃肿的缘由。但C++本身功能的强大多样和独一无二的内存控制力依然是其他语言无法企及的。C++语言特性庞杂的确是其弊病,但作为用户我们在使用时可以根据具体的需要进行取舍,这样C++功能的多样性不但不会成为负担,反而会成为一种资源。而JAVA直接在语言层面进行精简,剔除了很多有一定用处但并非必须的特征,同时在某些地方牺牲了一定的灵活性。的确,这在一定程度上削弱了JAVA的控制力(主要是对内存的直接控制),但好处也是显然的,使用JAVA时无需担心内存的释放问题,也无需考虑内存分布的选择,我们能把精力更多地放在其他地方。

0 0
原创粉丝点击