编写健壮的"现代"Fortran代码

Blk*_*ght 63 oop fortran scientific-computing assertions fortran90

在一些科学环境中,你经常离不开FORTRAN,因为大多数开发人员只知道这个习语,并且有很多遗留代码和相关经验.坦率地说,高性能编程没有很多其他跨平台选项(C++可以完成任务,但语法,零启动数组和指针与某些人不兼容).

所以,让我们假设一个新项目,必须使用Fortran 90的,但我想建立最先进的软件架构出来的,同时与最新的编译器兼容(英特尔ifort,而且还包括Sun/HP/IBM编译)

所以我想要强加一些众所周知的常识,但在我的环境中还不是标准:

  • 全局变量禁止,没有getos,没有跳转标签implicit none
  • "面向对象编程"(具有数据类型和相关子例程的模块)
  • 模块化/可重用的功能,文档齐全,可重用的库
  • 断言/前提条件/不变量(使用预处理程序语句实现)
  • 所有(大多数)子程序和"对象"的单元测试
  • 一个强烈的"调试模式"(#ifdef DEBUG),带有更多检查和所有可能的英特尔编译器检查(数组边界,子程序接口等)
  • 统一和强制清晰的编码风格,使用代码处理工具助手.

所有这一切的目标是拥有值得信赖,可维护和模块化的代码.然而,在许多遗留代码中,可重用性不是一个重要的目标.

我四处搜寻有关面向对象的Fortran编程契约式引用(断言/前提条件的/ etc.),发现只有丑陋的和过时的文件,通过人与没有大规模参与项目进行语法和文章,和死了的项目.

有关此主题的任何好的URL,建议,参考文件/书籍?

Hig*_*ark 45

我建议OP放弃Fortran在高性能科学计算中忍受的令人讨厌的态度,并热情地投入其中.如果OP保留了那种相当不屑一顾的心态,那么他/她的整个Fortran编码生涯将是一场斗争.实际上,使用C++你无法用C++做什么,所以为什么你真的不想这么做呢?

OP的子弹列表中没有任何东西,我们很多在过去30年里一直在使用Fortran的人都没有这样做(因为Fortran 90编译器的普及,但之前也有一些).是的,有计算科学家和理解指针的科学软件工程师知道很多(被误导的)人开始计数为0,而全局变量是不好的.

就像@MSB一样,我推荐Metcalf 等人的书作为现代Fortran功能和特性的信息来源.而且,就像@MSB一样,我对使用C或C++来封装库的想法表示赞赏,这些库完全是Fortran等价物或更好的方法.2003标准与C功能的互操作性(在英特尔Fortran中实现)使得直接调用C库变得前所未有的简单.

我对OP提出质疑,认为拥有模块化代码本身就是一个目标.我建议,这些目标是正确的,可验证的,可验证的,健壮的,可靠的代码.模块化是支持实现这些目标的一种方式,但这是一种策略,而不是终点.如果我认为我们可以编写好(在上述意义上)包含10 ^ 6行代码而没有模块化的程序,我就不会费心去模块化了.

好的,现在一些具体的提示添加到OP已经打算做或已被告知:

  • 在变量声明上使用KIND来强制执行所需的精度; 不要将此留给编译器选项或关于此编译器可能在该处理器上执行的操作的猜测;
  • 尽可能使用数组操作而不是显式循环; 这有助于使代码更安全 - 有时以牺牲性能为代价,但您需要根据具体情况进行检查;
  • 写PURE函数;
  • 不依赖于预处理器或其他非Fortran方法来编码正确性(等),在Fortran中编写断言和前置条件(等); 只要编写得好的Fortran程序,预处理器(等)就无法生存,并且将成为现在和将来可移植性的主要障碍;
  • 如果您有权访问英特尔Fortran,可以访问英特尔MKL(和IPP)并使用这些库而不是编写自己的代码;
  • 计划解决OpenMP和MPI的并行化问题,它们都非常适合Fortran; 哦,并计划尽快并行,它比串行编程更有趣;
  • 这套Fortran编码标准是一个良好的开端,但可能不过是这样; Code Complete的第1版比当前版本有更多关于Fortran(77)编程的内容,但它的大部分建议都可以应用于您编写的任何语言.

而且,最后,我认为Fortran程序和程序员比面向对象编程的想法更能从函数式编程的思想中获得信息.

  • 有人有这些 Fortran 编码标准的更新链接吗? (3认同)

Wil*_*cat 39

我的5美分.

Fortran语言维基是一个很好的起点.它有关于使用现代Fortran进行编程的不同方面的文章.单元测试,调试,通用编程等.还提供了有关Fortran 2003标准的编译器支持的非常有趣的表格.(正如Blklight已经提到过编译器中没有一些2003功能.它是比较不同编译器的好地方.)

我是一个C++人,但我坚持一些F90项目.

我建议阅读本课程:现代Fortran简介.MSB提到了着名的"Fortran 95/2003 Explained",但这本书足够大并且充满了细节.相反,上述课程是一个很好的起点.另请参阅利物浦大学的交互式Fortran 90编程课程.

Fortran 90程序中的错误可能会让您感到惊讶.这个页面标题说明了一切.=)

嗯......我的书签中也有一些链接到PSTI研究讲座系列"科学计算与FORTRAN 95".试试看.

JF Sebastian提到了F2Py并给出了教授Python的建议.我赞同他的意见.Python不是我最喜欢的语言.但它足以教导它.对于已经提到过的预处理器(其中许多用Python编写)和F2Py不会放弃SCons - 现代软件构建工具.

