Java,天生丽质乱人眼 zz

Java在国外很多大学已经取代语言成为主要教授的语言了。
       上面这句是话我在很多Java论坛上经常看到的,意为Java已经打倒了C的霸主地位,成为了编程界一统天下的强大语言了。
        Java确实天生丽质,严谨的类库设计,多面手的应用和非凡的语法让我一接触到Java就被深深地迷住了。但是Java能够取代C这一点上,我还是不敢苟同。
        C,何方神圣也?Unix,Linux,Winows包括Apple System等各种操作系统的主要构建语言,是全世界编写过软件最多的语言。如今C的地位也许会在某一天被更好的编程方法取代(注意,是更好的编程方法,C语言是非常容易扩展的),但能取代它的决不是Java。
        我估计说Java能取代C的仁兄大抵是听错了,Java能取代C++这一点我还是赞同的。

        在大学里,C++是教什么的?因为SmartTalk一直没有一个完善的实现版本,所以C++取代SmartTalk在大学里用来教授面向对象编程方法,也就是说C++仅仅是用来讲授一种编程的方法,一种编程的理念。论面向对象编程语言,Java的确是目前最完美的,这一点倒是不争的事实。

        仅仅在面向对象这个方面而言,Java确实强过了C++,但C++还包括着C这个子集,C语言才是C++能够称霸编程界的法宝,而不是面向对象。

        我常对我身边的人说,C是拿来学的,Java是拿来用的,借着Java学计算机,没多久肯定就把人学到坑里了。
        我还经常对他们说,玩不好C的人,肯定玩不好Java,连内存用完该释放都不懂的人,还有那些居然在循环里分配堆的人,根本不配编程序。把一切都交给垃圾回收器?还真幸亏有个Java了。对有的程序而言,自动堆管理不见得是个好东西。

        C语言除了取代了Pascal语言用来描述算法以外,在一些场合还可以取代汇编来描述计算机组成机构,C语言当然也可以方便的描述操作系统原理。伟大的指针将这些东西有机的统一在了一起。指针是什么?就是一个4字节整数,但它比孙悟空还要厉害千百倍,在任意时刻,程序员认为它指向的是什么,它就能指向什么。C语言就是这样,熟悉指针的人会觉得编程无非如此,计算机无非如此。
        Java的引用无非就是指针的变形,Java为了统一,干脆将所有的东西(除了简单对象)都用指针来表示,但Java严禁程序员任意操作指针,有人会说,这才是Java安全的地方,我倒!安全是一个相对概念,C语言程序写的好了,是绝对安全的,但Java把安全全部托付给了虚拟机,一旦虚拟机出现问题,被黑客攻破,那将是全世界Java程序的一场灾难。至少,Java的程序员大多并不知道,操作系统的漏洞是怎么回事儿,内存缓冲区溢出是怎么回事儿,硬件异常是怎么回事儿,因为他们碰不到这些问题,当然也无从了解。
        单纯学Java的程序员,可要小心了,没准你会在不断进步的Java SDK和虚拟机规范的娇生惯养下,最终成为一个不会写程序的人。

        大部分人学习Java,应该是缘于Java的简单和强大,Java是比C简单,更比C++简单(我一直认为C++的发明人并不是为了简化C编程才发明的C++,他似乎只是为了宣扬他的哲学思想),Java也确实比C强大,也比C++强大。Java的简单是缘于它超强的变量约束和自动的内存管理,以及更方便的关键字和语句,另外,Java不用理会字节对齐,参数如何传递这些东西;Java的强大缘于它具有一个庞大的类库,这个类库远远强于C语言的标准库和C++的标准库,C语言的标准库无非就是描述了I/O,内存管理(很简易的)和算法,而C++标准库则强化了算法描述(C++的泛型比Java的泛型可是强大多了),并且把I/O和内存管理对象化,无非就这样。Java的类库则涵盖了方方面面,I/O,内存,视频音频,网络等等,让程序员彻底享受调用类库拼装程序的简便,但如果除去类库,Java在语言方面则没有C语言和C++语言强,因为没有指针,仅此而已。用C语言可以在一台计算机上为所欲为,Java则不行。
       
        其实Java并不简单,Java把很多东西搞得麻烦得很,这大部分是Java为了保证类库的完整性和统一性,不得不做出的牺牲,C语言则不然,本身就没有统一的类库,程序员爱怎么写,都是他们的自由。
        Java的可移植性是Java的最大亮点,但是究竟如何呢?在J2ME上,我几乎没有看到Java的可移植性表现在哪里,为了互相竞争,不同的设备制造商往往会实现一个并不标准的虚拟机,或者将一些自己使用的类库封存在硬件里,这就导致了在移动设备上,Java基本没有一次编写,处处运行的能力,大部分游戏和软件都标注有厂商,甚至终端机型;在J2SE上,Java的可移植性表现的最好,但也不是绝对可移植,因为一些针对于操作系统的核心组件(比如说针对于操作系统的文件操作,或者需要和操作系统已有接口挂接),就必然要用到JIN技术将C语言动态库或类似二进制代码包装进Java,这间接影响到了Java的移植性。大部分厂商用Java做界面这一部分(Oracle,而后台依旧跑着C语言编写的引擎),这样做已经可以大大的缩短软件厂商的平台移植时间了(界面是平台移植里最繁琐最费时间的环节);J2EE,和J2ME一样,个个服务器容器提供商都会在自己的产品里集成强大的Java组件,来完成更优秀的工作,同时也就造成了针对一台服务器容器编写的中间键,并不能绝对的不作修改就移植到另一台服务器容器里。随着厂商竞争的不断加剧和激烈,统一操作系统和平台规范,比制定跨平台规范来的更实际一些(主要是微软捣乱,否则也轮不到Java出场),想想看,为什么全球人都学英语?因为这样才能方便沟通,Java虚拟机其实就是个翻译,翻译学习速度再快,也赶不上发展。

        我敢说,大部分使用Java的人主要还是看到了Java的简单,至于可移植,可扩展什么的,估计还不是大部分人选择Java的原因。

        但还是那句话,Java绝对不适合用来了解计算机,了解操作系统,Java语言本身和计算机与操作系统都是无关的。

        说说Java的应用吧。Java的应用是Java最值得称道的地方,毕竟有庞大的类库支持,简单、不容易出错,Java确实是最适合开发商业逻辑的语言之一。但除此之外,Java是不可能取代C语言完成操作系统相关的开发的,是的,目前来说绝对没这个可能,在某些Java论坛上发表此类言论的兄弟们也就不要误导视听了。
        首先,对于操作系统的开发,必须要得到操作系统API的支持,目前来说,包括以后很长时间,操作系统的API都将是C语言编写的,这有历史性的原因,也有语言方面的原因(Java肯定不能进行内存分页,读取描述子表,读取交换页快表,操作Cache,当然,这些C语言也没法做,但C毕竟和汇编是可以统一编译的,在此基础上,C语言可以继续开发针对汇编是更高层次,但对于Java依旧非常底层的系统程序),而底层的网络开发(比如协议描述,标准描述)则由于C语言有更贴近硬件的I/O操作能力(比如C语言可以操作硬件I/O中断来回调服务程序)而无法被取代(当然,这种底层的软件开发一般人是碰不到的);其次,对于操作系统的开发,必须要熟悉某种操作系统的特点(比如Windows的抢先多任务,Linux的多用户,它们的各种特性),Java的程序员最不关心的就是操作系统了,这一点Java程序员无法胜任。
        也就是说,Java还是主要开发商业逻辑的一种语言,并不是一种可以作底层做设备的语言。而随着其它语言的不断发展,Java也渐渐的不能再商业逻辑这一块上一家独大了,但Java毕竟是免费和开源的,所以还是有很大的市场潜力。

        最后说说Java的效率,Java虚拟机采用了很多办法提高Java的效率,很多情况下,我认为Java的效率要比C语言好。毕竟编译器编译的东西已经比人手写的要好一些了(比如汇编写的东西不一定就比C写的编译后的运行的快),但还有很多情况,C语言的速度占有绝对优势(还有很多情况,汇编写的东西能上百倍的提高执行效率),这是为什么呢?
        就是因为C语言需要程序员全身心的投入进去,不断地优化,不断地改进,内存怎么分配,代码怎么书写,每一种变动都能带来不同的执行速度,很多影响效率的地方,恰恰就是Java程序员忽视的地方。比如我不止一次的看到Java程序员在一个高速循环里动用堆分配(new操作符或者其它返回新对象的方法),这明摆着就是嫌计算机运行太快,给它制造一些障碍。C程序员小心翼翼的使用着malloc函数,因为C程序员知道,堆分配的速度是很慢的,特别是当堆充满碎片的时候。还有Java程序员不懂得如何控制自动装箱,不懂得如何抛出异常才是最经济的办法,不懂得用return在返回对象肯定不如使用参数来的快。Java程序员很多不熟悉数据结构,不熟悉算法(这些东西他们大部分用不到),不知道HashMap和Map的区别,不知道如何用Java来制作内存链,来制作二叉树,不懂得搜索技术(有数据库呢,这些东西当然会被遗忘),排序技术,不懂得如何绘图最快,不懂得如何降低Java本身播放声音时的CPU占用率,这样写的Java程序,自然会慢,自然比不过C程序员写的C程序,因为,凡是不懂得上述技术的C程序员,肯定用不好C,用不了C。

        每一种语言都有它闪光的地方,都有它迷人的特征,每一个人在学习计算机的时候,要根据自己的实际情况选择一门让自己能够提高最快的语言来学习。学习语言本身就是学习计算机的末流,是附属。编程思想才是一个程序员要掌握的核心。
        很多问题,用各种语言都可以描述,语言本身没有贵贱之分,倒是人们刻意的去寻找这种贵贱区别,迷惑了自己,也迷惑了别人。
        C的程序员们可以放下顾虑,认真地学习Java,这就表明了很多C程序员的博大,也许这些高手已经参透了计算机的本质,学习语言只是因为学了它可以偷懒而以。那么就请很多Java程序员不要在做井底之蛙,来嘲笑一个C语言程序员了。要知道,一个C的高手学Java,只是须臾之事,根本花不了太多的精力和时间。
        我们学Java,只是为了工作的更好,并不是因为不会Java,我们就无所适从。任何一门语言消失了,世界都依旧存在,依旧美好。  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值