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

roy*_*yco 30 c++ fortran language-comparisons

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

任何指导?

T.E*_*.D. 48

我看了一下最新的Fortran标准中的一些内容,坦率地说,我印象深刻.我20年前对这种语言的厌恶现在已经消失了.没有更多的行号和特殊列(可能会在地狱中燃烧).

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

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

如果您的应用程序一般不属于科学,工程或数字运算,那么上述任何一项都不会对您造成太大影响,因此您可能最好还是寻找其他地方.

  • FWIW许多商用飞机系统代码(例如FMC,导航系统等)仍然依靠Fortran进行导航计算.不确定这只是遗产,还是因为数字处理是准确的,或者甚至因为工程师在FORTRAN上工作,但这些系统通常非常保守,并且具有多年的可靠性.编译器也很好理解,这是支持运行这些安全关键系统的另一个因素.并不意味着你今天会跳进Fortran,但是当你飞行时,Fortran正在帮助你保持安全! (6认同)
  • 使用C++中的Fortran库并不是什么大不了的事.而C++库甚至可能胜过Fortran,因为C++支持更好的内联(特别是基于模板的表达式库).因此,结果是使用一种有助于解决更高级问题的语言; 不确定C++或Fortran是否合格...... (5认同)
  • 由于`restrict`,在C中缺少别名参数并不是那么真实.但是+1. (2认同)

小智 23

另一个主要问题是学习曲线对于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)社区以及数字图书馆/ API开发商的支持,如PETSc,MPI等.

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

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

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

  • 截至2011年1月,英特尔Fortran编译器还支持coarray. (5认同)

For*_*ner 14

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

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

类型日期
整数::月,日,
年末类型日期

type(date):: x(1000)

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

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


Mar*_*ork 12

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

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

哪个更重要.

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

  • Fortran的大多数优势都来自编译器实现本身.C++在这里的障碍并不是内在的东西; 它是大多数用户并不很在乎紧环(矩阵)优化他们的编译器,编译器编写者没有近的激励进行这项工作是Fortran编译作家们. (3认同)

fed*_*asu 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,但还有很长的路要走)

简而言之,如果您的程序或应用程序纯粹是科学计算使用fortran 95及以上,如果计算一些数字只是故事的一部分使用C++(或任何你觉得更好)


小智 6

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

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

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

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

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


use*_*744 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进行小尺寸计算(如创建绘图,小尺寸数组计算......).