其实,我不懂Java,这篇文章只是随便侃侃。

这个学期选了Craig Chase教授的C++课程,主要是关于template, generic programming, garbage collection, template meta programming 和一点C++内存管理的知识。学期有三个projects,第二个比较有趣,是实现一个生命游戏的模拟器,模拟一个pool中的各种生命类型的class,有些类似联网游戏中的server/client。

Chase教授提到了好程序的判断标准,有几个选择

1. The program is correct (程序是正确的)
2. The program is efficient (程序是有效率的)
3. The program is easy to read (程序易于修改)
4. The program is easy to understand (程序易于阅读)


他说,在一个实际的软件工程中,第一个选择不是好程序的标准,因为这是不可能实现的 :) 达到各方面绝对正确需要无限的时间和人力;第二个选择不是我们最想要的,最终可能会需要,但不是最重要的;正确的选择是第三个,程序易于修改,这样会缩短debug的周期,同时便于完善以提高运行效率;第四个选择实际上是第三个的一部分。

这门课改变了我对C++的观点,那就是C++程序的效率并不比C差,运行效率取决于算法。首先C++能够很容易实现的一些oop问题,用C实现会很丑陋,而且效率不会比C++好;其次C++的generic programming可以减少大量的重复劳动并降低出错的几率;还有C++的template metaprogramming将一些run time的计算放在了compile time并且大量使用inline会提高运行效率。STL的container class已经对一些基本的数据结构和算法做了优化,除非是针对特殊的数据使用手工编写的算法,STL做的已经很好。

这里有一篇C++鼓吹者的文章,很值得一看,充分说明了算法才是决定运行效率的关键。(不过里面对程序行数的比较是不是太吹毛求疵了,我可以用Mathematica几行搞定相似的算法,呵呵)

还有一个比较有趣的网页在这里,比较了各种语言的的程序包运行效率并做成了benchmark,从这个比较中可以看出在某种特定的加权下单从运行速度的角度C++是最好的,C紧跟其后。

在以往的数年里,Chase的这课的后半学期讲Java,这来自企业界对毕业生Java编程经验的要求。不过这个学期从头到尾都是C++,有人在期末问Chase要不要在期末考里加入Java的内容,Chase教授一脸阴险地说:知道你们不会Java,所以我会故意放点Java进去,好拉开大家的分数。不过最后也没喝到Chase的Java :)

于是,在考完后找了本teach yourself XXX in 24hours 的傻瓜书来看(xxx=java),发现C++和Java的区别包括

运行效率很多情况差一个量级
java语言自带garbage collector
java数据全都是指针放在heap上(dynamic allocate)
java不支持multiple inheritance
java没有模板类

我现在想到的用java的好处是平台无关和对求职有用,据说一行java代码比一行C++代码更值钱,呵呵。

于是转而看jsp,发现这是个鸡肋。搭建tomcat服务器+JDK发现已经巨繁无比,搭起来写个应用目录结构搞的和写desktop application一样罗嗦,有必要吗,终于忍不住了于是apt-get remove –purge了。如果是小型的网站,PHP足矣,学习曲线短,写的程序又易于维护(见之前讨论的好程序原则),如果是那种重荷载的工业级别的网络应用,为甚么要用J2EE呢,PHP前端+C++写的模块不更好吗,兼顾了效率和可维护性能。很容易就能找到用PHP写的不错的网站,但很难找到用JSP写的不慢的网站。不过,有一个说法是jsp程序员的薪水较高,这个其实容易理解,原因见我的这篇文章 :)

罗嗦了半天,最后再抱怨下scim输入法,输了一堆错误的字符然后Ctrl+space后切换到英文,然后Ctrl+space再切换到中文,发现之前敲进去的那堆垃圾还在,需要狂按backspace删除才能输入想输的词语。真是不方便啊。我知道修改这个缺陷只要改几行源代码却不去动手做,这大概就叫做懒惰吧 :)

唠叨完了,还是用俺的Fortran写并行程序吧,还是Fortran好啊,只用global data和stack不用heap,也不用为garbage collection 操心,多好 :)

阅读(1700 次)

Creative Commons 授权
此文, 除非有特别申明, 的授权协议是 Creative Commons Attribution-Noncommercial 2.5 China Mainland 网站授权.