FORTRAN77プログラムをF-BASICプログラムに変換する方法

小寺 富士, 杉本 敏司, 石川 俊英


Return

1 はじめに

 パソコンの性能は、年々向上してきているためセンターの大型計算機を使用せずとも通常の数値計算はかなりできるようになってきている。
 FORTRANのプログラム開発の歴史は古く、今までに基本的計算に必要とされるプログラムの膨大な蓄積がある。コンパイラが安く入手できれば、これを個人のパソコンで十分活用することができるが、未だ、比較的高価なためパソコンでこれらのプログラムを自分の計算目的に改変して計算するには、困難な状況にあると思われる。できれば、改めてプログラムを作成せずに少ない労力で、自分のパソコンでかなりの計算ができることを望んでいる人も多いと思う。そこで、WINDOWS上で動作して、従来からのBASIC資産をそのまま継承して価格も手頃な、富士通(株)のF-BASIC[1, 2](以後、FBとする)に我々は着目して、これを使用できるようにFORTRANプログラムをBASICに変換するファイルの開発を試みた。
 ファイル変換の研究は、古くから行われているが[3]、FORTRANからBASICへの変換は、今まで必要度が少ないためかインターネット上で調べても見つからなかった。 しかし、BASICプログラムも今までかなり多数作られており、変換したプログラムと他のBASICで書かれたプログラムとを併用すれば、かなりの分野の計算が楽にできるようになる。それには、FBとN88-BASICとの併用の可能性を文献[1]を参照することによって納得が得られる。
 BASICの一つの弱点と言われている所は、組み込み関数が少なすぎることと、複素数が扱えないことである。FORTRANにあるすべての機能を全部解決することは、我々の能力だけでは無理なので、今回は組み込み関数のみを対象にした。それでもFORTRANの組み込み関数に対応したものすべてを作成するには、かなりの数のものを作らなくてはならない。そこで必要度の高いものだけを作ることにした。BASICの良い点は、計算結果を直ちに図表化するのに便利なことであろう。もちろん、FORTRANにも図形化処理可能なソフトウエアもあるが[4]、誰にも簡単に利用できるとは言えない。

2 プログラム作成での留意点

 BASICプログラムは元々FORTRANをベースに開発されたものであるから、共通するコードもかなり含まれている。そのため、変換はそれほど複雑とは言えない。しかし、FORTRANプログラムは初期の頃のものと較べるとかなり進化してきている。いくつかの本[5 - 8]を調べてみて分かるように、必ずしも統一したコードでは書かれていない。同じ機能を持ったものでも、例えば、WRITE文一つ取り上げても使用形態が少しずつ異なっている。それらの変化したコマンドの使用形態に対応できるようにプログラム化を進めた。
 プログラム作成前にコンパイラーの仕組みを理解し、その手法を用いてプログラム化を進めることが重要だと思われた[9]。 両者の基本的な相違点は、FORMAT文の書き方にある。この部分の変換にかなりのステップ数を要した。EXTERNAL文は、FORTRAN独特の機能でこれをFBに変換するには、やや煩雑な手続きを必要とした。それでも完全なものを作成するのは、かなり困難であった。FBには、三角関数としてはSIN(),COS(),TAN(),ATN()の4種類しか用意されていない。そこで、COSH(),SINH()や、倍精度データに対応する関数はなかったので、これらに加えてDSIN(),DCOSH()などを新たに作成した。FBには、プログラムの頭のところでサブルーチンとファンクション文は、DECLARE文で宣言する必要があり、これをしないとエラーとなる。また、サブルーチン内の引数は、配列を含む変数を用いたときは、A()のようにカッコを挿入する必要がある。さらに、配列変数A()の型が倍精度の場合は、A#()のようなコードを挿入する必要が生じてくる。FORTRAN側で、これが明示されてない場合もあるから、そのときは単精度扱いと判断するようにした。FBへの変換のとき、グローバル変数は、プログラムの頭の部分で、COMMON SHARED宣言をする必要がある。配列変数でも同様にこれを宣言する。MicroSoft社のQuickBASICでは、この部分をDIM SHAREDと宣言しなければならないのと少し異なる。使用制限事項については、5項で述べる。

