java 与 C 的比较

 

      应同学的邀请,帮她写一个图像检测的程序,这是一篇毕业论文,核心算法已经给我了,我所做的工作其实就是实现这个算法而已。考虑到MATLAB已经忘的差不多了,决定用C来做,虽然我最近一直在用java。毕竟MATLABC是科研界的标准语言,C是直接面向算法的,按照算法流程一步一步往下走即可。

      而我的C也已经生疏了...,整整花费我一上午的时间来实现这个流程,最后得到了300多行代码,我忘记了好多的语法...,总的来说,对这个时间还算满意了,因为算法的规模比较大,而且这次使用C是在解决一个现实问题,因此从中还是得到了很多收获:

      1、充分的沟通和有效讨论

      因为这次要写300行的代码,其实事前我还没有能力估算是几百行,看流程有些复杂而已。经过充分的沟通和讨论,明朗了问题的本质、现有成果(输入)和目标(输出),弄清了算法的大概流程和原理。这里有个问题,我不知道是什么驱使我在知道算法流程之后还想知道算法的原理,如果把算法比作一个人的话,我会把算法的流程(第1步做什么,第2...)比作人的躯体骨架,我会把算法的原理(为什么第1步这么做...)比作流淌在躯体和骨架中的血液。我不知道这样比方是否恰当,我只是在人让我做什么的时候,我总想知道为什么这么做(做这步的功能和意义是什么、在完成整个任务中的地位)。

我想这也是人之常情,不知道真正的程序员是否这样做,但我这样做之后,我觉着自己可以编制程序了,可以通过一个更好的流程实现算法中的过程了。

      2、懂得使用{}//

      记得老师曾说过,C程序的时候,刚开始应该搭建程序的框架,只是用{}空实现即可。重要的是准备好,要写多少个函数,哪些函数,这些函数的返回值和这个函数要完成的任务(使用//注释符来描述),以及明确整个程序的工作流程(写好函数之间的相互调用)。,也就是所谓的结构化编程思想——自顶向下、逐步细化。然而,对于一个只写些Hello World 的初学者而言,没有上规模程序的体验,怎能真正理解?反正我当时的做法是先写完程序,之后添加//注释,表明函数、语句、语句块等的功能,以期达到所谓的编程规范,能让别人读懂、自己日后能回忆起来。从今天的程序看来,在弄清了整个算法的流程和原理之后,不由自主的使用了这一套结构化的编程方案,首先大量使用了{}//来勾勒整个程序的框架。在之后的细化过程中,每完善一个函数,我都会明确这个函数的功能、在整体中的位置以及它的外部接口情况。

      当然,这些不是只针对C程序的,所有的程序编制过程都应该如此,现在我这样认为。

      用一上午的时间来完成程序的编制,却并不意味着我完成了这个程序,在下午交付程序,我却花了一下午并到了晚上的时间来调试这个程序。这时候,我猛然发现了java的优美!

      我感叹:C是在散兵作战,不排除你会塑造出乱世中的枭雄;java携带优美的旋律在舞蹈,群体的舞动展现了一个优美的旋律。我想用更好的词汇,可惜腹中无墨...

      第一,对抽象数据类型的表现

      根据算法,我typedef了几个struct数据对象结构,这是不由自主的,因为在java中我会不由自主写class。但这儿却有不同,C中的struct仅仅定义了数据的结构,或者说这个结构的静态属性;而java中的class就丰富了,除了数据结构(成员变量集合)外,还一并提供了基于这些数据结构的操作的集合,只有通过这个类或这个类的对象才可使用这些功能(操作),这些功能集合是对自身定义的这个数据结构的服务的集合,操作的对象是这里的数据结构。而在C中,只能在struct之外写一堆功能函数,在任何地方都可使用它们,可以用它来操作别的数据结构,显然这会带来程序的混乱,尤其当我修改这个struct的时候,如果忘记了修改这个功能,必然导致错误。初学的时候,并没有感觉到java类的这个特性(封装了数据结构和基于这个数据结构的操作或服务的集合)有什么了不起,但今天看来,java的这一点多么优美啊。封装,在我心里已经不是一个OO的感念了,它更是一个美好的词汇。

      第二,java是简单的以及java的安全性

      记得SUN公司在老王卖瓜的时候,提出了java的这两个优越特性。出于记忆,可能理解了但并未感受(现在明白了一句话:如果你经理过,你就不要发表言论,你的感受根本不真实)。这300多行C代码的调试工作给我带来了亲身体验,一段经历痛苦煎熬的过程,相信膜拜C的自由战士们都已习以为常了。我承认一点,真正弄清那些莫名其妙的结果后,对程序的过程必然收获很多,但这些收获是程序的,而不是逻辑的,这些收获会让你更了解C而已。在这一点上,C使用的是潜规则,而java是公开的规则。C中你触碰潜规则的后果是用一下午或更长的时间来调试差错;而在java中,C的潜规则被公开了,你触碰这些规则的结果是一个友好的提示(命令行中的编译出错信息或者IDE边栏上的红叉叉),而不用等待莫名的结果。

      程序的使命是完成逻辑任务,如果把过多注意力放在程序本身(关注各种潜规则)上,这是否违背了程序设计的初衷呢?不如用黑盒测试来检验Cjava吧,我们不管编制程序它们各自进行了怎样的处理,我们只会关注你是否完成了任务,于是你带着C进入黑盒,从程序编制到程序雕饰,你花了整整一天才出来,并带回你的正确结果;你再次带着java进入黑盒,然而这次你只用了半天或几个小时就出来了,你同样带出了正确结果。思考这两种情形吧,我不是在批判C,因为这只是一种情境(我们没关注程序执行的速度),我只想说在这种情境的时候,你不能执迷于C了。

      javaC简单的原因是提供了各种基础类库库,和一个优美的群体旋律。同时,javaC简单应该和javaC安全放在一起说,比如java避开了直接指针操作,通过委托jvm可以做同样的事情,使事情变的简单了也避免了莫名的错误。在C中说数据结构(比如数组),会传递指针(或者说地址);同样意图的操作,在Java中“万物皆对象”,数组也是对象,会传递引用。

      C是灵活的,在小场合或者核心环节,他让人羡慕不已。但到了大场合,上了规模之后,你在那活跃反而成了不稳定因素而没有任何好称道的,java自然就受到了欢迎。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值