【问题标题】:Converting FORTRAN to C / C++将 FORTRAN 转换为 C/C++
【发布时间】:2011-05-17 21:17:27
【问题描述】:

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

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

copy makefile.vc makefile
nmake

(这是包含在 f2c download page 中的关于安装 f2c 的 README 文件的一部分)

在 Linux 或 Unix 上编译 f2c 系统,将 makefile.u 复制到 makefile, 如有必要,编辑 makefile(请参阅 cmets 在它和下面)并输入 “make”(或者可能是“nmake”,取决于 你的系统)。

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

复制 makefile.vc makefile nmake

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

如果你的编译器不理解 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++?

【问题讨论】:

  • 一句警告:LanguageA-to-languageB-converters 可以生成正确运行的代码(尽管仅此一项可能相当困难),但几乎没有一个生成人类可读 i> 代码...
  • 那你有什么建议?我愿意接受建议,我真的必须以某种方式将 FORTRAN 代码转换为 C 或 C++...
  • 什么版本的 Fortran?有好几个。如果 f2c 没有改变,它会转换 Fortran 77。至少有两个较新的版本。
  • @David Thornley:4,实际上(Fortran 90、95、2003、2008)。
  • 我想实际上 学习 FORTRAN 是不可能的。 . .

标签: c++ c windows fortran nmake


【解决方案1】:

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

还有a review of such a tool。评论作者的摘要:

背景

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

结果

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

结论

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

【讨论】:

  • 这不是评论,而是工具作者撰写的文章。
  • 它显然是一个 python 工具,但是通过 pip 设置并不容易,看来您必须安装一个大型计算化学包才能获得它。 f2c 可能更容易。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    一两年后它就停止工作了!

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

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

    【讨论】:

    • 我需要用C++为Zork做一个前端,但是因为找不到Zork的源代码,我就去Adventure,找到了一些FORTRAN源代码。所以我就这么做了。所以,是的,准确地说,这是我的最后一年项目。
    • 这很令人兴奋。我与 Mike Arnautov 一起工作 - 请参阅 en.wikipedia.org/wiki/Colossal_Cave_Adventure,他使用比 FORTRAN 更高级的语言开发了后来的代码。 Y建议你写信给迈克,解释你的问题,看看他的建议。 ADVENT 代码非常棒——在 1970 年代将整个游戏放入固定内存 FORTRAN 是天才。但是你需要进入设计的精神。 (迈克可能会知道 Zork)
    • 谢谢您,先生,我会这样做的。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      首先,将所有 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等转入括号。使子程序无效,为基本类型(例如 Boolean、Character、Integer、Real、Double、Complex、Complex)设置假名。

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

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

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

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

      进出分析是我尚未完成的工作,同样是重新调整尺寸。但在 至此,现阶段相关源码多为C或C++。

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

      【讨论】:

        【解决方案6】:

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

        有什么办法可以转换 FORTRAN 代码转换成 C 或 C++?

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

        【讨论】:

        • 这个答案归结为:“我怎样才能修复这个错误?” - “只是 rtfm 和 DIY,伙计”。这个答案适用于任何 SO 问题。在数学中,我们称之为“微不足道的解决方案”。
        • @sixtytrees 人们在过去十年末发布此答案时对赞成票更加慷慨..
        • @agentp (1) 我评论了我的反对票。 (2) 我对 AShelly 的另一个帖子投了赞成票,以保持积极的平衡,因为它值得赞成。你怎么知道我的投票?
        • @sixtytrees 我对投票一无所知。我不知道你为什么要挖出一个 6 年前的问题,但我只是说你是对的,这种“去阅读手册”的答案今天可能不会受到如此好评。
        【解决方案7】:

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

        【讨论】:

        • f2c 在 Fortran 编译器不可用的情况下仍然使用,当 C 包包含 Netlib 源等时。它比g77 更容易安装。
        • 好吧,我不明白这一点。 f2c 只是将 FORTRAN 转换为 C。如何编译它是另一回事。我个人使用过 MS 和 Borland C 编译器。但是选择对于转换来说真的无关紧要。
        【解决方案8】:

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

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

        【讨论】:

        • OP 在他的帖子末尾询问了代码翻译。 OP 没有发布任何 FORTRAN 代码示例,也没有在他的帖子中提到任何 FORTRAN 语言结构,所以我将如何为他的问题提供更具建设性的答案。
        • 确实如此。从审核队列中有时不容易看到完整的图片,抱歉,看起来应该是评论。
        • 我当然希望操作员现在完成他的最后一年项目!
        • OP 未能完成他最后一年的项目,所以作为他的教授,我活剥了他的皮,现在还戴着他的脸。不要惊慌,不要调整你的设置。
        【解决方案9】:

        你试过binary吗?

        【讨论】:

        • 我下载了它,但它是一个 .gz 文件,下载 gnuzip 后,我得到的只是一个 .exe,它向我显示一个命令控制台,仅此而已。
        • 你的意思是你双击了它? gzipf2c 都是命令行应用程序。如果您想要 GUI 解压缩器,请从 7-zip.org 获取 7zip。
        • 好的,我成功地从中提取了 f2c.exe,虽然它只是一个命令控制台。我得弄清楚如何操作它。 (希望到目前为止我所做的一切都是正确的;我只从原始站点下载了 makefile。
        • 很简单:运行f2c module.f,你会在当前目录中得到一个文件module.c。如果出现问题,f2c 会抱怨,否则会保持沉默。
        • 当我输入“f2c module.f”时,我收到“第 1 行错误:非法延续卡(启动“f2c mo”)”。这是否意味着我缺少文件?我意识到这一定很令人沮丧,帮我解决了这个问题,所以我非常感谢你的帮助......
        【解决方案10】:

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

        【讨论】:

        • 是的,我有 MS Visual Studio 2010,我会用它试试,然后在这里回复你!
        • 我收到“NMAKE:致命错误 U1073:不知道如何制作 'xsum.c'”作为错误。这与我必须“制作 xsumr.out”的非 Unix 系统的 README 文件部分有关吗?
        【解决方案11】:

        f2c 的输出可以通过使用f2cpp 程序(here 可用)转换为可读性更好的 C/C++ 源代码。

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

        #!/bin/bash
        
        f2c -a -C++ -p *.f
        c2cpp.py *.c
        

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

        许可证是 GPL。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-05
          • 1970-01-01
          • 2012-06-10
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多