我正在考虑在科学计算应用中选择Fortran或C++。目前不清楚Fortran在性能方面是否仍然优于其他语言。例如,我认为由于Fortran强制执行严格的别名规则,在与C相比(在C99之前),编译器可以做出更好的优化。我不确定C ++ 在这里的作用。
有何指导意见吗?
我正在考虑在科学计算应用中选择Fortran或C++。目前不清楚Fortran在性能方面是否仍然优于其他语言。例如,我认为由于Fortran强制执行严格的别名规则,在与C相比(在C99之前),编译器可以做出更好的优化。我不确定C ++ 在这里的作用。
有何指导意见吗?
restrict
,C 中缺乏别名参数的情况不再像以前那么严重了。但还是加一分。 - Billy ONealmatmul( 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和协作数组),能够生成快速/并行化的代码。
对于数值计算,没有什么能够超过Fortran,但不幸的是,在其他方面,任何其他编程语言都能胜过它。因此,如果你是一位从事安稳工作、只进行数值/HPC计算的科学家,请坚持使用Fortran;否则,请学习和使用C++,因为它广泛用于非数值软件。
Fortran允许整个数组操作,也允许对数组部分进行操作。虽然C++有用于数组的类,但我认为你不可能像在Fortran中那样轻松地引用切片(例如x(:,2:,1:N3:2))。这样可以非常简洁地表达某些算法。
Fortran的数组操作的便利性可扩展到派生类型的数组。假设您有一个日期数组:
type date
integer :: month,day,year
end type date
type(date) :: x(1000)
那么,x指代日期数组,x%month指代月份数组,pack(x,x%month == 1)则指代所有1月份的日期。还有多少其他编程语言提供这种便利性呢?
一些关于Fortran的早期评论-“古老而令人作呕”-是有偏见的,应该据此折扣。让我来反驳。在我看来,Fortran 90的自由格式比C和C ++的语法更好看,由花括号和分号组成。在C和C ++中省略或错误地放置它们可能会导致错误,在Fortran中则没有对应的错误。
Fortran一直被高度优化用于数学运算,特别是矩阵类操作。
C ++已经高度优化用于对象使用。
对你来说哪个更重要。
如下所述,C++有一个经过优化的矩阵库。
但是,Fortran的整个目的是优化数学过程(特别是矩阵运算)。 这些优化内置于语言的基础中(而不是库),并且在研究方面比C ++领先约二十年。 我怀疑(但不确定)在这个领域,Fortran将会轻松获胜。
Fortran95及以上版本相比于C++(2003)的优势:
简而言之,如果你的程序或应用纯粹是科学计算,请使用Fortran 95及以上版本;如果计算几个数字只是其中的一部分,请使用C++(或其他你认为更好的语言)。
我是编程新手。我已经在有限元领域编程了大约一年。在网上做了一些研究后,我决定使用Fortran 2003。通过学习查普曼的书籍,我在十天左右的时间里学会了模块化编程风格。现在已经一年了,我已经用模块化格式(可维护、可重用和整洁的代码)写了约四千行代码,而且根本没有使用过任何字符变量。我认为,如果你只是学习C++、Matlab、Python、Java等语言,也只花费十天的时间,你不可能像使用Fortran那样高效地编写数值代码。Fortran 2003还具备所有必要的面向对象编程能力,这正是我正在学习的。
因此,在数值方面的语言优势方面,Fortan并不缺乏任何东西(模块化风格、面向对象风格、强大的数组功能、强大的库、最新的免费和商业编译器、学习非常容易、运行非常高效...)。像Python/NumPy这样的语言具有大多数这些功能,但缺乏效率。像C++这样的语言也具有Fortran的多数功能(尽管对于数组计算,这是数值计算的主要核心,你必须导入一些库!!),但也许由像我这样的人使用Fortran编写的程序比某个有十年以上经验的C++程序员编写的程序更高效。
最后,我使用Fortran(模块化或面向对象格式)进行繁重的数值计算,并使用Python/NumPy进行小规模计算(如创建图形、小型数组计算等)。
在我看来,唯一真正重要的优势是使用FORTRAN编程允许您更轻松地重复使用大量现有的FORTRAN代码和库。如果您手头有50个FORTRAN程序员参与项目且时间有限,您首先会教他们所有的C++,还是愿意让他们使用自己喜欢的语言?
由于像LAPACK++这样的科学计算包已经高度优化,现代Fortran甚至没有性能优势。C++可能有其缺点,但性能不是其中之一。
随着模板元编程(特别是表达式模板)的出现,C++ 在数值计算方面已经达到了 FORTRAN 的水平,因此速度不应该再是一个问题。然而,还有一些其他问题需要解决:
支持 FORTRAN:老一辈的人可能比 C++ 更熟悉它。
反对 FORTRAN:它是一种令人讨厌、古老且大多被抛弃的语言,已经在你开始项目的那一刻就已经过时了。现在学习编程的人很少会学习 FORTRAN,因此你可能会在以后的项目中遇到找不到程序员的问题。
支持 C++:它相对较新,编译器仍在不断改进。它允许你编写非常富有表现力的代码。
反对 C++:其中一些模板错误信息会让你哭泣。