Thursday, June 23, 2011

Fortran和C++的比较

我经常用Fortran,偶尔用C++,所以也想说两句,重点说Fortran相对于C++的优缺点(不对的话请不要拍砖)。

1.F 的数组确实是C++没有办法比的,虽然现在C++的Matrix class到处都有(Matrix class是底层类,所以代码重用性很好,医学的人 编的学土木的也能直接用),所以矩阵直接+、-、*、逆等运算Fortran不比C++强,唯一在此方面强的是F中可以随便拿出矩阵的一部分(行、列呀, 或行中的某几个数啊)然后再进行运算。C++的Matrix class目前还没这么灵活,或者至少写个长点的式子才行,不像F,A(3:5)一下就就搞 定了。对于外加库,现在F有的数值库,C++也都有相应的版本;

2.对于矩阵维数F也不比C++强,只是C++中你定义一个5维的矩阵,赋值就累死你了,此时就是要看看Matrix class里有没有大于2为数组的运算了;

3.运算速度:对相同问题F=1.2C++,这是很多研究者公认的,也是被检测过的。但是程序的运算速度和编译器,编写代码的习惯也有很大关系,所以一般人自己编程序感觉不到差别的;

4.代码重用性,F远不如C++,C++的面向对象确实比F强很多很多,F的面向对象还是大家的梦想,F2003确实很及时,如果F在5年之内还没有面向对象的功能,F的用户就走光了(我就是作有限元的,深有体会);

5.C++的编译器发展很快,主要是Microsoft强悍的支持,F的就不行了,2004年发布的2003标准都3年了,现在大家还是在期望之中;

6.关于高性能计算,F比较好,但是C(不是C++)也有类似于HPF的版本,叫UPC,所以两者实际上差不太多的(C也不是面向对象,F也不是,F比C稍快点),F95/2003中对并行的支持实际非常有限,F2008是个大的进步,但是不知何时才有编译器出来,呵呵;

7.C++可以开发软件的全部,而F只能作核心计算部分的编写。C++的数据类型要比F多好几种,并且现在复数运算在C++中也可以直接定义实现了;

8.内存垃圾F是不自动清除的,但是想在的C++好像可以自动清除(有点不确定),Java肯定是自动清除的,所以在这个层面来讲F比较弱;

9.除了数值方面,F都是在向C++学的;

10.F有大量可参考的代码,我感觉也不是什么优势,因为C++的可参考代码也很多,而且一个值得指出的地方是C++的代码都比较新;

11.还有要说的是F经常被说什么数据严谨、风格严格、当初设计就是为了数值计算的(要知道设计时是60和70年代,估计要还是当初的设计早就落后的不可就要了)等等等的,感觉其它语言也是这样啊,并不能把这一类的东西作为F的优点(因该说是不实在的优点 呵呵);

综上,F的优点是数组运算稍强于C++,速度比C++快,其它的都和C++持平或较差,我想这是个客观的评价吧!因为这两个小优点,我就一直用着F,当然面向对象和编译器的不好用也是俺的悲哀。

个人建议,作研究用F还是挺好的(上手快),如果想编商业化有限元软件还是C++是首选,这一点可以从近10年来新出现的数值分析软件中看出来(F2003可能会稍微缓解一下这个问题),牺牲点效率换回短时间的开发和维护(因为编译器好)是值得的。

谢谢你的文章,让人获益匪浅。不过倒是有几个不同的意见。
1. Matrix Class没用过几个,毕竟我不是搞 数值计算的。但是因为C/C++中的数组看起变就像指针。因此如果“要拿出其中的一部份”来用,也是可以的比如说F中的A(3:5),如果它是表示拿出数 组的第三到第五个元素,在C++中可以直接用a+3来表示从第三个元素开始拿,而自己去控制拿到第几个元素。不过如果A(3:5)表示定义一个下标从3到 5的数组,那在C/C++中就没办法了。

2.给一个大数组赋值,在哪种语言里都累死人啊。。。

3.F=1.2C++,这点没看到过。不过应该也是可信的。毕竟F是以数值计算见长。^_^

4.5.F2003标准是面向对象的,只是很不幸现在鲜见F2003的编译器啊,这不是F的错。:(

6.看了你对F2008的评述,感觉F与C++的下一个版本C++0x好像都向着并行的方向发展着,这个要以后才能看到高下。^_^

7.C++中并不直接支持复数,还是要靠class。^_^这点不如Fortran,不过C99支持了,但是到现在我愣是没学会C99的复数该如何使用。。。

8.C++中仍然要自己管理内存,只是有了C++中class的保证,才让这个任务简单了些。这点二者都是一个德行。

9.这点可不敢说,一来对F不了解,二来怕人家喷我口水。。。。

10.F 的代码一般都是科学计算领域的吧?估计在科学计算领域,F很长时间内都不会消失。而C++代码中可以体现新近发展出来的模板元编程,泛型的好像不多,可能 是我见识少,只知道有boost/loki/bliz++/MPL是这样的。其它的库好像都只停留在class的中世纪。

11.风格倒是挺严谨,连不同用途的变量命名都有规定,开头有几个空格也有规定。这点真有点不爽。当初就是因为这个规定放弃了F的学习,毕竟从C过来的人写起程序来比较随意。。。

期待更完美的F编译器的出现^_^
不过不像C++那种大量应用到系统软件编程的语言,F只局限于科学计算领域,所以像MS这种公司是不大可能花力气到F上的。毕竟它面向的领域比较着重于科学计算,MS在上面赚不了钱,所以只有某些比较偏重学术或者看重运算速度的公司才会在上面花力气。^_^
不知道我讲的对不对。

谢谢大家的指教,对Fortran的能力总算有了点了解,谢谢大家。

比较喜欢lishhit的回答,非常中肯,很有功力,极为赞同。
做大型的程序还是C++比较容易维护,”牺牲点效率换回短时间的开发和维护(因为编译器好)是值得的“,这点我非常同意。


No comments:

Post a Comment