3 使用言語と機種性能

 使用言語:富士通 F-BASIC Ver.4.1
 機種 WINDOWS95/98対応機種

4 使用方法

  1.  我々の作成した組み込み関数のファイル、EXT_FUNC.BASは、予めライブラリーとして登録しておく。登録の仕方は、FBのマニュアルにしたがって行う。拡張組み込み関数のDSIN()等を特に使用しない場合は登録しなくてもよい。使用したい関数のみ切り取って自分のプログラムに連結して使う方法もある。
  2.  FBは、FORTRANのように先に翻訳してから実行させるコンパイラ方式になっているので、BASICのインタープリタ方式に慣れている人には、少し煩わしい所である。また、翻訳後、沢山のファイルが作られてくるためフロッピーに入りきらない事がある。そこで、変換ファイルのFORT_FB.BASをFBの中のディレクトリに\FBWIN41\TEMPを作成してその中にインストールしてから翻訳を開始するとよい。
  3.  ファイルの翻訳が終了したら実行ボタンを押す。最初に計算結果の出力先をスクリーンかプリンタか聞いてくるのでどちらかを選択する。次に、変換用ファイルの入っているフロッピーのドライブ番号を聞いてくるので、例えば、AドライブならAのように入力してリタンキーを押す。
  4.  次に、変換するファイル名を入力する。例えば、TEST.FORのように入力してリタンキーを押す。変換されたファイルは、自動的に拡張子にBASが付加されて、TEST.BASになる。 但し、変換用ファイルを予めハードデスクの適当なディレクトリーに格納しておく方が途中で打ち切りにならず安全である。そのときは、そのディレクトリー名もファイル名の前に付けること。例えば、\TEMP\TEST.FORのように入力する。
  5.  後は、自動的に変換を行ってくれるから終了するまで待つだけだが、FBの問題点は、ファイルの上書きができない点である。そのため$予めエラー処理を行っている。変換に失敗したファイルでもそのまま残しておいて、同じファイルを処理しても大丈夫である。
 参考のために、Figure 1に変換前のリスト(左側)と変換後のリスト(右側)図を示した。変換用のサンプルプログラムは、FORTRANは、¥F_SAMPLEの中に、BASICは、¥B_SAMPLEに10例程入れている。正確に変換されていないケースもこの中に含まれていて今後の解決課題として示した。例えば、TEST1.FORは、 WRITE文の種々のケースでの変換を試みたものである。しかし、ここに現れなかった特殊な例もあると思うので、それら総てが変換に成功するとは言えない。その他のテストサンプルについても確認してから自分のプログラムを変換してみるのが賢明である。サンプルプログラムの中で未整備な点は、ラベルナンバーがラインナンバー順に付けているため不連続になっているところである。気になる場合は後で変更するとよい。また、元のプログラムでDOループが深くなったとき、ラインに段差を付けているのもあるが、段差を付けるように整備されていないため、変換されたプログラムは少し見にくい。


Figure 1. Sample of file conversion; left is a source program, right is a converted one.

