当前位置:  开发笔记 > 编程语言 > 正文

在现代时代学习FORTRAN

如何解决《在现代时代学习FORTRAN》经验,为你挑选了7个好方法。

我最近开始维护大量科学计算密集型FORTRAN代码.尽管有谷歌和两本入门级书籍,但我很难掌握四十年前语言的所有细微差别.代码充斥着"提升性能".有没有人有任何关于将FORTRAN 优化到CS 101级别的指南或实用建议?有谁知道FORTRAN代码优化是如何运作的?是否有任何典型的FORTRAN'陷阱'可能不会发生在Java/C++/.NET引发的开发人员接管FORTRAN 77/90代码库?



1> user7116..:

你必须对当天程序员必须做的事情有一种"感觉".我工作的绝大部分代码都比我年长,并且当我的父母在高中时,他们使用的机器是"新的".

我处理的常见FORTRAN主义,可读性受损:

常见的块

隐含变量

两个或三个带有共享CONTINUE语句的DO循环

GOTO取代了DO循环

算术IF语句

计算GOTO

某些公共块中的等效REAL/INTEGER/other

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

    得到Spag/plusFORT,物有所值,它自动解决了很多问题并且没有Bug(tm)

    如果可能的话,移动到Fortran 90,如果没有移动到自由格式的Fortran 77

    向每个子例程添加IMPLICIT NONE然后修复每个编译错误,耗时但最终必要,一些程序可以自动为您执行此操作(或者您可以编写脚本)

    将所有COMMON块移动到MODULEs,低悬的果实,值得

    将算术IF语句转换为IF..ELSEIF..ELSE块

    将计算GOTO转换为SELECT CASE块

    将所有DO循环转换为较新的F90语法

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    

    将等价的公共块成员转换为模块中分配的ALLOCATABLE内存,或者将Hollerith存储在REAL中的真实字符例程转换为真正的字符例程

如果您对如何完成一些可读性任务有更具体的问题,我可以给出建议.我有一个几十万行Fortran的代码库,这个代码库是在40年的时间里写的,我在某种程度上负责,所以我可能遇到过你可能遇到的任何"问题".


另外,关于fortran重构的一个很好的文本.http://www.fortranrefactoring.com.ar/papers/Fortran-Refactoring-for-Legacy-Systems.pdf

2> jaredor..:

Legacy Fortran Soapbox

我帮助维护/改进了传统的Fortran代码库已经有一段时间了,并且大多数情况下认为六个变量可靠的.但是,这个建议往往是技术性的; 锄头越来越强硬,正在实施"良好做法".

建立必要的编码风格和编码指南.

对于提交给代码库的任何内容,需要代码审查(不仅仅是编码器!).(版本控制应与此过程相关联.)

开始构建和运行单元测试; 同上基准或回归测试.

这些可能听起来似乎是显而易见的事情,但冒着过度概括的风险,我声称大多数Fortran代码商店都有一种根深蒂固的文化,一些在"软件工程"这个术语出现之前就开始了,而且随着时间的推移,它会占据主导地位.是"现在就完成它".(这不是Fortran商店所特有的.)

拥抱陷阱

但是如何处理现有的,古怪的旧遗留代码库?我同意Joel Spolsky的重写,不同意.但是,在我看来,六个变量确实指出了允许的例外:使用软件工具转换到更好的Fortran结构.代码分析器(FORCHECK)和代码重写器(plusFORT)可以捕获/纠正很多东西.如果你必须手工完成,请确保你有一个紧迫的理由.(我希望我手边有一些软件错误来自修复软件错误的数量,这是令人羞愧的.我认为一些这样的统计数据是在专家C编程中.)

赢得Fortran陷阱游戏的最佳进攻可能是拥有最好的防守:很好地了解语言.为了进一步,我建议......书!

Fortran死树图书馆

多年来,我作为"QA唠叨"获得了微不足道的成功,但我发现教育确实有效,有时无意中,而且最有影响力的事情之一是有人手边的参考书.我喜欢并强烈推荐

科学家和工程师的Fortran 90/95,由Stephen J. Chapman撰写

这本书对Fortran 77来说甚至是好的,因为它专门识别了不应该使用的结构并提供了更好的替代方案.然而,当你真的想知道Fortran 95的细节时,它实际上是一本教科书并且可能会失去动力,这就是我推荐的原因

Fortran 90/95由Michael Metcalf和John K. Reid解释

作为Fortran 95的首选参考资料.请注意,这不是最清晰的写作,但当您真正想要充分利用新的Fortran 95功能时,面纱将会提升.

为了关注从Fortran 77到Fortran 90的问题,我很享受

由Jim Kerrigan迁移到Fortran 90

