我正在使用我不太熟悉的语言(FORTRAN)开始一个新项目,并且正处于“发现”阶段。通常通读和找出代码是一项相当简单的任务,但是,这段代码相当大,而且结构不那么结构化。是否有任何方法/提示/技巧/工具来绘制 50k 行相当密集的代码?
8 回答
是 Fortran IV(不太可能)、77 还是 90/95?这些修订使语言发生了很大变化。High-Performance Mark 列出的一些问题在 Fortran IV 中很常见,但在 77 中并不常见,而其他问题在 77 中仍然很常见。检查具有最大编译器警告的代码的建议非常好——甚至使用两个编译器。
我将从绘制子程序结构图开始,并从高级别的角度了解它们的工作。然后更深入地了解需要更改的区域。
有用于分析甚至改进 Fortran 代码的工具,例如http://www.polyhedron.com/pf-plusfort0html或http://www.crescentbaysoftware.com/vast_77to90.html。
调试器是您的朋友——如果您有一个用于 Fortran 的调试器。
在你走得更远之前,我会熟悉该语言的基本语法以及任何弱点,例如从变量名称和声明位置等对变量类型的假设。如果你没有得到这些东西,那么你可能会迷失方向即使有一个有用的调试器。
还要记住,结构有时取决于语言。您正在查看的代码可能对于您习惯使用的语言来说结构很糟糕,但对于 Fortran 来说可能结构非常好,它有自己的一组特性。我想我只是说要以开放的心态开始,否则您将携带不必要的倾向,即您正在查看的代码很糟糕。它可能是,但它可能只是你不习惯的东西。
祝你好运。大约 20 年前,当我以 Fortran 编程为生时,我更喜欢 Fortran,由于某些平台上的计算速度,它仍然是某些应用程序的首选语言。在学术界还是很多的。
三十年前(哎呀! )我编写 Fortran (F77) 时,我们的设施有限,无法自动绘制未知代码库的流程图。它很丑陋,并且仅限于绘图仪床可以提供的房地产。正如@Simon 所提到的,您可以(并且当时可以使用某些版本)也使用调试器。
现在,交互式探索更容易了。此外,您可以尝试使用 IDE。我没有亲自尝试过,因为 Fortran 不再是我的主要开发语言,但Photran是 Fortran 的 Eclipse 插件,并且似乎正在积极开发中(最后一个版本是本月)。
我总是找到执行的起点,或者其他代码(我没有处理的)调用我正在检查的代码的位置。然后我就从那里开始通读它,根据需要遵循方法调用来弄清楚发生了什么。
振作起来。Fortran 的优点之一是它非常简单。除非你找到一个被编程为利用“聪明”技巧的代码。我建议你做的第一件事是通过一个编译器运行你的程序,将语法检查和标准合规性调到最大。旧的(Fortran 90 之前的)FORTRAN 因人们用来绕过语言限制的巧妙技巧而臭名昭著。更熟悉现代语言的程序员的一些陷阱:
-- 通用块;和其他全局状态机制;特别糟糕的是用于重命名和重新定义变量的常用块;
-- 等价(可怕,但你可能会绊倒它们);
-- 固定格式的源格式;
-- CONTINUE 语句的使用,以及在同一个 CONTINUE 语句处结束多个循环的做法;
-- 变量的隐式声明(为了解决这些问题,在 PROGRAM、MODULE、SUBROUTINE 或 FUNCTION 语句出现的任何地方立即插入行 IMPLICIT NONE);
-- 子程序的多个入口点;
——还有一些我很熟悉的我想不起来了。
如果这些对你毫无意义,他们很快就会。最后,您可能想了解 Fortran 的理解。这很花钱,但非常有用。
问候
标记
您是在 Linux 还是 OpenSolaris 上运行?如果是这样,Sun Studio Fortran 编译器就是最好的编译器之一。Sun Studio IDE 理解 Fortran 并带有调试器。http://developers.sun.com/sunstudio
我困了,所以我会很短:)
从 grepping (或您使用的任何工具)程序语句、子例程语句、函数语句等开始。如果使用 f90,可能是模块等。在此基础上画一种图,在上面你会看到什么调用什么(什么使用什么子例程、函数等)。
在您对情况有了大致的了解后,请获取数据。Fortran 要求在程序/子例程开始时声明所有内容......所以第一行应该给你声明。把这些放在刚刚做的图表里之后,到时候你应该已经很清楚情况了。
现在,下一步真的取决于你想用它做什么。
@ldigas:“Fortran 要求在程序/子程序开始时声明所有内容......”
不,除非 IMPLICIT NONE 出现在例程的开头,否则 Fortran 使用隐式类型。所以以 AH 和 OZ 开头的变量名是 REAL,IN 是 INTEGER。(这使得 GOD 成为 REAL 变量,而 INT,幸运的是,隐含地成为 INTEGER。)请记住,Fortran(实际上当时是 FORTRAN)是由科学家和数学家设计的,i、j、k、l、m 和n 总是整数。
使用 IMPLICIT NONE,您被迫显式键入所有变量,就像在 C、C++ 或 Java 中一样。所以你可以拥有 INTEGER GOD 和 REAL INT。