现代Fortran比现代C ++有什么优势?

时间:2011-01-27 21:10:27

标签: c++ fortran language-comparisons

我正在尝试在Fortran和C ++之间决定科学计算中的应用程序。我不清楚Fortran在性能方面是否仍然优于其他语言。例如,我相信由于Fortran强制执行严格别名,因此与C99之前的C相比,编译器可以进行更好的优化。我不确定C ++如何适应这里。

任何指导?

10 个答案:

答案 0 :(得分:46)

我看了some of the stuff in the latest Fortran standards,坦率地说,我印象深刻。我20年前对这种语言的厌恶现在已经消失了。没有更多的行号和特殊列(可能会在地狱中燃烧)。

Fortran已经在工程界大量使用了50年。如果您在这些圈子中工作,这将为您带来两个好处。首先,这些人非常关心优化 。这意味着Fortran编译器往往拥有最好的优化器。由于缺少别名,语言本身比Cish语言更加优化。

第二个优势是Fortran的数字运算库支持简直无法击败。最好的代码几乎总是经过良好调试的代码,您不必编写

如果您的申请一般不属于科学,工程或数字运算,那么上述任何一项对您来说都不是什么大问题,所以您可能最好去其他地方寻找。

答案 1 :(得分:21)

另一个主要问题是学习曲线对于C ++而言非常巨大,而对于Fortran(90及更高版本)则非常小。 Fortran就像MATLAB一样,操作类似......

  • B'DB是matmul( matmul(transpose(B), D), B )
  • 向量的L2范数是norm2(x)
  • 使用LAPACK的矩阵的SVD是call gesvd(A,S,u,vt)

Fortran还有指针,动态内存,用户定义数据类型等。

主要供应商(Intel / Sun / IBM / Cray / PGI / NAG等),开源(gfortan / g95)社区以及PETSc,MPI等数值库/ API的开发人员都对此提供了很好的支持。

Heck新标准(Fortran 2008)甚至还有用于进行并行编程的共同阵列,而不需要MPI / OpenMP,而且一些Fortran编译器已经支持它(g95和Cray)。

基本上它具有数值计算所需的所有优良品质,比MATLAB更容易,标准化,免费,可扩展(使用MPI / OpenMP和共阵),产生超快速/并行代码。

对于数字而言,没有什么能比Fortran更胜一筹,但不幸的是,除了Fortan之外,其他任何东西都胜过Fortan。因此,如果您是一名安全工作且只进行数值/ HPC计算的科学家,那么请坚持使用Fortran,否则学习和使用C ++,因为它广泛用于非数值软件。

答案 2 :(得分:13)

Fortran允许整个数组操作以及对数组部分的操作。有数组的C ++类,但我不认为你可以像在Fortran中那样容易地引用像x(:,2:,1:N3:2)这样的切片。这让我们可以非常简洁地表达一些算法。

Fortran的数组操作的便利性扩展到派生类型的数组。假设你有一个日期数组:

输入日期
整数::月,日,年
结束日期

type(date):: x(1000)

然后x表示日期数组,x%月表示月数组,而pack(x,x%month == 1)表示1月份的所有日期。有多少其他编程语言提供这种便利?

早些时候关于Fortran的一些评论 - “古老而恶心” - 是有偏见的,应该相应打折。让我争论相反。在我看来,Fortran 90的自由格式看起来比C和C ++的语法更好,带有花括号和分号。将它们丢弃或错误地放入它们会导致C和C ++中出现错误,而Fortran中没有对应的错误。

答案 3 :(得分:11)

Fortran已针对数学(尤其是矩阵)操作进行了高度优化。

C ++已针对对象使用进行了高度优化。

对您来说更重要。

如下所述,C ++有一个优化的矩阵库 但Fortran的全部目的是优化数学过程(尤其是矩阵运算)。事实上,这些优化是建立在语言的基础之上(而不是一个库)并且在C ++研究方面有大约二十年的开端我怀疑(但不知道一个事实)在这个领域Fortran正在进行赢得胜利。

答案 4 :(得分:8)

fortran95及以上版本优于c ++(2003):

  1. 正如之前(用户4562)提到的短学习曲线(我的第一语言是C,我仍然无法掌握它,类似于C ++)
  2. (我的个人观点)容易从Octave代码转换(就此而言Matlab)类似的语法,相同的模块性[我使用Octave来编写程序原型并在fortran95中重写速度],尽管你可以在C ++中直接使用八度代码
  3. 动态内存分配非常简单。(f77完全没有这个!)
  4. 库支持(你也可以在c ++中这样做,但它很自然地使用fortran)
  5. 并行计算的共同阵列支持(可惜只有cray支持他们从2011年2月开始gfortran工作已经开始了gfortran4.6但还有很长的路要走)
  6. 简而言之,如果您的程序或应用程序纯粹是科学计算使用fortran 95及以上,如果计算一些数字只是故事的一部分使用C ++(或任何你觉得更好)

