主题:问一个菜菜的问题。
林杰杰
[专家分:8970] 发布于 2007-07-01 09:59:00
都说Fortran长于运算。想问问,Fortran的什么特性使它长于运算呢?正如C语言(不好意思,见识比较少,只懂这个……大家表拍偶。。。[em8])的贴近机器而适合于底层开发一样。Fortran提供了什么与其它语言不同的特性而使它适于运算?
回复列表 (共16个回复)
11 楼
lishhit [专家分:2400] 发布于 2007-07-01 18:47:00
看了上面的讨论,觉得这个讨论还是很值得的,也感谢林杰杰提出的这个话题。Fortran经常被说作数值计算好,但很少说究竟好在哪里,这确实是个让人不信服的地方。希望我的回答能让林杰杰满意。呵呵,这可是原创啊!!
我经常用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可能会稍微缓解一下这个问题),牺牲点效率换回短时间的开发和维护(因为编译器好)是值得的。
12 楼
f2003 [专家分:7960] 发布于 2007-07-01 19:42:00
数值计算主要是大量数组操作、运算速度、并行能力、数值算法库支持。Fortran主要在这些领域。从Fortran2003开始,Fortran也在程序结构增强自身。
只有少数优秀的人才能认识到一个真理:这世界是不完美的。那些认为C太优秀、完美无缺、可以取代Fortran和全部其他语言的“C饭”真不少。
13 楼
林杰杰 [专家分:8970] 发布于 2007-07-02 08:53:00
@ lishhit:
谢谢你的文章,让人获益匪浅。不过倒是有几个不同的意见。
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在上面赚不了钱,所以只有某些比较偏重学术或者看重运算速度的公司才会在上面花力气。^_^
不知道我讲的对不对。
@f2003:
看样子你应该是fortran 2003的饭吧?^_^
谢谢大家的指教,对Fortran的能力总算有了点了解,谢谢大家。
14 楼
sarrow [专家分:35660] 发布于 2008-09-16 11:37:00
貌似两者的发明目的就不一样,编译器也垄断在不同企业的手里,讨论孰优孰劣没有必要。
fortran就是为了科学计算而生,而现代数学很多都需要运用到矩阵运算,fortran对这方面的操作的简易性有加强,也是理所当然的。
与C、C++在数据管理的不同之处,除了以列为优先外,还有Fortran默认是传地址的——这也是Fortran速度快的一个原因。
还有Fortran除了发明的早,基本都是在大型机上运行外,还貌似是最早支持并行计算的高级语言。
Fortran和C、C++语言面向的使用人群,运行环境,编写目的都不相同,交集很少,没有比较的必要。
讨论这些,还不如多看几本书。
===============================
另,fortran历史遗留的代码多,素不知可以程序可以混合编译么?弄好接口方式,Fortran和C可以相互调用,并且衔接得非常好。
15 楼
weixing1531 [专家分:2580] 发布于 2008-09-16 12:28:00
C++很贪婪,什么都想要,结果什么都做得不是很好
FORTRAN还是守住那一亩三分地吧
C/C++:指针(地址)无处不在,传址必须要用指针,数组和实符串功能很弱
FORTRAN:没有指针(引用)照样转,不需要太多的底层,源码容易理解和维护
16 楼
他寻欢欢 [专家分:90] 发布于 2010-05-09 17:11:00
[quote]看了上面的讨论,觉得这个讨论还是很值得的,也感谢林杰杰提出的这个话题。Fortran经常被说作数值计算好,但很少说究竟好在哪里,这确实是个让人不信服的地方。希望我的回答能让林杰杰满意。呵呵,这可是原创啊!!
我经常用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可能会稍微缓解一下这个问题),牺牲点效率换回短时间的开发和维护(因为编译器好)是值得的。[/quote]
第十一条可不敢苟同。
1+1=2是永不会落后的,当时的代码也是不会落后的,除非你定义的新的运算操作。
我来回复