以前 iPad の a-Shell アプリに『 f2c 』というコマンドをインストールして、「 Fortran to C 」の略語だと思って、試してみたことが何回かあります。
例えば、Fortran言語で書かれたプログラムのファイル名を ftest.f とするとき、
$ f2c ftest.f
と入れると、ftest.c というファイルが作られ、
その中身はC言語のプログラムみたいなので、
$ clang ftest.c
とやってみましたが、エラーが出るばかりで、失敗でした。
それ以上先に進めないので諦めかけていましたが、先日、思い切って
作者( another_shell@icloud.com )宛にメールを送って問い合わせ、
私の拙い英語で何度かメールを交わしたところ、
親切に色々とアドバイスをもらって、実行ファイル a.out を作ることができました。
a-ShellでFortranをコンパイルする方法について、作者とメールのやり取りをして分かった必要事項は、次の3つです。
⚫️ 最新の a-Shell アプリをインストール(あるいは更新)すること。
(App Store から)
⚫️ 最新の f2c コマンドをダウンロードしてインストールすること。
$ pkg install f2c
( a-Shellのコマンドで)
⚫️ Fortran プログラムから実行ファイルを作る手順は、次の2つの a-Shellのコマンドを実行すること。
$ f2c 〈プログラム名〉.f
$ clang 〈プログラム名〉.c -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c
f2c コマンドは問題ないが、clang コマンドは付けるべきオプションが長くて複雑なので、コンパイルのたびに手入力するのは間違いの元だと思って、この部分をなんとかしたいと思って、いろいろ試行しました。
シェルスクリプトで行けるのではないかと思ってやってみました。
clang pname.c -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c
という内容のテンプレートとしてのシェルスクリプト(仮にファイル名を forclangpname.sh としておきます)を作っておいて、各プログラムをコンパイルするときに、それをコピーして、ファイルの内容とファイル名ともに "pname" の部分をそれぞれ "new" などに書き替えれば
$ source forclangnew.sh
とコマンド入力すれば new.c から実行ファイル a.out を作ることができます。
しかし、プログラムごとにシェルスクリプトを編集し直すのも手間がかかるなあと思います。
プログラム名をシェル引数として渡して dash という新しいシェルを使えばなんとかなるかと思い、
clang $1 -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c
という内容のシェルスクリプト forclang.sh を作成して
$ dash forclang.sh new.c
などとやってみましたら、うまくいきました。
それなら、ついでに f2c で pname.f から pname.c を作成する機能(Fortran からC言語へ変換)や、実行ファイル名を a.out から自動的にプログラム名に変更する機能も組み込んで、os.system 命令を使った Python のプログラムを作ったらもっと便利だろうなと思いついて作成したのが forclang.py です。
Python ソースプログラム "forclang.py"
#! python
import os, sys
args = sys.argv
fname = args[1]
if fname[-2:] == ".f":
pname = fname[:-2]
else:
pname = fname
fname = pname + ".f"
comm = "f2c "+fname
os.system(comm)
comm = "clang " + pname + ".c" + " -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c"
os.system(comm)
comm = "mv a.out " + pname
os.system(comm)
★ 使い方 ★
プログラムをコピーして、"forclang.py" というファイルを作ってください。
(プログラム名はお好きな名前でもOK … for2run.py, f2clang.py, etc.)
それを Fortran のプログラム(仮に ftest.f としておきます)と
同じディレクトリー(フォルダ)に置いて、
$ python forclang.py ftest.f
とコマンド入力すると、
エラーがなければ、C言語の ftest.c と 実行ファイルの ftest が作成されます。
$ chmod +x forclang.py
としておいたら、
$ forclang.py ftest.f
と入力するだけでも実行ファイルが作れます。
$ mv forclang.py forclang
として名前を変えておけば
$ forclang ftest.f
だけでいいです。
(コンパイラをインストールしたような気分)
Fortran プログラムと同じディレクトリーというしばりが嫌なら
a-Shell を起動した最初のディレクトリー( ~/Documents)の直下の
bin という名前のディレクトリーの中へ forclang を移動あるいはコピーしておけば
$ cp forclang bin/
カレントディレクトリーがどこであっても、
$ forclang ftest
と入力するだけで ftest.f をコンパイルできます。
注意
この f2c コマンドを使う方法でコンパイルできるのは
最新の自由形式の Fortran 95 などではなく、
桁位置に注意する必要のある形式の、
少し古い Fortran 77 で書いたプログラムです。
forclang.py のプログラムの解説
プログラムの内容について知っていただくために、各行の働きを解説します。
説明のために、各行の頭に行番号を付けたプログラムリストを載せておきます。
1: #! python
2: import os, sys
3: args = sys.argv
4: fname = args[1]
5: if fname[-2:] == ".f":
6: pname = fname[:-2]
7: else:
8: pname = fname
9: fname = pname + ".f"
10: comm = "f2c "+fname
11: os.system(comm)
12: comm = "clang " + pname + ".c" + " -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c"
13: os.system(comm)
14: comm = "mv a.out " + pname
15: os.system(comm)
各行の解説
各行について解説します。
1: いわゆるシバン(shebang)です。このファイルが Python のプログラムであることを宣言し、chmod +x で実行ファイルとして使えるようにします。
2: 必要な2つのモジュール os と sys をインポートします。
3: シェルから forclang.py に渡された引数を受け取ります。
4: 引数を Fortran のファイル名としておきます。
5: 引数の最後が .f で終わっていれば
6: 最後の .f を除いた部分をプログラム名とします。
7: そうでなければ
8: 引数をプログラム名と見なし、
9: 引数の末尾に .f を追加した文字列を Fortran のファイル名とします。
10: f2c のコマンド行を作成します "f2c 〈Fortran のファイル名〉"
11: f2c コマンドを実行します。
12: clang のコマンド行を作成します。"clang 〈プログラム名〉.c -D_WASI_EMULATED_……"
13: clang コマンドを実行します。
14: できた実行ファイル名を a.out から〈プログラム名〉に変更するコマンド行を作成します。
15: 実行ファイルの名前を変更します。
※コメント投稿者のブログIDはブログ作成者のみに通知されます