首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现代学习FORTRAN

现代学习FORTRAN
EN

Stack Overflow用户
提问于 2008-08-28 04:36:25
回答 10查看 15.1K关注 0票数 80

我最近开始维护大量的科学计算密集型FORTRAN代码。尽管谷歌( google )有两本入门级的书,但我很难掌握一种有40年历史的语言的所有细微差别。该代码充斥着“性能增强改进”。是否有人对de-optimizing FORTRAN到CS 101级别有任何指南或实用建议?有人知道FORTRAN代码优化是如何运作的吗?在Java/C++/.NET开发人员接管FORTRAN 77/90代码基时,是否有任何典型的FORTRAN“陷阱”可能不会发生?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2008-09-15 22:29:44

在某种程度上,你必须对程序员在过去要做的事情有一种“感觉”。我所使用的绝大多数代码都比我老,并且运行在我父母上高中时的“新”机器上。

我所处理的常见FORTRAN--伤害可读性的语言是:

  • 公用块
  • 隐式变量
  • 两个或三个具有共享继续语句的DO循环
  • GOTO代替DO循环
  • 算术IF语句
  • 计算GOTO's
  • 某些公共块中的等价实数/整数/其他

解决这些问题的战略包括:

  1. 得到Spag / plusFORT,物有所值,它自动解决了很多问题,Bug (Tm)
  2. 如果可能的话,移动到Fortran 90,如果不移动到自由格式的Fortran 77。
  3. 向每个子程序添加隐式无一个,然后修复每个编译错误,耗时但最终是必要的,有些程序可以为您自动完成此操作(或者您也可以编写脚本)。
  4. 将所有常见的模块移动到模块中,低挂水果,值得
  5. 将算术IF语句转换为IF..ELSEIF..ELSE块
  6. 将计算的GOTOs转换为选择CASE块
  7. 将所有DO循环转换为更新的F90语法 我的循环:做ii = 1,n循环!做一些事情,结束我的循环
  8. 将等效的公共块成员转换为在模块中分配的可分配内存,或者转换为它们的真正字符例程(如果是Hollerith存储在实际中的话)。

如果你对如何完成一些可读性任务有更多的具体问题,我可以给出建议。我有一个由几十万行Fortran组成的代码库,这些代码是在40年的时间内编写的,在某种程度上是我负责的,所以我可能遇到了您可能发现的任何“问题”。

票数 88
EN

Stack Overflow用户

发布于 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编译器的杂项建议

  • 有一个编译器选项来强制隐式NONE行为,您可以使用它来识别问题例程,而不必首先使用隐式NONE声明来修改它们。这条建议直到第一次构建炸弹之后才显得有意义,因为在遗留的例程中插入了一个隐含的NONE命令。(什么?您的代码评审没有注意到这一点?;-)
  • 有一个用于数组边界检查的编译器选项,在调试Fortran 77代码时非常有用。
  • Fortran 90编译器应该能够编译几乎所有的Fortran 77代码,甚至更旧的Fortran代码。打开Fortran 90编译器上的reporting,通过它运行遗留代码,您将在语法检查方面有一个良好的开端。一些商业的Fortran 77编译器实际上是在Fortran 77模式下运行的Fortran 90编译器,因此对于您拥有的任何构建脚本来说,这可能是一个相对较小的选项。
票数 32
EN

Stack Overflow用户

发布于 2008-09-22 18:46:37

在最初的问题中,我要提醒你一些事情。你说代码充斥着“提高性能的改进”。由于Fortran问题通常具有科学和数学性质,所以不要假设这些性能技巧是为了改进编译。可能与语言无关。在Fortran中,解决方案很少是关于代码本身的效率,而是解决最终问题的底层数学的效率。这些技巧可能会使编译变得更慢,甚至可能使逻辑看起来很混乱,但目的是使解决方案更快。除非你知道它到底在做什么,也不知道为什么,不要管它。

即使是简单的重构,比如更改看起来很傻的变量名称,也可能是一个很大的缺陷。在给定的科学领域,历史上标准的数学方程将使用自麦克斯韦时代以来的特定速记。因此,要在电磁学中看到一个名为B(:)的数组,就可以告诉所有Emag工程师正在解决什么问题。改变它会让你危险的。道德上,在改名前也要知道科学的标准名称。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档