c++和java(c#)之间的pk
个人认为本文较偏激,且年代较久远,但可以一看。
1、谁好谁坏?
如同当初我没有想到会进入java阵营一样,这次闯入c++阵营也是意料之外的。多年前,受到微软的影响,我几乎是微软的铁杆,对从QB到c#都是深入学习过的。我一直以为微软的软件是做的最人性化的,最好的。2年前,不经意的走进了java的大门,虽然我学习过java,但是对于这个不能做漂亮界面的语言一直有抵触的思想。这一次走入,让我成了java的忠实支持者。支持java的开源社区,群众的力量远远大于微软的那几个,和他们相比,微软的东西(除了操作系统)就算是机械时代的产物了。
再次转移到c++阵营,迎面而来的是一阵担忧的云雾。无论是Linux创造者对c++的鄙视,还是c++应用范围的严重萎缩,都不得不让我担惊害怕。经过1个多月的熟悉之后,我又慢慢的恢复了一点点感觉。我们承认,做应用c++不如c#(java)等没有指针的语言,做底层c++不如c等速度快的语言。但,我们不能否认,在复杂度较高的算法级别,在使用了stl和boost等大量优秀库后,c++绝对比c#(java)运行快,比c编码快。要注意,这时的c++,拥有了c#(java)的内存处理的优点,也拥有c的速度的优点。
如果你要编写复杂的算法,那么c++是最好的选择。如果你只是测试算法,你可以用java(c#);如果是要在单片机上面运行,你可以用c。但是,如果你要做一个在pc上运行的程序的算法底层,c++绝对是最好的选择。
2、java的编程特点
java的成功完全得益于它在网络应用上的推广。广大开源阵营的兄弟们也是java得以红遍天的主要推动者。虽然js和java没有什么本质联系,但js标准也成了java语言的宣传者。比较起来,java自己宣称的跨平台特性反而并不受人关注。
java语言目前最成功的地方至少有3个方面:1)jvm速度的不断提高;2)大量优秀ide的出现;3)数也数不清的开源库。简单的说,可以用java的地方,一个审时度势的人不会使用c/c++。
java的最大优势是它的不断持续的发展。在java世界,早就是j2ee的分布式部署、rmi的远程调用、spring的反转控制、aop的切片控制等其他语言想都不敢想的技术的天下了。使用java的人,永远都要走在技术的最前沿!
使用java编程,你必须理解各种构架,你必须理解各种设计模式;使用其他语言,可能你就只需要知道怎么写函数即可。举例来说,有个用c/c++写了10年代码的人,猛然看到java的程序,他看的头晕目眩,说到处是接口,跳来跳去都看不清楚怎么回事。他只理解到函数级别,当然看不明白基于对象级别设计的java程序。
3、c++的编程特点
c++最大的麻烦来自于ide编程环境。比较起来VS.net的编程环境已经算是这个方面的佼佼者了,可是,你必须要给它安装许多插件才能够达到Java的ide的那种程度。如果你没有给你的vs.net安装代码自动提示和代码格式化的插件,那就说明你还在浪费力气的多敲空格(《代码大全》上面说,程序员有30%的编写代码的时间花费在敲额外的空格上了)。
使用c++编程的最大好处是,你能够使用到最新的算法。一般研究算法的人都会用c/c++来构建他们的代码库,究其原因,恐怕是因为那些大学者们年纪比较大,没有学过java(呵呵)。所以,你要找个基础的数据结构,比如,kdb-tree的实现,找c++的要容易得多。集中一点,c++就是为算法而生的。你用它来做任何其他事情都不是很合适。
使用c++的兄弟大部分都是被c++的古怪特性吓怕了的。无论是到处会出现的const无法转化为非const,还是常数无法转化为引用,还是有的函数指针居然是8字节,还是namespace只具有象征意义等等,c++中的古怪行为实在难以枚举。如果你还没有遇到过,那恭喜你啦,你已经成为顶级高手了或者你还在十分低效的编程。这里要告诫那些以理解c++的一些奇特性质而沾沾自喜的兄弟们,不要学这些垃圾的东西,这些古怪的特征肯定会被抛弃的。这点如同你不要用java中标明为deprecated的方法一样。
在c++中,你一定要万分注意命名规则(因为ide并不会告诉你某个名字的真正类型)。为了你自己也是为了别人好。
4、相互学习
学习c++,你最该看的书是:stl相关、boost相关、effective c++、c++ prime、代码大全 等等。学习java,你最该看的书是:设计模式、软件工程(如敏捷编程)、java3标准、算法设计。用c++的人一般把自己看成一个低级程序员,用java的人一般把自己看成一个设计师。虽然初级c++程序员比初级java程序员薪水高。但高级的c++程序员却不比高级的java程序员薪水高。
另外,让人感觉到意外的一点是,使用java的人普遍比使用c++的对基本算法了解更加深入。我想可能是因为java里面的算法是开源库,容易看明白;同时,java要想跑的快,算法是必须考虑的。当然了,用java写一个算法比用c++写一个要来得快很多。举例来说,几乎用java的人人人都知道动态数组(ArrayList)是怎么工作的,但是,使用c++的人却只有少数知道动态数组怎么工作(vector)。
c++和java程序员的自我感觉真的差好远,居然会有c++团队3个月都不交流一次!这点在java看来几乎是不可能的,3个月之后构想肯定发生改变了。
根据分析,c++程序员应该提高自己的构架能力,而java程序员应该提高自己对语言的理解和代码编写能力。只有相互学习才能够让我们编写的软件不成为垃圾。
c++和java(c#)之间的pk的更多相关文章
- Java线程之间通信
用多线程的目的:更好的利用CPU的资源.因为所有的多线程代码都可以用单线程来实现. 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程. 并行:多个CPU实例或者多台机器同时执行一段处理逻辑, ...
- JSON 与JAVA对象之间的转换(转)
JSON与XML两者目前在数据交互方面都有很高的使用率,随着现在SOA的兴起,异构系统的整合地位相应提高,本篇文章主要介绍JSON与JAVA对象之间的相互转换. 一.对普通类型的JSON模式的转换 一 ...
- Java类之间的关联关系(转载)
Java类之间的关联关系 UML类图中的关系分为四种:泛化.依赖.关联.实现:关联关系又可以细化为聚合和组合. 一.泛化(Generalization) 泛化是父类和子类之间的关系,子类继承父类的所有 ...
- 两个java工程之间的相互调用方法
如果你有两个java项目的话,如何向他们之间进行信息的通信前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径.其实两个java项目之间的通信还是使用HTTP的请求.主要有两种 ...
- 关于CPU核心,线程,进程,并发,并行,及java线程之间的关系
前言:作为一个转行java的小白,一直搞不清楚java中的多线程.于是来梳理一下关于CPU核心,线程,进程,并发,并行,及java线程之间的关系, 1.CPU角度来看: 我们以Intel的Core i ...
- 附:常见的Jdbc Type 与 Java Type之间的关系
附:常见的Jdbc Type 与 Java Type之间的关系 JDBC Type Java Type CHAR String VARCHAR String LONG ...
- JAVA多线程之间共享数据BlockingQueue介绍
在JAVA的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. ...
- 别名现象,java对象之间的相互赋值
请看一下代码 import java.util.*; class book{ static int c = null; } public static void main(String[] args ...
- 使用RandomAccessFile在两个java进程之间传递数据
大部分情况下,我们面对在两个java进程只见传递数据的问题时,第一个想到的就是开server,然后通过socket收发消息.这方面有大量的框架可用,就不细说了.但如果两个进程是在一台机器上,那么还可以 ...
随机推荐
- android音乐播放器开发 SweetMusicPlayer 播放本地音乐
上一篇写了载入歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,如今来总结下播放本地音乐. 一,MediaPlayer 首 ...
- LabVIEW设计模式系列——普遍使用值改变事件
标准: 1.当使用值改变事件时,使用单击时触发或者单击时释放开关动作.这样即保证仅仅触发一次,也保证按钮恢复默认值 标准:1.值改变事件的优点:不论是鼠标动作还是键盘动作都能触发值改变事件,增强了程序 ...
- Android开发之手势滑动(滑动手势监听)详解
Android开发之手势滑动(滑动手势监听)详解 在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListen ...
- CentOS7安装Puppet+GitLab+Bind
添加Puppet官方源 rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm 安装Puppet yum -y i ...
- MyTask4
最近稍微做了点修改,把几处bug修复了下,另外新增了授权码功能和数据缓冲功能 先看看效果图 1. 如果要把软件做的高大上一些,你可以加一个授权验证,授权码以字符串形式存放在程序里面,当然你也可以另外开 ...
- Android本地JUnit Text
Android本地JUnit Text 步骤 创建一个和source文件,里面添加和src目录相同的包. 在AndroidManifest.xml文件manifest根节点添加如下文件 <ins ...
- Java环境变量批处理文件
缘由 公司需要配置大量的虚机,每个上面都要求安装 JAVA,配置环境变量,所以要求写一个批处理,一键配置环境变量 方式 网上找到了3中方式, 第一种是使用 set设置环境 变量,但是这样设置的只是临时 ...
- oraclesql日志
select * from v$logfile; select * from v$sql select sql_text,module,action,parsing_schema_name,firs ...
- 最新的 iOS 申请证书与发布流程(2016.12)
今天刚好客户定制的APP需要上架,也提供了新的开发者账号,所以就顺带把申请证书与发布流程写一遍. 证书是什么? 上面这个就是我们申请好证书后,下载到本地的.cer文件,也就是常说的开发证书与发布证书的 ...
- Object-C 类实现
这篇为Object-C添加方法的后续. 这里我们应该在类的实现(.m)文件中写 #import "Photo.h" @implementation Photo - (NSStrin ...