我正在尝试在 Fortran 和 C++ 之间为科学计算中的应用程序做出决定。我不清楚 Fortran 在性能方面是否仍然优于其他语言。例如,我相信由于 Fortran 强制执行严格的别名,与 C99 之前的 C 相比,编译器可以进行更好的优化。我不确定 C++ 如何适合这里。
有什么指导吗?
我正在尝试在 Fortran 和 C++ 之间为科学计算中的应用程序做出决定。我不清楚 Fortran 在性能方面是否仍然优于其他语言。例如,我相信由于 Fortran 强制执行严格的别名,与 C99 之前的 C 相比,编译器可以进行更好的优化。我不确定 C++ 如何适合这里。
有什么指导吗?
我查看了最新 Fortran 标准中的一些内容,坦率地说,我印象深刻。20 年前我讨厌这门语言的很多东西现在都消失了。没有更多的行号和特殊列(可能他们在地狱中燃烧)。
Fortran 已经在工程界大量使用了 50 年。如果你在这些圈子里工作,这会给你两个好处。首先,这些人非常关心优化。这意味着 Fortran 编译器往往拥有最好的优化器。由于缺少别名,该语言本身也比 Cish 语言更易于优化。
第二个优势是 Fortran 库对数字运算的支持简直无法超越。最好的代码几乎总是您不必编写的经过良好调试的代码。
如果您的应用程序通常不属于科学、工程或数字运算的范畴,那么上述任何一项对您来说都不是什么大不了的事,因此您最好去别处寻找。
另一个主要问题是学习曲线,这对于 C++ 来说非常巨大,而对于 Fortran(90 及更高版本)来说则非常小。Fortran 就像 MATLAB,具有...
matmul( matmul(transpose(B), D), B )
norm2(x)
call gesvd(A,S,u,vt)
Fortran 还有指针、动态内存、用户定义的数据类型等。
它得到了主要供应商(Intel/Sun/IBM/Cray/PGI/NAG 等)、开源 (gfortan/g95) 社区和数值库/API(如 PETSc、MPI 等)开发人员的良好支持。
哎呀,新标准(Fortran 2008)甚至具有无需 MPI/OpenMP 就可以进行并行编程的协数组,并且一些 Fortran 编译器已经支持它(g95 和 Cray)。
基本上,它具有数值计算所需的所有优良品质,比 MATLAB 更容易,是标准化的、免费的、可扩展的(使用 MPI/OpenMP 和 co-arrays),可以生成极快/并行的代码。
对于数字,没有什么能胜过 Fortran,但不幸的是,对于其他任何事情,一切都胜过 Fortan。因此,如果您是一名从事安全工作并且只进行数值/HPC 计算的科学家,那么请坚持使用 Fortran,否则学习和使用 C++,因为它广泛用于非数值软件。
Fortran 允许整个数组操作以及对数组部分的操作。有用于数组的 C++ 类,但我认为您不能像在 Fortran 中那样容易地引用诸如 x(:,2:,1:N3:2) 之类的切片。这让我们可以非常简洁地表达一些算法。
Fortran 数组操作的便利性扩展到派生类型的数组。假设您有一个日期数组:
类型日期
整数 :: 月、日、年
结束类型日期
类型(日期) :: x(1000)
那么 x 指的是日期数组,x%month 指的是月份数组,pack(x,x%month==1) 指的是一月份的所有日期。有多少其他编程语言可以提供这种便利?
一些早期关于 Fortran 的评论——“陈旧而令人作呕”——是有偏见的,应该相应地打折扣。让我反驳一下。在我看来,Fortran 90 的自由格式看起来比带有花括号和分号的 C 和 C++ 的语法更好。将它们排除在外或错误地放入它们可能会导致 C 和 C++ 中的错误,而这些错误在 Fortran 中没有对应物。
Fortran 已针对数学(尤其是矩阵)类操作进行了高度优化。
C++ 已针对对象使用进行了高度优化。
哪个对你更重要。
如下所述,C++ 有一个优化的矩阵库。
但是 Fortran 的全部目的是优化数学过程(尤其是矩阵运算)。事实上,这些优化是语言的基础(而不是库),并且在 C++ 的研究方面领先了大约 20 年,我怀疑(但不知道事实)在这个领域 Fortran 正在走向赢得胜利。
fortran95及以上相对于c++(2003)的优势:
简而言之,如果您的程序或应用程序是纯粹的科学计算,请使用 fortran 95 及更高版本,如果计算一些数字只是故事的一部分,请使用 C++(或您觉得更好的任何东西)
我是编程新手。我在有限元领域已经编程了大约一年。在网上研究了一番后,我决定使用fortran 2003。通过学习查普曼的书,我在大约十天的时间里学会了模块化风格的编程。一年过去了,我已经以模块化格式(可维护、可重用和整洁的代码)编写了大约四千行代码,并且根本没有使用任何字符变量。我不认为通过学习 C++、matlab、python、java ... 十天,您将能够编写像 fortran 一样高效的数字代码。fortran 2003 还具有我现在正在学习的所有必要的 OOP 功能。因此,就数字方面的语言强度而言,fortan 并不缺乏任何东西(模块化风格,OOP 风格,强大的数组功能,强大的库,免费和商业最新的编译器,非常容易学习,非常高效......)。像 python/numpy 这样的语言具有大部分这些功能,但缺乏效率。像 C++ 这样的语言也具有 fortran 的大部分功能(尽管对于作为数值计算的主要核心的数组计算,您必须导入一些库!!),但也许像我这样的人用 fortran 编写的程序会比由一些具有 10 年以上经验的 c++ 程序员编写的。
最后,我以 fortran(模块化或 OOP 格式)进行繁重的数值计算,并使用 python\numpy 进行小尺寸计算(如创建绘图、小尺寸数组计算......)。
我对 Fortran 的体验是它易于学习、干净(高度模块化),因此非常适合主要关注进行高度优化的数值计算的非程序员。尽管可以在 c++ 中执行相同的优化(甚至可能在更大程度上),但要实现这些优化级别需要大量的内在理解。在矩阵计算方面,开箱即用的 Fortran 编译器通常会胜过 c++ 编译器。我还要补充一点,Fortran 具有专门设计用于帮助程序员从数值例程中挤出更多性能的关键字。C++ 也有这个,但没有达到 Fortran 的程度。
另一个优点是 Fortran 不是特定于操作系统或体系结构的。换句话说,您在一个操作系统或架构上编写的 Fortran 代码应该很容易移植到另一个有 Fortran 编译器的地方。
另一个优点是现代 Fortran 通常向后兼容旧的 Fortran 代码库。多年来在 Fortran 中构建的代码库非常庞大且极其复杂(主要由科学家和数学家完成)。
此外,就个人而言,我真的很喜欢内置的文件处理功能,它允许人们几乎立即读取数据文件并对其执行操作。Fortran 中的许多其他内置函数旨在提供这种便利。C++ 主要提供构建块来执行此操作,这需要花费一些精力来读取数据文件 b/c 您需要了解有关分隔符的一些信息(Fortran 允许您指定分隔符)。
除此之外,我想不出优点。大多数其他事情都是字符串操作,或基于算法的操作,c++ 作为一种语言,通常是它的编译器,更适合并且通常会执行得更好。一个知识渊博的程序员可能会更喜欢 c++,因为她/他会了解如何以一种可能比 Fortran 编译例程执行得更好的方式优化数值例程。此外,良好可靠的 Fortran 编译器不像良好可靠的 C++ 编译器那样容易获得。
恕我直言,真正重要的唯一优势是编程 FORTRAN 允许您更轻松地重用许多现有的 FORTRAN 代码和库。如果你手头有 50 名 FORTRAN 程序员在做一个项目,而且时间有限,你是先教他们所有 C++,还是接受让他们使用他们最喜欢的语言?
鉴于已经高度优化的 LAPACK++ 等科学计算包的存在,现代 Fortran 甚至没有性能优势。C++ 可能有它的缺点,但性能不是其中之一。
随着模板元编程(尤其是表达式模板)的出现,C++ 在数值计算方面达到了 FORTRAN 的水平,因此速度不再是问题。但是,对于其他问题,仍有一些话要说:
Pro FORTRAN:老年人可能比 C++ 更了解它。
Contra FORTRAN:这是一种令人作呕的、陈旧的、几乎被废弃的语言,在你开始项目的那一刻就已经过时了。现在学习编程的人都不太可能学习 FORTRAN,因此您以后可能会遇到为项目寻找程序员的问题。
Pro C++:它相对现代,编译器仍在大幅改进。它允许您编写富有表现力的代码。
魂斗罗 C++:其中一些模板错误消息会让你哭泣。