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收发消息.这方面有大量的框架可用,就不细说了.但如果两个进程是在一台机器上,那么还可以 ...
随机推荐
- Java 线程池的原理与实现(转)
这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者, ...
- 微信支付 V3版
本人小菜鸟一仅仅.为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群.希望光临本博客的人能够进来交流. 寻 ...
- ubuntu下linux内核源码阅读工具和调试方法总结
http://blog.chinaunix.net/uid-20940095-id-66148.html 一 linux内核源码阅读工具 windows下当然首选source insight, 但是l ...
- careercup-链表 2.7
2.7 编写一个函数,检查链表是否为回文. 思路:1)可以利用链表中的元素采用头插法创建一个新的链表,然后比较两个链表的元素是否相等. 2)利用快慢指针,将链表后半部分逆转之后,比较前半部分与后半 ...
- LabVIEW系列——合并错误(VI)的用法
Merge Errors.vi的功能:1.按顺序搜索错误输入1,2,3,以及错误数组输入中的错误,输出第一个错误. 2.如果没有错误,也就是错误状态都为F ...
- 在eclipse中部署发布web项目 和 更改eclipseweb项目发布的路径
我的工作空间:d:workspaceweb项目名称:xxx在eclipse配置完tomcat后,发布到的路径是 d:\workspace\.metadata\.plugins\org.eclipse. ...
- [XML] resources的Xml配置文件 (转载)
<?xml version="1.0" encoding="utf-8" ?> <resources> <language> ...
- C#网页版计算器程序代码
calculator.aspx.cs代码 using System; using System.Collections.Generic; using System.Linq; using System ...
- javascript 用函数实现“继承”
一.知识储备: 1.枚举属性名称的函数: (1)for...in:可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承属性) (2)Object.keys():返回数组(可枚举的自有属性) ( ...
- Mysql 操作手册
mysql操作手册 版本:5.6.16mysql linux安装基本步骤:#rpm -e --nodeps mysql-lib-5.1.*#rpm -ivh mysql-server#rpm -ivh ...