有没有人将Fortran 77代码的大型(我们的550,000行)程序转换为C++?你遇到了什么陷阱?转换成功了吗?你使用过for_c
(http://www.cobalt-blue.com/fc/fcmain.htm)这样的工具吗?生成的C++代码是显着更快还是更慢?
这增加了EvilTeach的建议.请记住,链接 Fortran 77和C/C++代码相当容易,因此您可以逐步转换部分应用程序并将它们与旧部件链接在一起.如果你这样做,你将不得不考虑所有常见的fortran/c差异(行/列主要数组,数组索引等),但它可以节省你一次调试整个自动翻译的代码库的痛苦.
在国家(DOE)实验室中有许多这样的大型混合代码,它们对旧的Fortran代码进行了大量投资.如果你走这条路,你可以考虑使用Babel,它是为允许在同一个应用程序中共享C,C++,Fortran,Fortran90,Python和Java之间的组件而开发的.在实验室中实现这一目标的动机是将不同团队构建的物理模型捆绑在一起进行大型模拟,但您可能会发现它对于转换代码也很有用.它在许多项目中得到了积极的维护和使用,尽管它可能对你想要做的事情来说有点过于复杂.
有很多事情需要考虑.
真的有两条路可走.一种是直接逐行转换为c.我的意思是每个fortran声明给一个等于c的声明.
另一条路径是重写,使用500k loc +,这将是更多的工作.有了这种大小,我当然会寻找一种工具来进行翻译,比如f2c.
直接端口的问题......
gotos直接翻译,你需要为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是列主要.这可能是一个性能问题.如果它确实成为一个问题,你可以用某种宏定义来解决它,这会颠倒顺序或数组下标.实际上你也可以让宏从每个下标中减去一个,以使它看起来像一个基于一个数组,实际上映射到一个基于零的数组.
real*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.
WRITE(6,200)(PROJ(z,4),z = 1,20)
int z; for (z = 1, z <= 20; z++) printf("%lf ", proj[z][4]);
o使用f2c可能是最快的方法.然后你被它的rtl困住了.
o做一个直接的港口是可行的事情.
如果你想长期保持它,这是耗时但可行的
,我建议重写.非常耗时,可能更快,但从长远来看更易于维护
令人高兴的是,在任何情况下,您都可以使用原始程序作为基线来进行一组单元测试,以帮助开发工作.
我的反应是你为什么要转换它.
在20世纪90年代,许多公司都在研究如何开发具有大量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方面.它是在标准设定之前编写的,但差异不是很大.