Blk*_*ght 63 oop fortran scientific-computing assertions fortran90
在一些科学环境中,你经常离不开FORTRAN,因为大多数开发人员只知道这个习语,并且有很多遗留代码和相关经验.坦率地说,高性能编程没有很多其他跨平台选项(C++可以完成任务,但语法,零启动数组和指针与某些人不兼容).
所以,让我们假设一个新项目,必须使用Fortran 90的,但我想建立最先进的软件架构出来的,同时与最新的编译器兼容(英特尔ifort,而且还包括Sun/HP/IBM编译)
所以我想要强加一些众所周知的常识,但在我的环境中还不是标准:
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已经打算做或已被告知:
而且,最后,我认为Fortran程序和程序员比面向对象编程的想法更能从函数式编程的思想中获得信息.
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中提到的Fortran特定预处理器之一)的开发人员,并撰写了许多有关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 - 如果有必要,编写编码标准/指南.
我很匆忙,所以如果我以检查点的形式而不是合理的句子来回答这个问题,请原谅我。
对你的文字的一些评论:
(这似乎都是“明显的”现代编程假设,但在遗留的 Fortran 世界中,其中大部分都是典型程序员工作流程中的重大变化)
即使在现代的 fortran 世界中,其中一些假设也是有问题的......记住,fortran 程序员不是程序员(我以精简形式重复这一点;我已经在这个论坛上写过很多次了)而是工程师、科学家等等。对他们(我们?)来说,代码不是目标,而只是一种工具……对专业程序员来说,代码就是一切;他们没有什么“超越”......因此,他们非常珍惜它。对我们工程师来说,这只是获得我们想要的结果的一种手段......记住这一点,尽管好的编程实践会付出代价,但没有必要在没有明显需要的情况下坚持他们。
所有这些的目标是拥有值得信赖、可维护和模块化的代码。然而,在典型的 fortran 中,模块化通常不是主要目标,只有在原始开发人员非常聪明并且此后代码未更改的情况下,代码才值得信赖!(我在这里有点开玩笑,但不多)
有人曾经说过,你不会相信它是多么真实:
“没有什么比临时修复更持久的了”。
关于该主题的任何好的 URL、建议、参考文件/书籍?
上面给出了几个。
另外,在写这个答案时,我看到了高性能。马克发布了一个非常好的答案,我基本同意……它更详细地介绍了标准遵守情况。
另外,我的建议是肯定也在 comp.lang.fortran 上发布这个问题......我认为你可以在那里获得更多高质量的答案,然后在这里(我相信不会有超过 20 个左右的 Fortran 程序员在整个stackoverflow)。
一些欧盟委员会免费发布了一套代码编写指南;作为此答案的一部分,它们将非常有用,但不幸的是,我无法在我的快速谷歌搜索中找到它们,也没有时间进行广泛的研究。试着搜索这个话题……也许你会好运。
小智 6
在过去的几年里,我和一位同事在现代Fortran中从头开发了一个相当大的计算库,其中提到了许多功能 - 面向对象,模块化/可重用,一致的代码风格等等(我们还没有做得很好)然而,单元测试的工作 - 需要继续下去,然后将所有这些包装起来以提供与C++,Python等的接口.这里的其他人指出了我推荐的所有书籍和链接(以及更多),所以我不再重复.我发布的原因只是说可以用Fortran做这些事情并创造出很棒的东西,所以坚持下去.
我还要指出,在所有主要编译器中实现了如此多的Fortran 2003标准之后,您是多么幸运.您会发现很多这些功能(例如程序指针)非常有用.