web-dev-qa-db-ja.com

FORTRANコードをPythonコード(ラッパーではなく実際のコード)に簡単に変換するにはどうすればよいですか?

FORTRANに数値ライブラリがあり(FORTRAN IVだと思います)、それをPythonコードに変換したいと思います。 Python仮想マシン--- Windows、MacOS-X、Linux、Androidにインポートできる実際のソースコードが必要です。私はこれを手作業で始めましたが、ライブラリには約1,000のルーチンがあるため、これは合理的な解決策ではありません。

14
Peter Olsen

edit:numpyに関する情報を追加

このようなツールは、 FortranからLISP 、または FortranからC 、さらには FortranからJava )用に存在します。単純な理由で、Fortran to Pythonツールはありません:Fortran、LISP、またはCとは異なり、PythonにはGOTOがありません-)[1]。Fortran(特にFortran IV)コードには多くのGOTOがあります。構造化プログラミングでGOTOをエミュレートできるという Jacopini の定理があっても、実装するのは面倒です。実際の(そして効率的な)言語変換ツール。

したがって、1000個のルーチンのコードを変換する必要があるだけでなく、Pythonで記述する前に、各アルゴリズムとそのすべての組み込まれたgotoを理解し、アルゴリズムを構造化プログラムに変換する必要があります。頑張ってください。 !!

ねえ、なぜラッパーが悪いと思いますか? Windows、OSX、およびLinuxにはすべて、FortranおよびC [2]コンパイラーと優れたラッパーがあります!

Cの場合(ここではあなたの言語ではありませんが、 f2c はオプションかもしれません)、 [〜#〜] swig [〜#〜] があり、Fortranには f2py 、現在は numpy と統合されています。 SWIGにはいくつかの Android のサポートがあります。

ちなみに、「純粋な」Pythonに変換する代わりに、numpyを使用できます。numpyの機能はFortran 90に似ているため(比較 ここ を参照)、最初にプログラムをF90に変換してよりスムーズな移行。 AdnroidのNumpy もあるようです。また、64ビットWindowsでnumpyが必要な場合は、バイナリ ここ があります。

ラッパーを使用する場合、gfortranはLinux(配布パッケージからインストールするだけ)、Windows( MinGW )、および Android で実行されます。その行に沿って、FIVコードをコンパイルすることを忘れないでください。そのため、通常の「ワントリップループ」の問題が発生します(通常はコンパイラオプションで問題ありません)。おそらく、古い非標準のステートメントを手動で変換する必要があります。最新のコンパイラにはありません。

もちろん、プロジェクト言語をLISPまたはJavaに切り替えるオプションもあります...

[1]あなたは尋ねるかもしれません:しかしGOTOが問題であるなら、なぜJavaツールへのFortranがあるのですか?まあ、それは内部に GOTO)を持っているJVMでトリックを使用します命令 。Pythonバイトコード(JUMP ここ を探してください)にもGOTOがあるので、ここで調査することがあるかもしれません。したがって、私の前のステートメントは間違っています:そこにFortranからPythonツール、Javaのようなバイトコードトリックを使用します。しかし、開発はまだ残っており、優れたライブラリ(numpy、matplotlib、pandasなど)が利用可能です。 。)控えめに言っても不要になります。

9
user1220978

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

...そしてそれをこのPython関数:

def is_greater_than(a,b):
    return a<b
1
Anderson Green