`
adapterofcoms
  • 浏览: 74650 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java快 还是 c快[c++快],似是而非的谈

阅读更多

    首先说明一下这个”快”的含义,我想以前那些讨论这个话题的人当然认为这个快是指程序的运行速度,至于”软件开发速度”恐怕想也没想,或许认为软件开发速度和这个话题扯不上一点关系.那么这个问题在网上搜搜,搜的一大堆,那些c/c++阵营的列了很多例子来说明c/c++快, java阵营的也是如此,还提供一些机构的数据来说明java并不慢.可是仍然没有让大家都信服的理由或者结果.从这些讨论中我们应该得到一些启示,那就是讨论这个话题的前提是讨论的人必须既对java有很深的了解还要对c/c++有很深入的接触,否则都是偏面的.
    另外从网上的结果看大家都谈到了一个共同点,编译的方式或机制是对速度是有影响的.在这里提到了java的动态编译的问题JIT(just in time).很明显很多c/c++程序员他不了解java的运行机制,java的动态编译是这样描述的,首先写完一个helloworld.java的源文件交由java compiler得到helloworld .class文件,java.exe会启动Java Virtual Machine,并加载这个class文件通过JIT编译为本机的机器代码.特别要强调的是这个class文件,它是编译原理中所谓的中间代码,它并不是目标代码.也正因为有了这个中间代码才使动态编译得以实现,而c/c++是直接到二进制的机器代码,也不需要中间代码多次一举.不过不要认为java的class文件是多余的哦,它的真正目的就是整个java语言的承诺write once, run anywhere,也就是说不管你是在windows os平台还是在linux os平台,class都是一样的,只是Java Virtual Machine是不一样的,所以有不同os版本的jdk(要想运行java一般只要Java Runtime Environments就够了).同理.NET也是这样的,所谓的.net framework就是承担了JVM的角色.说到这有必要提醒一下各位java为什么要搞个JVM,.NET难道是仅仅为了和java竞争才搞.net framework吗?呵呵,原因也许很多,但一定会有软件开发周期,人力成本,这很重要哦,呵呵,快要扯到软件开发速度上来了.
    在这里我要提醒各位的是关于编译器的,用java完全可以写出一个c/c++编译器,当然更可以写出一个java编译器,不要奇怪哦,如果你懂编译原理的话,你一定会赞同我的观点的. 鸡和鸡蛋的问题!!!
    如果那种语言慢的令人无法忍受的话,那它早就推出历史舞台了,可是java退出了吗,我们先不谈现在java软件的全球市场份额,就看看TIOBE世界编程语言排行榜,排在前3位的是java,c,c++.Java的使用人数现在每年在小幅下降,不是因为它运行慢,而是相对有些软件.net的开发速度更快了,注意哦,是开发速度,不是运行速度哦!!!
    计算机语言充其量不过是个工具,c语言在宿主的环境 (例如装有操作系统的环境) 中如果离开(操作)系统提供的API(Application Programming Interfaces)或者系统调用接口的话,那它除了做做数值计算什么也做不了,哦,顺便提一下那些stdio , stdlib等这些标准库它们的实现也是调用了(操作)系统的API,例如:malloc它的windows实现会调用windows api HeapAlloc来分配堆.所以你所在的系统不同,stdio,stdlib等这些标准库的实现也不一样,当然函数接口功能是一致的,要不然就不标准了吗!在学校的时候,似乎无人不说c语言难,我要说的是难的不是c语言,难的是c所应用的领域的业务理论,逻辑,流程.例如:使用c进行数值计算,难的就是算法,如果算法一旦给出,你只需用c来表达.如果c语言本身很难的话,它还会在TIOBE世界编程语言排行榜中占第2位吗!java语言也是如此,离开了那些java,javax packages那它还能干什么呢?
    每种语言有它擅长的领域,也就是说它的发明出现是有目的的,并且伴随着软件开发理论的发展,符合软件工程的要求.在学每一种语言的开头都会介绍该语言的历史,展示它比以前的语言是如何如何进步的一面,他们都会强调该语言是如何如何符合软件工程的要求,如何如何提高了开发速度,而有不会大幅度降低运行速度.所以学习过c++,java的人都会发现在学习这些语言的时候居然要同步学习面向对象的编程思想,甚至还会附带更多看上去好像和语言无关的东西,其实就是这些开发思想,理念,原则,理论等等一大堆东东都体现在了这些语言里.所以学习一门语言不仅仅是语言本身的特性,更重要的是它所体现包含的软件开发思想.
    下面的这句话是摘之孟岩写的“Java替代C语言的可能性”,他在文中说到:"Java在意识形态上是要面向企业应用软件的开发,所以特别强调架构,强调设计模式,强调标准,强调规规矩矩,强调高姿态,强调一种华贵的宫廷气质。在C 中,你吃饭就是吃饭,捧起碗来喝酒,放下筷子骂娘,甩开膀子抓肉,撸起袖子抹油。而在Java中,你经常为了要干某件事,先new一个对象,然后以这个对象为参数new另一个对象,如此这般重复n遍,得到真正需要的对象,最后就是为了调用那个对象的一个方法,就好比吃饭时焚香洗面,漱口净手,战战兢兢,毕恭毕敬。在C中,遇到问题要像亡命徒,像流氓版程咬金,管你三七二十一,冲上去就是三板斧,还怕劈不死你丫的。在Java里,遇到问题要像宋襄公,要张榜檄文,要名正言顺,要礼仪之邦,要把架子拉开了,把谱儿摆足了。Java的口号是,不管劈不劈的死,先把你小子感动了再说。这套繁琐的东西,对于基础软件开发来说,既不必要,也很难习惯。需要说明的是,这不是Java语言的问题,其实Java本身不必如此复杂、如此巴洛克。"针对这句话我想说的是其中的java,java之所以像他说的那样所谓的繁琐,这恰恰体现了java这种语言所要表达的软件工程思想,java是面向对象的,面向对象的原则之一是面向接口编程,所以为了要干某件事还不像孟岩上面说的那样,应该这样,先定义一个接口类,再写一个实现类,再写一个工厂类用来产生前面的接口类的实例,而不是简单的new,你是不是已经觉得更繁了,呵呵,还有所谓更繁的呢,我不用工厂类了,我用了个抽象的工厂类,给它定义一个产生这个工厂类的实例的静态方法,得到这个工厂类的实例再用它来产生前面的接口类的实例.为啥这么做啊?因为java符合了面向企业应用软件的开发要求,因为企业需求变化很快,所以要接口,要通过工厂模式来create它,如果这样,当需求变化后我只需修改或添加新的实现类,再修改一下工厂类的create方法,而对该接口引用的外部或外层代码则不需作任何改动,你看接口引用,实现,创建各部分都分的清清楚楚,以后代码维护自然容易,又能适应需求的变化.另外对于程序员而言可不要以为写的代码多了哦,恰恰相反,你利用设计工具画几个类图它就会帮你自动生成接口,工厂类了,你只需在IDE中写实现类就ok了.
    机器指令就不说了,汇编到c,c到c++,c++到java,脚本语言(lua,php,python,ruby)…从左到右程序运行速度是递减的,而软件开发速度是递增的.总之程序员写的更少,更快,但编译器做的更多(附加插入的机器指令也会更多), 设计和开发工具IDE也会做的更多,附加的标准库,标准模板库等等封装的更多,还有涉及方方面面的开源的库简直不计其数.好像程序员轻松了,其实更累了,整个软件业对程序员的要求更高了,但又不一定,因为大量的框架提供了开发的便携性,使得程序员只需到达会应用的水平,而不必知其所以然.所以大部分程序员又廉价起来了, 软件蓝领出现了,人力成本便宜了,这又是软件规模开发所期望的结果.早期MDA的架构理论者狂吹MDA的代码自动生成能力会让软件蓝领失业.
    其实在这个”java快还是c快”话题中最”冤”的是java,因为有太多的人,证据来说java是如何的比c慢,如何的耗内存.之所以这样是因为有太多的人不了解java,甚至有太多的java程序员都不了解java,会写java程序与对java的理解是两码事.
    Eclipse是一个用来开发java软件的IDE,是IBM开源的,悲哀的事情来了,有很多java程序员都不知到eclipse是用java写成的,他们一看到eclipse.exe他们就立马否定了它是用java写的,所以有这种想法的人请你把本机的JRE(JDK)删除,看你的eclipse还能否启动. 如果你还有疑问,那你一定不知道JNI(java native interface),JVM可是c/c++写成哦,呵呵,说到这是不是有点”同根生”的味道,现在却要”相争何太快”.请使用反汇编工具看看eclipse.exe都干了些什么,最好也看看JDK中的java.exe又干了些什么.其实它们的功能大同小异,它们都会加载jvm.dll/libjvm.so(在windows JRE的bin/server或者linux JRE的lib/[i386,amd64]/server 目录中),创建JVM实例,通过JNI加载main class,并调用它的main方法.但是疑问也来了,不管是java,c/c++程序员可能都不相信eclipse这种用java写的窗口程序怎么会运行的如此之快,完全可以和vb,Delphi,c/c++写的窗口程序媲美.因为在他们的印象中java的GUI程序慢的要死,其实也正因为java的GUI慢给java一下扣上了这顶慢帽子.
    在这个世界上JVM(jdk,jre)不是sun公司的专有物,IBM也有哦,只是我们常用的是sun提供的,很可惜它支持GUI的awt, swing包在最初的设计上过于抽象,使得速度不尽如人意,当然现在一直有改观.而IBM它提供了swt包来支持java的GUI编程,eclipse是基于swt的,eclipse plugin插件编程出现了,eclipse的插件体系和在GUI方面的积累和框架已经很成熟了,也很多,可惜知道的人很少,去www.eclipse.org看看吧.Myeclipse也是同理哦,它不仅集成了eclipse,还内置了jdk.有人说java做不了系统软件,是啊,我前面就说过了, 每种语言有它擅长的领域.
    但是有必要提一下嵌入式编程,不要以为嵌入式软件都是系统软件,java在这个市场中的份额可是很高的哦,要不Microsoft怎么会眼红呢.J2ME,J2EE,J2SE是sun针对不同的应用领域提出的3套规范和API,其中J2SE就是指jdk,J2ME是专门用于微型设备开发的,它是J2SE的一个很小的子集,轻量了很多.J2EE是一套面向企业应用的规范,以J2SE为基础.呵呵,看看java的发展史吧,它天生就是为电视、控制烤面包机等家用电器(消费性电子产品)的交互操作而开发的.
    最后提一下JNI,它是java可扩展能力的backbone, JNI是以c/c++的语言形式提供的接口,c/c++通过它可以和JVM通信,也就是可以和java交互了哦.我前面也说了JVM本身就是用c/c++写成的,都在jvm.dll/jvm.so中.
    再说java的耗内存,这个如果在苛刻的硬件条件下确实是个问题,不过现在的趋势是硬件一直在降价,硬件的性能在提升.以前的c/c++程序员在硬件条件的限制下为了达到性能上的最优,写的代码是不太可读的,这是与软件工程理论相违背的,我们现在为了程序以后的可维护,降低维护成本,我们可以牺牲一定的性能也要维护程序的可读性,不仅如此我们为了项目的开发周期能在规定的时间内达到最大的完成度,在选择技术,框架的时候我们首先考虑的是开发速度,其次才是运行速度.在性能调优方面我们来看看<<c和指针>>怎么说吧, ”改进算法胜于优化代码”page403,这里的算法完全可以延展为设计,所以不要迷信某种语言或技术的快慢性能,如果设计本身就很糟糕,那么再优的技术,再快的语言也无济于事. ”实际上,在大多数情况下,若要提高系统的运行性能,增加RAM比提高CPU的速度所产生的效果更好.”摘之<<windows 核心编程>>中的第1 3章Windows的内存结构的page305.我想java的设计者不会傻的连这个都不知道吧!
    性能优化无非是内存和CPU,空间和时间的博弈.
    昨天又听到这样一句话”http比tcp慢”……哪位有空的仁兄也来谈谈网络吧, 呵呵!

 

0
0
分享到:
评论
2 楼 2022228 2010-05-12  
敬仰楼主的功底。。。
1 楼 fengzhizi715 2010-02-06  
Java是我的工作语言,Groovy是我的周末语言,我喜欢GoG那种快速开发带来的乐趣。
对了,一点点建议,大哥把文章稍微编辑一下吧,这样看起来会舒服些,呵呵。

相关推荐

    各种学习资料 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++,适合java程序员快速学习c++

    "从 Java 到 C++, 适合 Java 程序员快速学习 C++" 这篇文章旨在帮助 Java 程序员快速学习 C++,通过比较 Java 和 C++ 的区别,帮助读者快速理解 C++。以下是从 Java 到 C++ 的知识点总结: 数据类型和变量 * C++ ...

    Java转C++代码工具 J2C

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

    C++代码转java工具

    C++和Java是两种不同的编程语言,每种都有其独特的语法和特性。C++是一种静态类型、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的语言。而Java是一种面向对象的、跨平台的、动态类型的...

    CPlus_to_Java_Converter;C++转java工具

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

    C++转Java工具

    JNI是Java平台提供的一种接口,它允许Java代码调用本地(非Java)代码,如C++或C,反之亦然。这在处理性能敏感的部分,如图形处理、硬件访问或已有的C/C++库时非常有用。在JNI开发中,通常会编写Java代码来定义本地...

    C++调用Java方法

    Android Studio项目,此Demo实现Java调用C++函数,然后C++函数回调Java方法、纯C++直接调用Java方法,此为github地址链接

    C++转换JAVA工具

    "C++转换JAVA工具" 提供了一种解决方案,使得开发者可以从C++代码无缝过渡到Java代码,或者将Java代码转换为C++,以适应不同的开发需求和环境。这种工具的主要目标是提高开发效率,降低维护成本,以及实现平台间的...

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

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

    java调用c c++程序实例

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

    java与C++互通加解密

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

    java与c++通过socket通信

    Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景,尤其在系统集成、设备通讯或者混合编程中。Socket提供了一种基于TCP/IP协议的进程间通信(IPC)方式,可以实现在不同操作系统上的进程之间的数据传输...

    java转c++软件(代码级别)

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。

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

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

    JAVA调用C++编写的DLL(C++和JAVA源码)

    JNI使得Java应用程序可以直接调用C/C++的函数,或者让C/C++代码调用Java方法。 1. **JNI基础**:JNI的核心是定义了一套C/C++的头文件和接口,这些接口提供了与Java虚拟机(JVM)通信的方法。开发者需要编写C++代码...

    《C++ for Java Programmers》高清完整英文PDF版

    书中的章节涵盖C++哲学、最简单的C++、指针和引用变量、基于对象的编程:类、运算符重载、面向对象的编程:继承、模板、异常控制流、输入和输出、集合:标准模板库、原始数组和字符串、C风格C++以及使用Java和C++:...

    c++转化为java神器

    c++转化为java的神器,已经是破解过的哦,没有行数的限制,不需要安装,直接可以用!

    使用JNI进行混合编程:在Java中调用C/C++本地库

    本教程将深入讲解如何使用JNI在Java中调用C/C++的本地库。 首先,我们需要理解JNI的基本概念。JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的...

Global site tag (gtag.js) - Google Analytics