15

有没有人将 Fortran 77 代码的大型(我们的是 550,000 行)程序转换为 C++?你遇到了什么陷阱?转换成功了吗?您是否使用过for_chttp://www.cobalt-blue.com/fc/fcmain.htm)之类的工具?生成的 C++ 代码是明显更快还是更慢?

4

6 回答 6

11

这增加了 EvilTeach 的建议。请记住,链接Fortran 77 和 C/C++ 代码相当容易,因此您可以逐步转换应用程序的某些部分并将它们与旧部分链接在一起。如果这样做,您将不得不考虑所有常见的 fortran/c 差异(行/列主要数组、数组索引等),但它会为您省去一次调试整个自动翻译代码库的痛苦.

国家 (DOE) 实验室有许多类似的大型混合代码,它们对旧的 Fortran 代码进行了大量投资。如果你走这条路,你可能会考虑使用Babel,它的开发目的是允许在同一个应用程序中的 C、C++、Fortran、Fortran90、Python 和 Java 之间共享组件。实验室这样做的动机是将不同团队为非常大的模拟构建的物理模型捆绑在一起,但您可能会发现它对于转换代码也很有用。它在许多项目中得到积极维护和使用,尽管它对于您想要做的事情可能有点过于复杂。

于 2008-11-09T02:05:25.180 回答
10

有很多事情需要考虑。

真的有两条路可以走。一种是直接逐行转换为c。我的意思是每个 fortran 语句都对应一个等值的 c 语句。

另一条路径是重写,使用 500k loc+ 会做更多的工作。有了这种大小,我当然会寻找一个工具来进行翻译,比如 f2c。

直接端口的问题...

goto 直接翻译,您需要为 goto 目标创建标签。

label10:;

    goto label10;

数组下标是一个潜在的问题。c 是从零开始的,fortran 是从 1 开始的,因此在 fortran 代码中数组的维度需要大一。

real*4 a(10,20)变为

#define XMAX 10 + 1
#define YMAX 20 + 1 
float a[XMAX][YMAX];

允许这样编写循环。

for (x = 1; x <= XMAX; x++)
    for (y = 1; y <= YMAX; y++)
        a[x][y] = 0.0f;

c 数组访问以行为主,而 fortran 以列为主。这可能是一个性能问题。如果它确实成为一个问题,您可以通过某种反转顺序或数组下标的宏定义来解决它。实际上,您还可以让宏从每个下标中减去一个,以使其看起来像一个基于 1 的数组,实际上映射到一个基于 0 的数组。

实数*8 a(XMAX,YMAX) a(4,2) = 3.14

#define A(X,Y)  a[Y][X]
double a[XMAX][YMAX];
A(4,2) = 3.14;

可以使用 stdio 类型文件模拟 fortran 单元 io。如果您使用的是第 19 单元,那么

FILE *fp19 = fopen("file","mode");

如果您在文件中使用 fortran 回车控制,则回车控制可能会出现问题。单元 5 和 6 可以简单地用 stdin 引用,而没有 fopen 的 stdout。

printf 系列函数可以处理许多格式。您可能需要添加额外的循环来处理一些 fortran 数组 io。

写(6, 200) (项目(z,4),z = 1, 20)

int z;
for (z = 1, z <= 20; z++)
    printf("%lf ", proj[z][4]);


o 使用 f2c 可能是最快的方法。然后你被它的rtl卡住了。
o 做一个直接端口是可行的。耗时,但
如果你想长期维护它是可行的,我建议重写。非常耗时,可能更快,但从长远来看更易于维护

幸运的是,在任何情况下,您都可以将原始程序用作基线来进行一组单元测试,以帮助开发工作。

于 2008-11-09T01:48:21.487 回答
7

我的反应是你为什么要转换它。

在 1990 年代,许多公司都在研究如何开发具有大型 Fortran 代码库的产品的问题。即是转换、继续使用 Fortran 还是生产混合版本。我认为大多数人选择了混合方法,通常是 C++ 作为用户界面,而原始的 Fortran 代码库在后台。

我的建议是查看 Carsten Arnholm 的“使用 C++ 和 FORTRAN 77 的混合语言编程”,网址为http://arnholm.org/software/cppf77/cppf77.htm

本文档描述了如何拥有一个包含 C++ 和 Fortran 的应用程序。我不能说某些技术细节是否已经过时,但本文档来自一个希望使用 C++ 进行开发但拥有庞大 Fortran 代码库的项目。

您还可以查看 Barton 和 Nackman 的“科学与工程 C++:高级技术和示例的介绍”,可从好书店获得。本书为 Fortran 程序员教授 C++。它有一些从 C++ 为 Fortran 代码编写包装器的示例。这是一本很好的 C++ 书,忽略了 Fortran 方面。它是在标准制定之前编写的,但差异不是很大。

于 2009-06-10T19:25:58.783 回答
3

我曾经使用这个: http: //manpages.ubuntu.com/manpages/hardy/man1/f2c.html将一个小的fortran程序转换为C。转换成功。检测任何速度变化的代码并不复杂。

由于您的程序分配得更大,我真的不知道一切是否会像我一样运行。

于 2008-11-09T01:18:00.657 回答
2

您可能想查看Promula。与许多其他自动翻译器相比,它生成的 C 代码更具可读性。我没有直接使用 Promula,但我已经将相当多的 Promula 输出从 C 转换为 C++。将 C 代码清理为合法的 C++ 很容易,但当然要使其成为真正好的 C++ 需要更多的努力。

于 2008-11-09T02:28:05.400 回答
0

我研究过一个应用程序,它的核心是使用for_c从 FORTRAN 转换代码。它创建的代码太糟糕了。由于大部分内容难以辨认,因此很难维护。幸运的是,该代码非常稳定,很少需要对其进行任何处理。

然而,这是在多年前完成的——大约是 Windows 的 16 位早期。也许 for_c 现在更好了?

于 2009-06-17T20:30:25.347 回答