答案 5 :(得分:6)

我对Fortran的经验是它易于学习,清理(高度模块化),因此非常适合非主程关注的高度优化数值计算的非程序员。尽管可以在c ++中执行相同的优化(甚至可能在更大程度上),但是实现这些优化级别需要很多内在的理解。在矩阵计算方面,Fortran编译器开箱即用,通常会胜过c ++编译器。我还要补充一点,Fortran的关键字专门用于帮助程序员从数值例程中挤出更多性能。 C ++也有这个,但没有达到Fortran的程度。

另一个优点是Fortran不是特定于操作系统或体系结构的。换句话说,您在一个操作系统或体系结构上编写的Fortran代码应该很容易移植到另一个有Fortran编译器的代码。

另一个优点是现代Fortran通常向后兼容Fortran的旧代码库。多年来在Fortran中构建的代码库非常庞大且非常复杂(主要由科学家和数学家完成)。

另外,就个人而言,我非常喜欢内置的文件处理功能,这些功能允许人们几乎立即读取数据文件并对其执行操作。 Fortran中的许多其他内置函数旨在提供这种便利。 C ++主要提供构建块来执行此操作,这需要稍微冒汗,只需读取数据文件b / c,您需要了解有关分隔符的内容(Fortran允许您指定分隔符)。

除此之外,我无法想到优势。大多数事情都是字符串操作,或者基于算法的操作,c ++作为一种语言,而且通常它的编译器更适合,并且通常会表现得更好。一个知识渊博的程序员可能更喜欢c ++,因为他/他将理解如何以可能比Fortran编译的例程执行的方式优化数值例程。另外,良好可靠的Fortran编译器并不像可靠的C ++编译器那么容易。

答案 6 :(得分:5)

我是编程新手。我已经在有限元领域进行了大约一年的编程。经过对网络的一些研究后,我决定使用fortran 2003.通过研究Chapman书,我学习了大约十天的模块化风格。这是一年了,我已经用模块化格式(可维护,可重复使用和整洁的代码)编写了大约四千个代码行,并且根本没有使用任何字符变量。我不认为通过研究C ++,matlab,python,java ......十天你就能编写与fortran一样高效的数字代码。 Fortran 2003还拥有我现在正在学习的所有必要的OOP功能。    因此,就数值方面的语言强度而言,fortan并不缺乏任何东西(模块化风格,OOP风格,强大的阵列功能,强大的库,免费和商业最新的编译器,非常容易学习,非常高效......)。像python / numpy这样的语言具有大部分功能但缺乏效率。像C ++这样的语言也具有fortran的大部分功能(虽然对于数组计算来说,你必须导入一些库,但是数组计算的主要核心!!),但也许像我这样的人在fortran编写的程序会比一个由具有10年以上经验的c ++程序员编写的    最后,我用fortran(模块化或OOP格式)进行繁重的数值计算,并使用python \ numpy进行小尺寸计算(如创建绘图,小尺寸数组计算......)。

答案 7 :(得分:3)

鉴于已经高度优化的LAPACK ++等科学计算软件包的存在,现代Fortran甚至没有性能优势。 C ++可能有它的缺点,但性能不是其中之一。

答案 8 :(得分:3)

恕我直言,真正重要的唯一优势是编程FORTRAN可以让您更轻松地重用许多现有的FORTRAN代码和库。如果你手头有50名FORTRAN程序员参与一个项目和有限的时间框架,你是先去教他们所有的C ++,还是接受让他们使用他们喜欢的语言?

答案 9 :(得分:-1)

随着模板元编程(特别是expression templates)的出现,C ++在数值计算中达到了FORTRAN的联盟,所以 速度不再是问题 了。但是,关于其他问题还有一些事情需要说明:

Pro FORTRAN :老年人可能比C ++更了解它 Contra FORTRAN :这是一种令人作呕的,陈旧的,大部分被遗弃的语言,在你开始你的项目时已经 过时了 。现在学习编程的人非常不太可能学习FORTRAN,因此您可能会在以后遇到 查找程序员 的问题。

Pro C ++ :它相对现代,编译器仍在大幅提升。它允许您编写 非常富有表现力的代码 Contra C ++ :其中一些 模板错误消息 会让你哭泣。