将Fortran 77代码转换为C ++

时间:2008-11-09 01:04:40

标签: c++ translation fortran

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

6 个答案:

答案 0 :(得分:9)

有很多事情需要考虑。

实际上有两条路可走。一种是直接逐行转换为c。我的意思是每个fortran声明给一个等同的声明。

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

直接端口的问题......

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

label10:;

    goto label10;

数组下标是一个重要的问题。 c是基于零的,fortran是基于1的,所以数组需要在fortran代码中标注一个更大的尺寸。

真实* 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是列主要。 这可能是一个性能问题。如果确实成了问题,你可能会 用某种宏定义来解决它,它反转了顺序或数组下标。实际上你也可以让宏从每个下标中减去一个,以使它看起来像一个基于一个数组,实际上映射到一个基于零的数组。

真实* 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;

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

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

如果您在文件中使用fortran托架控件,则可能存在托架控制问题。单元5和6可以简单地用stdin和stdout引用,而不用fopen。

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

写作(6,200)(PROJ(z,4),z = 1,20)

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

使用f2c可能是最快的方法。然后你被它的rtl困住了。 做一个直接的港口是可行的事情。耗费时间,但可行 如果你想长期保持,我会建议改写。非常耗时,可能更快,但从长远来看更易于维护

在任何情况下,您都可以使用原始程序作为基线来制作一组单元测试,以帮助开发工作。

答案 1 :(得分:9)

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

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

答案 2 :(得分:6)

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

在20世纪90年代,许多公司都在研究如何开发具有大量Fortran代码库的产品的问题。那就是转换,留在Fortran还是生产混合动力车。我认为大多数人选择了混合方法,通常是用户界面的C ++和后台的原始Fortran代码库。

我的建议是在http://arnholm.org/software/cppf77/cppf77.htm查看Carsten Arnholm的“使用C ++和FORTRAN 77进行混合语言编程”。在互联网的早期阶段,这个文档很好地链接到了。

本文档介绍如何使用包含C ++和Fortran的应用程序。我不能说一些技术细节是否可能已经过时,但是这个文档来自一个想要使用C ++进行开发但有一个庞大的Fortran代码库的项目。

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

答案 3 :(得分:3)

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

由于你的程序比较大,我真的不知道一切都会像我一样运行。

答案 4 :(得分:2)

您可能需要查看Promula。它产生比许多其他自动翻译器更可读的C代码。我没有直接使用Promula,但我已经将相当数量的Promula输出从C转换为C ++。将C代码清理成合法的C ++很容易,但当然需要花费更多精力才能使它成为非常好的C ++。

答案 5 :(得分:0)

我已经开发了一个应用程序,其核心是使用 for_c 从FORTRAN转换的代码。它创造的代码太可怕了。它很难维护,因为大部分都是难以辨认的。幸运的是,代码非常稳定,很少有必要对它进行任何操作。

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

相关问题