5 使用制限

 プログラム作成の出発時点では、変換は簡単にできると思っていたが、変換プログラムは、試行錯誤を繰り返す間にプログラムの長さが5000行を越えてもバグが取れない状態となった。したがって、どんなFORTRANプログラムにも対応できるほど、このファイル変換のレベルは高いとは言えない。そこで、種々の制限を設けているので注意して使う必要がある。
 前述したサンプルプログラムを参照すれば、自分のプログラムの変換が上手くいくかどうかの判断は一応できる。FORTRANプログラムでもメーカーの機種に依存した特殊なコマンドを使っている場合もあり、ケースバイケースでかなり異なってくるため比較表を作成しても簡単なケースのみでは参考にならないためここでは省略する。
  1.  複素数を扱うプログラムは現時点では変換できない。
  2.  IMPLICIT宣言文で注意すべき点は、次のようなケースである。
     IMPLICIT INTEGER (I- N)
     IMPLICIT REAL (A - H)
     IMPLICIT REAL (O - Z)
     のように、三種類に宣言を分けているが、このような場合は変換を途中で中止してしまうようにしている。従って、元のFORTRANプログラムを纏めて
     IMPLICIT INTEGER (I-N)
     IMPLICIT REAL (A-H),(O-Z)
     のように二行に宣言文を予め書き換えてから変換を行う。
     次に、IMPLICIT REAL (A-H),(O-Z)のみを宣言しているプログラムでサブルーチンの引数の変数に INTEGER型のものを使用するときは、IMPLICIT INTEGER(I - N)も宣言しておく。そうしないと誤変換してしまう。
  3.  配列変数の次元は二次元までしか扱えない。これは、通常の計算では、三次元以上のプログラムはあまり見かけないため、現在のところそこまで拡張していない。計算そのものは問題ないが、入出力方法が複雑になってしまうためである。
  4.  EXTERNAL文は、簡単なケースしかできない。メインとサブルーチンの両方の中で呼び出して使うようなことは現在のところ考慮していない。
  5.  組み込み関数はFBは基本的に4種類しか用意されていない。これを34種類までに拡張した。FORTRANのコード名と同じ名称を使用して混乱を避けた。
     そのリストを以下に掲げると、
     ASIN(X), ACOS(X), ACOT(X), ASINH(X), ACOSH(X), ATANH(X),AMAX1(X), AMIN1(X), ALOG10(X), SINH(X), COSH(X), TANH(X), COTH(X), DSIN(X), DCOS(X), DTAN(X), DASIN(X), DACOS(X), DATAN(X), DSINH(X), DCOSH(X), DTANH(X), DCOTH(X), DABS(X), DEXP(X), DFLOAT(X), DLOG(X), DLOG10(X), DSQRT(X), DMAX1(X), DMIN1(X), FLOAT(X), MAX0(X), MIN0(X) である。
  6.  拡張FORTRANで使用しているDO WHILE...ENDDOには対応しているが、そのほかのFORTRAN90やMS-FORTRANで新たに付加されたコードには、全く対応していない。
  7.  FORTRAN文を小文字で書いたプログラムは大文字に変換してから行っている。必要なければ、UCASE$をはずして使用する。但し、変換エラーの発生の確認は行っていない。
  8.  WRITE文のFORMATの項で制御コードを変数で代用しているものには対応していない。
     できない例)FORMA='I3,X2,I2'
                       WRITE(6,FORMA) I,J
     一部対応したケースとしてサンプルプログラムのTEST5.FORがある。しかし、FBにないような機能外のコードには、現在のところ全く対応させていない。
  9.  FORMAT文の1H1等の改頁コードも省資源の立場から対応させていない。
  10.  READ文はFORTRANでは、FORMAT文でデータの入力の規制はできるが、FBではFORMAT文は無視される。実際の例は、TEST2.FORの中に種々のケースを載せている。
  11.  サブルーチン内にDATA文があるときは、簡単なケースのみ対応させている。
     可能な例:DATA PAI/3.1415/ -> PAI=3.1415(TEST6.FOR)としている。
  12.  FBに変換後のサブルーチンの引数は全部グローバル変数になっている。
  13.  前にFBに変換したプログラムを他の目的に再使用するときは、サブルーチン内のラベル名が同じになるケースがでてくる恐れがあるので、そのときは手直しして使うこと。
  14.  EQUIVALENCE文とENTRY文も考慮されていない。メモリーの少なかった時代の遺産であるこのコマンドを使用しているときは、予め、元のプログラムを変更しておく。
  15.  拡張FORTRANでは、FUNCTION名を=の右側にも書くことができ和算等に使用しているが、BASICではこの機能は使えない。そこで、他の変数に変えて後で戻すようにしている。(参考:TEST4.FOR)
  16.  名前付きCOMMON文が使われている場合で注意しなければならない点は、メインとサブルーチン間で同じ名前のCOMMON文が使用されているときは、メインで定義したものと同じ変数名を使用するようにプログラムを変える必要がある。
     例)メイン:            COMMON NAM1/A,B(10)/NAM2/G,H のようなケースでは、
           サブルーチン内:COMMON NAM1/C,D(10)となっているとエラーとなる。そこで、
           サブルーチン内:COMMON NAM1/A,B(10)と書き換える。その中で使用されている変数名もCはAに変える必要がある。あるいは、メインで、予め変数AとB()の内容をCとD()にそれぞれ移しておくプログラムを挿入するかの何れかが必要になる。
  17.  拡張FORTRANでは、DATA文の中で配列変数を用いて、データの初期化を以下の例のようにプログラムを書くことができる。
     例)DIMENSION A(10)
           DATA A/10*1.0/
     変換ファイルで同じ処理を行うには、2行目を
           DATA (A(I),I=1,10)/10*1.0/
     と古いFORTRANプログラム形式に書き直さないとデータの初期化はできない。
     以上で述べたように、現在のところ数多くの変換に不適切な箇所が散見される状況にあるが、今後、さらに改良を進めていかねばならないと考えている。

