我最近开始维护大量的科学计算密集型FORTRAN代码。尽管谷歌( google )有两本入门级的书,但我很难掌握一种有40年历史的语言的所有细微差别。该代码充斥着“性能增强改进”。是否有人对de-optimizing FORTRAN到CS 101级别有任何指南或实用建议?有人知道FORTRAN代码优化是如何运作的吗?在Java/C++/.NET开发人员接管FORTRAN 77/90代码基时,是否有任何典型的FORTRAN“陷阱”可能不会发生?
发布于 2008-09-15 22:29:44
在某种程度上,你必须对程序员在过去要做的事情有一种“感觉”。我所使用的绝大多数代码都比我老,并且运行在我父母上高中时的“新”机器上。
我所处理的常见FORTRAN--伤害可读性的语言是:
解决这些问题的战略包括:
如果你对如何完成一些可读性任务有更多的具体问题,我可以给出建议。我有一个由几十万行Fortran组成的代码库,这些代码是在40年的时间内编写的,在某种程度上是我负责的,所以我可能遇到了您可能发现的任何“问题”。
发布于 2008-10-03 19:43:15
遗留的Fortran Soapbox
我帮助维护/改进了一个遗留的Fortran代码库很长一段时间,并且在很大程度上认为sixlettervariables是有钱的。不过,这种建议往往是技术性的;更难对付的是实施“良好做法”。
这些听起来似乎是显而易见的事情,但我认为大多数Fortran代码商店都有根深蒂固的文化,有些甚至在“软件工程”一词出现之前就开始了,而且随着时间的推移,主导地位是“现在就做好”。(这并不是Fortran商店所独有的。)
拥抱戈恰斯
但是,如何处理已经存在的、陈旧的旧代码库呢?我同意Joel关于重写,别。然而,在我看来,sixlettervariables确实指出了允许的例外:使用软件工具来转换到更好的Fortran构造。代码分析器(查对)和代码重写器(plusFORT)可以捕获/纠正许多内容。如果你必须用手去做,确保你有一个紧迫的理由。(我希望我手边有一个关于修复软件错误所产生的软件错误数量的参考,这是令人谦卑的。我认为在专家C程序设计中有这样的统计数据。)
在福特兰的比赛中,最好的进攻就是拥有最好的防守:通晓语言。为了达到这个目的我建议..。书!
Fortran死树库
多年来,作为一名"QA唠叨者“,我只取得了一些小小的成功,但我发现,教育的确会在不经意间奏效,其中最有影响力的事情之一就是有人手头有一本参考书。我喜欢并强烈推荐
Fortran 90/95为科学家和工程师,斯蒂芬·查普曼(StephenJ.Chapman)著
这本书甚至对Fortran 77很好,因为它明确指出了不应该使用的构造,并给出了更好的替代方案。然而,它实际上是一本教科书,当你真的想知道Fortran 95的细节时,它可能会耗尽你的精力,这就是为什么我推荐它的原因。
Fortran 90/95解释,迈克尔·梅特卡夫和约翰·K·里德
作为你对Fortran 95的参考。请注意,这不是最清晰的写作,但面纱将揭开当你真的想从一个新的Fortran 95功能的最大限度。
因为专注于从Fortran 77到Fortran 90的问题,我很享受。
迁移到Fortran 90,吉姆·克里根著
但这本书现在已经绝版了。(我只是不明白O‘’Reilly对Safari的使用,为什么他们所有的绝版书籍都不能买到?)
最后,关于优秀经典软件工具的继承人,我提名
经典FORTRAN,迈克尔·库普菲希米德著
这本书不仅展示了“只有”Fortran 77可以做些什么,而且还谈到了一些更微妙的问题(例如,应该或不应该使用外部声明)。这本书不完全涵盖与“软件工具”相同的空间,但它们是我认为“有趣”的三本Fortran编程书中的两本.(这是第三个)。
适用于几乎所有Fortran编译器的杂项建议
发布于 2008-09-22 18:46:37
在最初的问题中,我要提醒你一些事情。你说代码充斥着“提高性能的改进”。由于Fortran问题通常具有科学和数学性质,所以不要假设这些性能技巧是为了改进编译。可能与语言无关。在Fortran中,解决方案很少是关于代码本身的效率,而是解决最终问题的底层数学的效率。这些技巧可能会使编译变得更慢,甚至可能使逻辑看起来很混乱,但目的是使解决方案更快。除非你知道它到底在做什么,也不知道为什么,不要管它。
即使是简单的重构,比如更改看起来很傻的变量名称,也可能是一个很大的缺陷。在给定的科学领域,历史上标准的数学方程将使用自麦克斯韦时代以来的特定速记。因此,要在电磁学中看到一个名为B(:)的数组,就可以告诉所有Emag工程师正在解决什么问题。改变它会让你危险的。道德上,在改名前也要知道科学的标准名称。
https://stackoverflow.com/questions/31672
复制相似问题