【问题标题】:How can I easily convert FORTRAN code to Python code (real code, not wrappers)如何轻松地将 FORTRAN 代码转换为 Python 代码(真实代码,而不是包装器)
【发布时间】:2013-08-15 20:44:29
【问题描述】:

我在 FORTRAN 中有一个数值库(我相信 FORTRAN IV),我想将它转换为 Python 代码。我想要可以在任何 Python 虚拟机上导入的真实源代码——Windows、MacOS-X、Linux、Android。我开始手动执行此操作,但库中大约有 1,000 个例程,因此这不是一个合理的解决方案。

【问题讨论】:

  • 遗憾的是,没有转换工具(据我所知)。为你感到双重糟糕......首先,你必须转换的行数,但主要是因为你必须处理 FORTRAN IV。
  • 即使是经常使用的f2py 也不能很好地将 Fortran 代码转换为 Python 代码,因此肯定没有 easy 方法.
  • @KyleKanos f2py 不会将 Fortran 转换为 Python 代码。它会围绕 Fortran 代码创建一个 C 包装器,然后将其编译为 Python 可以导入的共享库对象。
  • @SethMMorton:很高兴知道,我不知道它是如何工作的。谢谢
  • 这几乎肯定是个坏主意。除了浪费大量精力外,fortran 代码的紧密内部循环还会导致 python 代码极其缓慢。应该可以使用 gfortran 在任何这些平台上编译您的 fortran 代码,然后用 f2py 包装它。不利的一面是,对于 Windows,没有任何好的免费 64 位编译器,因此您必须使用 32 位 python。

标签: python fortran code-translation


【解决方案1】:

这样的工具存在于Fortran to LispFortran to C,甚至Fortran to Java。但是您永远不会拥有 Fortran 到 Python 工具,原因很简单:与 Fortran、Lisp 或 C 不同,Python 没有 GOTO [1]。 Fortran(尤其是 Fortran IV)代码中有很多 GOTO。即使Jacopini 提出了一个定理,表明您可以使用结构化编程来模拟 GOTO,但实现一个真正(且高效)的语言转换工具还是太麻烦了。

因此,您不仅需要翻译 1000 个例程的代码,还需要理解每个算法及其所有重叠的 goto,并在编写之前将算法翻译成结构化程序它在 Python 中。祝你好运!

嘿,为什么你认为包装不好? Windows、OSX 和 Linux 都有 Fortran 和 C [2] 编译器和良好的包装器!

对于 C(这里不是您的语言,但f2c 可能是一个选项),有SWIG,Fortran 有f2py,现在与numpy 集成。 SWIG 有一些 support for Android

顺便说一句,您可以使用 NumPy,而不是转换为“纯”Python:NumPy 的功能类似于 Fortran 90(请参阅比较 here),因此您可以考虑先将程序转换为 F90 以便更流畅过渡。似乎还有一个Numpy on Adnroid。如果您在 64 位 Windows 上需要 NumPy,可以使用二进制文件 here

如果您决定使用包装器,gfortran 可在 Linux(只需从分发包安装)、Windows (MinGW) 和 Android 上运行。 如果你沿着这条线走,不要忘记编译 FIV 代码,所以会出现通常的“单程循环”问题(通常编译器选项很好)。您可能还必须手动转换一些现代编译器中没有的旧的、非标准的语句。

显然,您还可以选择将项目语言切换为 Lisp 或 Java...

[1] 你可能会问:如果 GOTO 是问题所在,那怎么会有 Fortran to Java 工具呢?嗯,它使用了 JVM 的技巧,它内部有 GOTO instruction。 Python 字节码中还有一个 GOTO(查找 JUMP here),所以这里可能有一些东西需要调查。所以我之前的陈述是错误的:可能是一个 Fortran 到 Python 的工具,使用 Java 中的字节码技巧。但它仍有待开发,至少可以说,良好的库(如 NumPy、matplotlib、pandas...)的可用性使得它变得不必要。

【讨论】:

  • 您可以使用 goto 创建结构化程序结构。反之亦然,如果代码到处乱跑,则可能无法使其结构化。如果我必须完成这项任务,我会首先尝试转换为现代 fortran(摆脱所有 goto)。代码结构是否良好应该很快就会变得明显。
  • 我正在编写将近 20 多年前的代码(尽管仍在维护)——而且它没有 GOTO。我想这对于任何维护良好的 fortran 代码来说都是很常见的,因为 GOTO 真的很难维护。对于所有这些代码,fortran 到 python 的转换器仍然很有用。
  • @naught101 我仍然认为最好编写一个包装器,以从 Fortran 速度和 Python 良好的 I/O 和 GUI 功能中受益。将计算代码转换为像 Python 这样的语言,这是现存最慢的语言之一,这不是明智的做法。 Python 用于粘合代码和接口是有充分理由的,甚至(或特别是!)在大型项目中,如Alliances。 Fortran 代码与 numpy 的集成提供了类似于 Matlab 的语法,而您的代码仍然作为后端。我只看到这种方法的优点。
【解决方案2】:

wrote a translator 将 Fortran 的一个子集转换为 Python(和其他几种语言)。它只兼容 Fortran 的一小部分,但我希望它仍然有用。

翻译器可以解析这个 Fortran 函数:

LOGICAL function is_greater_than(a, b) 
    real,intent(in) :: a
    real,intent(in) :: b 
    is_greater_than = a<b
end function is_greater_than

...并将其翻译成这个 Python 函数:

def is_greater_than(a,b):
    return a<b

【讨论】:

  • Python 正式拥有type annotations,所以这可能是一个利用它的好机会。
猜你喜欢
  • 1970-01-01
  • 2022-12-30
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
相关资源
最近更新 更多