如何轻松地将FORTRAN代码转换为Python代码(真正的代码,而不是包装器)

时间:2013-08-14 03:03:30

标签: python fortran code-translation

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

2 个答案:

答案 0 :(得分:9)

编辑:添加了有关numpy的信息

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

因此,您不仅需要翻译1000个例程的代码,而且还需要理解每个算法及其所有重叠的getos,并在编写之前将算法转换为结构化程序它在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 to Python工具,使用像Java这样的字节码技巧。但它仍然需要开发,好的库(如numpy,matplotlib,pandas ......)的可用性至少可以说是不必要的。

答案 1 :(得分:1)

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