Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何轻松地将FORTRAN代码转换为Python代码(真实代码,而不是包装器)_Python_Fortran_Code Translation - Fatal编程技术网

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

如何轻松地将FORTRAN代码转换为Python代码(真实代码,而不是包装器),python,fortran,code-translation,Python,Fortran,Code Translation,我有一个FORTRAN的数字库(我相信FORTRAN IV),我想把它转换成Python代码。我想要真正的源代码,可以在任何Python虚拟机上导入——Windows、MacOS-X、Linux、Android。我开始手工操作,但库中大约有1000个例程,因此这不是一个合理的解决方案。编辑:添加了有关numpy的信息 这样的工具存在于,或,甚至。但您永远不会有Fortran到Python的工具,原因很简单:与Fortran、Lisp或C不同,Python没有GOTO[1]。Fortran(特别是

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

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

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

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

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

对于C(这里不是您的语言,但可能是一种选择),现在有了,而且Fortran已经与集成。斯威格有一些

顺便说一下,不是转换为“纯”Python,可以使用NUMPY:NUMPY功能类似于FORTRAN 90(参见比较),因此您可以考虑首先将程序转换为F90,以便平滑过渡。似乎还有一个问题。如果您在64位Windows上需要numpy,可以使用二进制文件

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

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

[1] 你可能会问:但是如果GOTO是个问题,为什么会有Fortran到Java的工具呢?嗯,它使用JVM的技巧,JVM内部有。Python字节码中也有一个GOTO(寻找跳转),因此这里可能有一些东西需要研究。所以我前面的陈述是错误的:可能有一个Fortran到Python的工具,使用Java中的字节码技巧。但它仍有待开发,而好的库(如numpy、matplotlib、pandas等)的可用性至少可以说是不必要的。

I将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
def is_greater_than(a,b):
    return a<b
逻辑函数大于(a,b)
真实的,真实的意图
真实,意图(in)::b

是_大于_=就我所知,没有转换工具。为你感到双重的难过。。。首先,您必须转换的行数,但主要是因为您必须处理FORTRAN IV。即使经常使用的
f2py
也不能很好地将FORTRAN代码转换为Python代码,因此肯定没有简单的方法。@KyleKanos f2py不能将FORTRAN代码转换为Python代码。。它围绕Fortran代码创建一个C包装器,然后将其编译为Python可以导入的共享库对象。@SethMMorton:很高兴知道,我不知道它是如何工作的。谢谢这几乎肯定是个坏主意。fortran代码的紧密内部循环不仅是一种巨大的工作浪费,还会导致python代码的速度非常慢。应该可以使用gfortran在这些平台上编译您的fortran代码,然后用f2py包装它。一个缺点是,对于windows,没有任何好的免费64位编译器,因此您必须使用32位python。您可以使用goto创建结构化的程序结构。反之亦然,如果代码故意到处乱跑,则可能无法使其结构化。如果我必须处理这个任务,我会首先尝试转换成现代fortran(去掉所有goto)。如果代码结构良好与否,这一点应该很快就会变得明显。我正在编写的代码已经有将近20年的历史了(尽管仍在维护中),而且它没有GOTOs。我想这对于任何维护良好的fortran代码来说都是很常见的,因为GoTo很难维护。fortran到python的转换器对于所有这些代码仍然是有用的。我仍然认为最好编写一个包装器,以从fortran的速度和python良好的I/O和GUI功能中获益。将计算代码转换为像Python这样的语言是目前速度最慢的语言之一,这不是明智之举。Python被用于粘合代码和接口,甚至(特别是!)在大型项目中,例如,有一个很好的理由。Fortran代码与numpy的集成提供了类似于Matlab的语法,您的代码仍然作为后端。我只看到了这种方法的优点,Python现在已经正式拥有了,所以这可能是一个利用它的好机会。