16

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

4

2 回答 2

13

Fortran 到 Lisp,或Fortran 到 C,甚至Fortran 到 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对 Android 有一些支持

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

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

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

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

于 2013-08-14T05:57:10.443 回答
2

编写了一个翻译器,将 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
于 2018-09-14T00:30:21.163 回答