6 F-BASICとQuickBasicとの相違点

 上記のソフトウエアをQuickBasic上でも動作させるようにするために、両者の違いについて若干述べたい。
 FBとMicrosoft社のQuickBASIC(QB)との相違点は、両社が提携して開発を行っているため使用コードの違いはそれ程大きいとは言えない。前者は、コードをさらに進化させたVisual BASICに近いものを用いている。
 FBは、コマンド類は小文字を使用している。従って、ここで作成した FORT_FB.BASを UCASE$コマンドで全部大文字に変えてやる。次に、サブルーチンを呼ぶときは、QBでは、CALL文を使用しているからCALLを挿入する。また、引数があるときは、括弧で両端を括ってやる必要がある。FBのLOCATE文は、(X,Y)座標表示であるが、QBでは、(Y,X)座標表示になっているのでこれを交換する必要がある。また、FBでは、GOTO文の行き先アドレスの先頭に従来の習慣で*が付いているのでQBでは、これを取ってやり、更に、後尾にコロンを付ける。GOTO文の行き先アドレスも同様に変える。FBのTRIM$コマンドは使用できない。QBでは、RTRIM$とLTRIM$の2回の操作を必要とする。
 ファイルの上書きは、QBでは可能であるが、FBではできないためファイルをオープンする前にKILLコマンドで不要なファイルを消去しているが、この箇所は不要なので消してもよい。
 その他、グローバル配列変数定義にFBではCOMMON文を使用しているが、QBは、これをDIM文に置き換えてやる。FBで多数使用している記号で _ は使用できない。QBでは、ピリオドと交換する等の処置をする。サブルーチンの中で括弧を使用している箇所や、コロンを使用している箇所が、何カ所かあるのでそこを修正すれば正常に動作するはずである。これ以上の詳細は、ここでは省略する。

7 おわりに

 どんなプログラムであれ、未発表のプログラムを開発するときは、一度で完全なものを作ることはなかなか難しい。このことは、一度経験したことのある人には理解して頂けると思う。今回、あえて発表するのもLINUXの例でも明らかなように、多くの人の批判に曝されて、早く改良が進められればよいと考えたからである。このプログラムの欠点や改良点をどんどんご指摘いただけることを期待している。

参考文献

[ 1] カンノコウキ, F-BASIC97プログラミングのすべて, 電波新聞社 (1998).
[ 2] 高城重道, 緒方正幸, WINDOWS BASICプログラミング(1), パワー社 (1998).
[ 3] John R.Wolberg, 岸 和孝訳, ソフトウエア変換ハンドブック, 啓学出版 (1988).
[ 4] 黒瀬能聿,松島勇雄,松尾俊彦, FORTRAN77による科学技術計算サブルーチンライブラリ, 啓学出版 (1988).
[ 5] 徳田 昭, FORTRAN77, 森北出版 (1989).
[ 6] 町田東一,小島紀男, FORTRAN応用数値計算, 東海大学出版 (1989).
[ 7] 小暮 仁, FORTRAN77の応用, 産業図書 (1992).
[ 8] 橋本英美, FORTRAN77プログラム入門, 技術評論社 (1992).
[ 9] 渡邊 坦, コンパイラーの仕組み, 朝倉書店 (1998).

Return