14

作为我最后一年项目的一部分,我需要将一些 FORTRAN 代码转换为 C 或 C++(无论哪种语言,只要我能理解它,并且我能理解 C 风格的语言)。

我发现了 f2c,一个据称将 FORTRAN 转换为 C 的程序,并尝试按照说明安装它,方法是将 makefile.vc 文件保存在我的驱动器上,然后执行

copy makefile.vc makefile
nmake

(这是 f2c下载页面中包含的关于安装 f2c 的 README 文件的一部分)

要在 Linux 或 Unix 系统上编译 f2c,请将 makefile.u 复制到 makefile,必要时编辑 makefile(参见其中和下面的注释)并键入“make”(或者可能是“nmake”,具体取决于您的系统)。

使用 Microsoft Visual C++ 在 MS Windows 系统上编译 f2c.exe,

复制 makefile.vc 生成文件 nmake

对于其他 PC 编译器,您可能需要使用 -DMSDOS(即使用 MSDOS #defined)编译 xsum.c。

如果您的编译器不理解 ANSI/ISO C 语法(即,如果您有 K&R C 编译器),请使用 -DKR_headers 进行编译。

在文件具有单独的二进制和文本模式的非 Unix 系统上,您可能需要“make xsumr.out”而不是“make xsum.out”。

我正在运行 x64 位版本的 Windows Vista 并尝试了“nmake”,但我得到了

'nmake' 不是内部或外部命令、可运行程序或批处理文件。

经过一番搜索,我下载了 Nmake15.exe,但它在 x64 位机器上不起作用,而且显然没有它的版本。所以我下载了 Windows SDK,在被告知可以工作之后,但它并没有改变任何东西。

如果有的话,我在这一切中哪里出错了,有没有办法将 FORTRAN 代码转换为 C 或 C++?

4

11 回答 11

10

我发现有一个名为fable fable - Automatic Fortran to C++ conversion的小工具包专门用于这种转换。

有这样一个工具的评论。评论作者的摘要:

背景

在科学计算领域,Fortran 是 20 世纪下半叶大部分时间里占主导地位的实现语言。这段时间积累的许多工具,已经很难与现代软件集成,而现代软件现在以面向对象语言为主。

结果

在大型科学软件项目的需求驱动下,我们开发了一个名为 FABLE 的 Fortran 到 C++ 源代码到源代码的转换工具。这使得即使在切换语言时也能继续开发新方法。我们报告了 FABLE 在三个主要项目中的应用,并详细比较了 Fortran 和 C++ 运行时性能。

结论

我们的经验表明,与原始开发时间(通常以年为单位)相比,大多数 Fortran 77 代码的转换工作量很小(以天为单位)。使用 FABLE,可以在现代面向对象环境中以可移植和可维护的方式重用和改进遗留工作。FABLE 在非限制性开源许可下可用。在 FABLE 中,对 Fortran 源代码的分析与 C++ 源代码的生成是分开的。因此,FABLE 的部分内容可以重用于其他目标语言。

于 2015-09-26T07:54:22.687 回答
5

f2c 真的是要走的路,只要你有 F77 代码。如果您有 F90 或更高版本,那么 f2c 将无济于事。只要您记得 -a 开关,我已经多次使用 f2c 并取得了巨大的成功。

顺便说一句,我将 f2c 评为有史以来最棒的代码之一!

于 2010-11-30T19:31:53.367 回答
4

您需要清楚为什么要这样做。是因为您需要的功能仅在某些旧版 FORTRAN 中可用吗?很多年前,当我需要一个通用矩阵求逆算法时,我遇到了这个问题,该算法仅在 FORTRAN 中可用。这并不容易理解——没有像 G(J) 这样命名的注释和变量。我使用 f2c 将其转换为 C 并且运行良好。但这更难理解。两点是FORTRAN从1开始计数,C从0开始计数,所以有很多i+1和j-1。参数也必须通过引用来实现。

后来我不得不在Java中运行它。仍然没有其他算法,所以我将 C 转换为 Java。这真的很痛苦。我仍然不明白发生了什么。

一两年后它停止工作!

但是,幸运的是,现在有几个 Java 实现。

因此,如果您能解释您的真实需求,也许我们可以提供帮助。我希望这不是一项任务,因为如果是这样,它(IMO)就是一个可怜的任务。如果有一些神奇的遗留代码,建议您尽可能努力找到现代的等价物。

于 2010-12-05T16:54:59.483 回答
3

您对此不是很清楚,但听起来您想研究代码,为此您想将其转换为 C 或 C++。如果您想使用代码而不是研究它,那么我在这里不合适,您应该寻找 Fortran 编译器。

放弃。您找不到任何将惯用的 Fortran 翻译成惯用的 C 或 C++ 的方法。语言之间存在细微的语义差异,为了使其正确,翻译程序需要非常精确,并解释很多事情,并进行模糊的函数调用,这可能会非常令人困惑。您将无法获得可读的 C 或 C++。

相反,您应该学习适当版本的 Fortran。如果您了解 C 和 C++,那么学习它应该一点也不难。它只是另一种语言,不会有太多新概念。

于 2010-11-30T20:27:20.060 回答
3

到目前为止,我一直用于转换的方法是半自动化的:大量的编辑器和文本脚本。

首先,将所有 Fortran 源代码准直到一个文件中(根据需要放置标记以允许重新分隔文件)。

接下来,将数字标签转换为命名标签(例如,在它们之前添加一个 L 用于 goto 和 F 用于格式)。在引用标签的位置进行适当的更改。

接下来,标记标签 - 继续组合和语句继续(例如,在它们出现的每一行的开头标记)。然后重新加入 label-continue 和 statement-continuation 行。在像 vi 这样的编辑器中,这意味着要执行一系列(例如)1000J,然后如果行标记的开头是 # 则大量替换 :%s/#/^V^M/g。由于延续线像 do-continue 组合一样被特别标记,所以它们会重新加入。

确保 if-labels 和 do-labels 是分开的(例如,编写一个 grep 模式来提取相关行,然后编写一个简单的括号匹配程序来检查它们)。分开后,您可以将 do-continues 变成括号。

将if-then-else、dowhile/enddo、subroutine/endsub等转入括号。使子程序无效,为基本类型(例如布尔、字符、整数、实数、双精度、复数、复数)设置假名。

注释被转换为 C++ // 注释;列 0 和 ! 注释。

然后您可以重新设计函数原型。这实际上是从 KR 到 ANSI-C 的转换,需要一个简单的程序来读取函数头和变量声明以匹配它们。理想情况下,您可能希望首先将变量声明放在一行中。这还需要一个编辑脚本和一个实用程序。例如,“Double A, B, C, ...”将转换为“#Double\nA\nB\n”。然后设置一个实用程序来为所有非 # 行加上最近的前面 # 行前缀。

参数语句重新加入类型声明并转换为“const”语句。保存转换为静态声明。Commons 我还没有找到一个很好的工作方式。

接下来是困难的部分:数组尺寸标注、变量输入/输出分析(以确定哪些变量需要通过值或引用传递)。您应该获得一个识别引用类型 & 或使用 C++ 的 C 编译器。对于数组重新维度,您可能还需要转到允许重新定义 [] 的 C++。

进出分析是我还没有完成的事情,同样的重新尺寸。但在这一点上,现阶段相关的源码大多是C或C++。

请注意:Fortran 2010 允许并行处理,这超出了 C 甚至 C++(除了它们的多线程能力)。如果你的程序中有这些,事情会变得更加困难。

于 2014-11-21T22:45:03.043 回答
2

如果我必须在 Windows 上安装 f2c,我会使用 Cygwin。现在有了g77,我希望没有多少人再使用f2c了。

于 2010-11-30T13:29:22.053 回答
2

我只回答你问题的最后一部分:

有什么方法可以将该 FORTRAN 代码转换为 C 或 C++?

是的,有:阅读 fortran 代码,并在 C 文件中编写等效的 C 语句。它们都是命令式语言。语法不同但并非不可能解码。这可能会给您带来比自动转换器更好的结果,并且还会让您更深入地了解原始程序的工作原理。

于 2010-11-30T19:38:36.757 回答
2

直接从 FORTRAN 转换到 C 或 C++ 的过程版本应该不复杂,建议主要是因为您将学习 FORTRAN 实现的内部工作。

像这样的自动工具f2c会产生带有双下划线的混乱代码,如下所示:(__i我是循环计数器变量)。

于 2016-05-13T09:12:32.850 回答
1

你试过二进制吗?

于 2010-11-30T13:28:49.090 回答
1

你有安装 MS 的 Visual Studio 吗?如果是这样,nmake 在 Visual Studio 命令行(不是普通命令行)上可用。如果没有,也许尝试下载并安装它?

于 2010-11-30T13:29:36.823 回答
1

通过使用此处提供的程序,可以将输出f2c转换为可读性更好的 C/C++ 源代码。f2cpp

f2c它是用 Python 编写的,可以在 Linux 下通过例如 shell 脚本一起调用

#!/bin/bash

f2c -a -C++ -p *.f
c2cpp.py *.c

wheref2c将 Fortran 固定格式转换为 C 和c2cpp人类可读的 C/C++ 源代码。

许可证是 GPL。

于 2020-02-07T13:55:23.757 回答