但这本书已经绝版了.(我只是不明白O'Reilly对Safari的使用,为什么他们的绝版书不是每一本都可用?)

最后,关于精彩,精彩的经典软件工具的继承人,我提名

经典的FORTRAN,Michael Kupferschmid

本书不仅展示了人们可以用"仅"Fortran 77做什么,而且还讨论了一些更微妙的问题(例如,应该或不应该使用EXTERNAL声明).这本书并不完全涵盖与"软件工具"相同的空间,但它们是我将标记为"有趣"的三本Fortran编程书籍中的两本....(这是第三部分).

杂项适用于几乎所有Fortran编译器的建议

有一个编译器选项可以强制执行IMPLICIT NONE行为,您可以使用它来识别问题例程,而无需先使用IMPLICIT NONE声明对其进行修改.在第一次构建炸弹之后,由于插入到遗留例程中的IMPLICIT NONE命令,这条建议似乎没有意义.(什么?你的代码审查没有抓到这个?;-)

有一个用于数组边界检查的编译器选项,在调试Fortran 77代码时非常有用.

Fortran 90编译器应该能够编译几乎所有Fortran 77代码甚至更旧的Fortran代码.打开Fortran 90编译器上的报告选项,通过它运行遗留代码,您将在语法检查方面有一个不错的开端.一些商业Fortran 77编译器实际上是以Fortran 77模式运行的Fortran 90编译器,因此对于您拥有的任何构建脚本而言,这可能是相对简单的选项.



3> 小智..:

原始问题中有一些我会提醒的.你说代码充斥着"性能提升".由于Fortran问题通常具有科学性和数学性,因此不要假设这些性能技巧可以改进编译.这可能与语言无关.在Fortran中,解决方案很少涉及代码本身的效率,而是解决最终问题的基础数学.这些技巧可能会使编译速度变慢,甚至可能使逻辑变得混乱,但目的是使解决方案更快.除非你确切知道它在做什么以及为什么这样做,否则不管它.

即使是简单的重构,比如改变看似愚蠢的变量名也可能是一个很大的陷阱.从Maxwell时代开始,在给定的科学领域中,历史上标准的数学方程式将使用特定的简写.因此,在电磁学中看到一个名为B(:)的数组,可以告诉所有Emag工程师究竟要解决的问题.改变你的危险.道德,在重命名之前,先了解科学的标准命名法.



4> dagorym..:

作为一个有FORTRAN经验的人(77味道,虽然我认真使用它已经有一段时间了)和C/C++这个需要注意的项目是数组.FORTRAN数组的索引为1而不是0,就像在C/C++/Java中一样.而且,存储器布置是相反的.因此,递增第一个索引可以为您提供顺序的内存位置.

我的妻子仍然定期使用FORTRAN并且有一些她需要使用的C++代码,因为我即将开始帮助她.当她转换过程中出现问题时,我会试着指出它们.也许他们会帮忙.


Fortran数组默认以索引1开头,但可以声明为以任何值开头.

5> 小智..:

我从1967年以来的'66版本开始使用Fortran(在具有32k字内存的IBM 7090上).然后我使用PL/1一段时间,但后来又回到了Fortran 95,因为它非常适合我们的矩阵/复数问题.我想补充一点考虑因为旧代码的大部分复杂结构仅仅是由于可用的内存量很小,因此强制通过计算或分配的GOTOs 重用几行代码.另一个问题是通过为每个重复的子表达式定义辅助变量来进行优化 - 编译器根本没有为此进行优化.另外,它不允许写DO i=1,n+1; 你必须写n1=n+1; DO i=1,n1.结果,旧代码被多余的变量所淹没.当我在Fortran 95中重写代码时,只有10%的变量存活了下来.如果你想让代码更清晰,我强烈建议你寻找易于消除的变量.

我可能会提到的另一件事是,多年来复杂的算术和多维数组效率非常低.这就是为什么你经常发现重写代码只使用实数变量进行复杂计算,以及用单个线性索引处理的矩阵.



6> 小智..:

好吧,从某种意义上来说,您很幸运,因为Fortran并没有太多的微妙的控制流构造或继承之类的方式。另一方面,它有一些真正令人惊讶的陷阱,例如算术计算的分支到数字标签的东西,不需要声明的隐式类型变量,缺少真正的关键字。

我不了解“性能增强改进”。我猜它们中的大多数可能无效,因为几十年的编译器技术使大多数提示没有必要。不幸的是,除非计划进行大规模重写,否则您可能必须保持现状。

无论如何,核心科学计算代码应相当可读。任何使用中缀算术的编程语言都是阅读Fortran算术和赋值代码的良好准备。



7> 小智..:

你能解释一下你在维护代码时需要做些什么吗?你真的要修改代码吗?如果您可以通过仅修改该代码的接口而不是代码本身来逃避,那将是最好的.

处理大型科学代码(不仅仅是FORTRAN)时的固有问题是基础数学和实现都很复杂.几乎默认情况下,实现必须包括代码优化,以便在合理的时间范围内运行.这个领域的许多代码都是由他们所在领域的专家而不是软件开发专家的科学家/工程师创建的.让我们说"易于理解"不是他们的首要任务(我是其中之一,仍然学习成为更好的软件开发人员).

由于问题的性质,我不认为一般的问题和答案足以提供帮助.我建议你发布一系列附带代码片段的具体问题.也许从一个给你最头疼的那个开始?

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有