PS上周我在lulu.com买了一本电子书.Drew McCormack 在Fortran科学软件开发.我希望这是好读,但突然间没有时间.作者是Forpedo(Fortran Wiki中提到的F​​ortran特定预处理器之一)的开发人员,并撰写了许多有关Objective-C和Python编程的书籍和教程.


M. *_* B. 13

Fortran 90/95/2003的设计使得人们可以通过添加模块,私有/公共,用户定义类型等来编写模块化代码.Fortran 2003引入了更多面向对象的功能.当Fortran 90"分配"以更安全的方式直接动态分配Fortran数组时,连接到C以添加malloc是没有意义的.将过程(函数和子例程)放在模块中然后"使用"模块将导致检查接口.可以使用编译器的许多调试/检查选项,例如下标边界检查.

这是一本很好的书,可以了解这些和其他特性:Metcalf,Reid和Cohen撰写的"Fortran 95/2003解释".学习现代Fortran的最佳功能绝对是一个好主意,而不是继续编写FORTRAN 77 - 如果有必要,编写编码标准/指南.

  • @MSB 现在有 Metcalf 的“现代 Fortran 解释:合并 Fortran 2018”,刚刚于 2018 年出版。 (2认同)

Roo*_*ook 6

我很匆忙,所以如果我以检查点的形式而不是合理的句子来回答这个问题,请原谅我。

  • 尝试遵守标准(Fortran 是一种标准化语言,通过遵守标准语言功能并避免特定于供应商的扩展,您将拥有平台之间的可移植程序,您可以确保编译器不会出现问题)。我不知道我在哪里下载了我的副本,但我很确定你可以下载最新的草稿(当心;fortran 2008 或 2003 的许多功能仍然没有在当前编译器中实现,尽管很多功能几乎都在那里现在...... Cray 是其中之一)来自J3 的页面
  • 对于有关上述所有问题,我衷心推荐comp.lang.fortran usenet 组 - 不仅那里有一些知识渊博的人(例如。Richard Maine 先生......可能愿意回答您的任何标准合规性问题可能会问很多细节,如果问得很好......很多其他人也是如此)但它也有解决过大规模问题的人,并且肯定知道并愿意就您的主题提供建议
  • 书籍 - 除了所有已经提到的(梅特卡夫、里德和科恩的书也有我的推荐,还有缅因州和其他人的“Fortran 2003 手册”......),试着给自己找一本斯蒂芬·查普曼的“Fortran 95” /2003 科学家和工程师” ...在某些主题上的立场有点过于自信,但总体而言仍然是一本非常好的书,其中提到了许多“良好的编程实践”)
  • 另外,不知道您是否遇到过“通过 Fortran 90/95 进行面向对象编程”

对你的文字的一些评论:

(这似乎都是“明显的”现代编程假设,但在遗留的 Fortran 世界中,其中大部分都是典型程序员工作流程中的重大变化)

即使在现代的 fortran 世界中,其中一些假设也是有问题的......记住,fortran 程序员不是程序员(我以精简形式重复这一点;我已经在这个论坛上写过很多次了)而是工程师、科学家等等。对他们(我们?)来说,代码不是目标,而只是一种工具……对专业程序员来说,代码就是一切;他们没有什么“超越”......因此,他们非常珍惜它。对我们工程师来说,这只是获得我们想要的结果的一种手段......记住这一点,尽管好的编程实践会付出代价,但没有必要在没有明显需要的情况下坚持他们。

所有这些的目标是拥有值得信赖、可维护和模块化的代码。然而,在典型的 fortran 中,模块化通常不是主要目标,只有在原始开发人员非常聪明并且此后代码未更改的情况下,代码才值得信赖!(我在这里有点开玩笑,但不多)

有人曾经说过,你不会相信它是多么真实:
“没有什么比临时修复更持久的了”。

关于该主题的任何好的 URL、建议、参考文件/书籍?

上面给出了几个。

另外,在写这个答案时,我看到了高性能。马克发布了一个非常好的答案,我基本同意……它更详细地介绍了标准遵守情况。

另外,我的建议是肯定也在 comp.lang.fortran 上发布这个问题......我认为你可以在那里获得更多高质量的答案,然后在这里(我相信不会有超过 20 个左右的 Fortran 程序员在整个stackoverflow)。

一些欧盟委员会免费发布了一套代码编写指南;作为此答案的一部分,它们将非常有用,但不幸的是,我无法在我的快速谷歌搜索中找到它们,也没有时间进行广泛的研究。试着搜索这个话题……也许你会好运。


小智 6

在过去的几年里,我和一位同事在现代Fortran中从头开发了一个相当大的计算库,其中提到了许多功能 - 面向对象,模块化/可重用,一致的代码风格等等(我们还没有做得很好)然而,单元测试的工作 - 需要继续下去,然后将所有这些包装起来以提供与C++,Python等的接口.这里的其他人指出了我推荐的所有书籍和链接(以及更多),所以我不再重复.我发布的原因只是说可以用Fortran做这些事情并创造出很棒的东西,所以坚持下去.

我还要指出,在所有主要编译器中实现了如此多的Fortran 2003标准之后,您是多么幸运.您会发现很多这些功能(例如程序指针)非常有用.

  • 只是想说,如果没有C++或Python粉丝开始火焰大战,那么阅读关于Fortran功能的完整讨论真的很棒.如果没有它们,很难在Fortran上找到好的信息. (4认同)