|
|
新たにコードを書くのなら迷うことなくFortran 95(以下F95)で書くべきです.これは,「コードは最新の規格で書くべき」と言う意味です.この文章を書いている間にもFortran 2003の規格発表が秒読み段階に入っており,F95も陳腐化することは言うまでもありません. |
||
CONTENTS STEP1
STEP2
STEP3
STEP4
STEP5
STEP6
|
|
【このSTEPのポイント】 自由形式を使用する
【期待される効果】 コードが見やすくなる
● 一行にたくさん書ける!
→ 気兼ねなくインデントできる!
→ コメントが書きやすい!
コードが書きやすくなる
● 文番号位置,継続行記号位置指定の撤廃!
→ 6文字スペースとの決別!
バグの削減
● 誤作動を防ぐことができる!
■ 固定形式がもたらす特有のエラー
コードを作成する上で発生する最も多いミスは,言うまでもなくタイプミスです.これは例えばスペルミスという形で現れます.これらは丹念にコードをチェックすれば視覚的に見つかるものですし(エディタのカラーリング機能を使えばさらに分かりやすい),修正も簡単です.厄介なのは全角空白の混入などの見えないミス(これもエディタの不可視文字表示機能等で見つけることができますね)ですが,これらはFortranに限らず他の言語にも共通に起こり得ます.
しかしF77の場合は,特有の固定形式というルールがあるためさらに注意が必要です.固定形式の概略は下記の通り.
固定形式の概略 行について
一行は最大72文字以内.
コメント行について
"C"または"*"で開始する行.
文番号について
行の1桁目(左端)から5桁目に記述.
文の継続について
継続行がある場合,2行目以降は6桁目に空白以外の文字を置く.
文番号および継続文の記述について着目しましょう.記述が許されている桁数が規定されているので,これを必ず守らねばなりません.1文字でもずれると誤りとなります.文番号については桁を指定しなくたって構文解析で容易に判断できるであろうと考えられますが,几帳面に規定されています.また継続文については特に注意が必要で,1文字ずれるだけでエラーどころか誤作動してしまう可能性もあります.これはプログラム変更時のコピペ等で特に注意が必要となってくることを意味しています.これらはパンチカードでコード入力をしていたころの名残りであると考えられ,今日の開発環境からすればナンセンスこの上ありません.
さらに,1行に許される文字数についてみてみましょう.はっきり言って,72桁というのはすぐに使い切ってしまいます.特に多重ループや入り組んだIF構文等で,インデントが深くなると顕著です.また,文番号や継続行を示す記号が一文字でも桁範囲を越えるとたちまちエラーとなり,その記号によっては誤作動を招きます.見た目が悪くなるので複数行に継続させたくないという気持ちが働き,インデントを抑制し,変数名を短くし,挙げ句の果てにはかえって見にくくなおかつメンテしづらいコードが出来上がってしまいます.また,72文字を意識しながら(数えながら)コードを書くのはなんとも精神衛生上良くないという問題を抱えています.
■ 自由形式がもたらす恩恵
F90以降で(ようやく)採用された自由形式は,上記の問題を大きく改善してくれます.自由形式の概略を下記に示します.
自由形式の概略 行について
・一行は最大132文字以内.
コメント行について
・感嘆符"!"で開始する行または完全な空白行(改行のみまたは空白+改行).
・行の途中に"!"があらわれた場合,これ以降から行末までがコメントと見なされる.文の分割について
・セミコロン";"によって,一行に複数の文を書くことができる.
文の継続について
・行の最後に"&"がある場合,文は次行へと継続する.
・コメント中の"&"は無視される.
1行に許される文字数が132文字に拡大されたことは大変喜ばしいことです.17インチ以上のモニタが極々当たり前である今日では非常にリーズナブルであります.またコメントを文中に記述することができるようになり,例えば変数宣言文の文末にその意味を示すことができます.さらに,短い一連の処理等をセミコロンでコンパクトに一行にまとめることもできる仕様になっています.何よりも固定形式における文番号および継続文記述の桁指定に関するルールが廃止されており行の継続も簡単に行え,コードが非常に書きやすくなっていることが分かります.つまり自由形式の導入によって,コードにおける変更・追加やコピペに非常に強くなります.これからは,積極的に自由形式を取り入れましょう!
あと,一つのプログラム単位中での固定形式と自由形式の混合は許されませんので注意して下さい.
■ じゃあどうしたら良いのか???
ソースコードの変換を全て手作業でやるのは無理ですのでツールで自動的に行いましょう.例えばAlan Miller氏が開発したto_f90は下記のサイトから入手できます.ただし,誤作動することがあるので注意が必要です.http://www.csit.fsu.edu/~burkardt/f_src/to_f90/to_f90.html実はこのツールを使うと,後述のSTEP4,5も終わってしまいます.
【具体的な方法】 コードを自由形式に変換する
|
|
【このSTEPのポイント】 IMPLICIT NONEを使用する
【期待される効果】 バグの削減・発見が容易
● コンパイル時にミスタイプを発見
コードが見やすくなる
● 変数の型を簡単に確認できる
■ エラーが出ないという恐怖
下記のコードをエディタにコピーして保存し,コンパイルしてみて下さい.何の問題も無くコンパイルされると思います.none.f90
PROGRAM Main
INTEGER :: IXXXIX, I
IXXXIX = 0
DO I = 1, 10
IXXXlX = IXXXIX + 1
END DO
PRINT *, IXXXIX
END PROGRAM
コンパイルしたら実行してみましょう.どのような結果となるでしょうか???
none.f90 実行結果
0
「あれれれ? 10と表示されるはずでは?」と思った方は安心して下さい,極めて正常です.原因は分かりますか? もうお気付きかと思いますが,ここで2行目にIMPLICIT NONEと入れて再度コンパイルしてみて下さい.そうですINTEGERの前の行です.さて結果は?
none.f90 修正版
PROGRAM Main
IMPLICIT NONE
INTEGER :: IXXXIX, I
IXXXIX = 0
DO I = 1, 10
IXXXlX = IXXXIX + 1
END DO
PRINT *, IXXXIX
END PROGRAM
今度は下記のようなエラーが出ました.
エラーメッセージの一例
cf90-113 f90fe: ERROR MAIN, File = none.f90, Line = 6, Column = 1
IMPLICIT NONE is specified in the local scope, therefore an explicit type must be specified for data object "IXXXLX".エラーメッセージは「6行目にエラーあり.IMPLICIT NONEが宣言されているので,IXXXLXという変数は明示的に宣言されなければならない.」と言っています.あれ,そんなIXXXLXなんていう変数を見た覚えは無いぞ,と思いきや実は6行目の左辺はIXXXIXではなく,「IXXXLX」(実際には小文字のL)とタイプミスが含まれているのでした…
非常に簡単な例でしたが,これは暗黙の型宣言の弊害をよく説明しています.この種のバグは実に頻繁に入り,しかも駆除に困難を極め,時間を浪費してしまいます.問題はエラーメッセージも表示されず,(結果はおかしいが)ちゃんと動いてしまう点にあります.このような事態を未然に防ぐことができるのであれば,やらない手はありません.
■ IMPLICIT NONE とは?
IMPLICIT NONEは「暗黙の型宣言を使用しません」という宣言文です.これをプログラム単位の先頭部分に入れることによって,暗黙の型宣言が一切認められなくなります.つまり,明示的に型宣言されていない変数が存在する場合にはエラーとなります.ですから例のように,タイプミスを含む変数名が現れたとたんにコンパイラがきちんと教えてくれるのです.
反面,変数を全ていちいち宣言してやらねばならない,ということになりますので「面倒臭い」という声が聞こえてきそうです.しかし,これだけの労力(大したことは無いと思いますが…)で問題を避けられるのならば是非にやってみるべきです!
【具体的な方法】 各プログラム単位の先頭にIMPLICIT NONEを置く
|
|
【F77ユーザーへ】
※F77における「英字名」という用語は廃止され,F90から「名前 (name)」となりました.
【このSTEPのポイント】 分かりやすい変数名をつける
【期待される効果】 コードが見やすくなる
● 変数名からその役割がすぐに理解できる!
■ 未来の自分は他人 |
【具体的な方法】 宣言文における変数名を分かりやすいものに変更,あとはコピペで修正!
|
|
【このSTEPのポイント】 END DOを使う
【期待される効果】 コードが見やすくなる
● 実行速度の改善(最適化)に寄与する場合もある
コードが書きやすくなる
● 文番号の重複を考える必要が無くなる
↑ そもそも文番号を使う必要がない,コピペに強い!
■ プログラムの流れを明快に |
【具体的な方法】 END DOでループを閉じ,CONTINUE文を使わないようにする
|
|
【このSTEPのポイント】 MODULE & USEを使う
【期待される効果】 コード変更に強くなる
● 大域変数の追加が容易
バグの削減
● ONLY句の併用で大域変数の誤用を防ぐ
■ COMMONの弊害 |
【具体的な方法】 INTENTで仮引数の属性を縛る
|
|
【このSTEPのポイント】 INTENTを使う
【期待される効果】 コードが見やすくなる
● 仮引数の働きを明示する
バグの削減
● 副プログラム処理における実引数の破壊を防ぐ
■ 思った結果が得られない |
【具体的な方法】 INTENTで仮引数の属性を縛る
最後に 参考文献 1) Information technology-Programming
languages-Fortran- Part 1:Base language, ISO/IEC1539-1,
First edition, 1997-12-15. 2) プログラム言語Fortran ― 第1部:基底言語,
JIS X 3001-1:1998 . 3) FORTRAN77入門 改訂版,浦昭二,培風館,1982
上記のステップを踏むことによるわずかな労力で,F95への移行とコード改善とが同時に実現されます.これによって更なるF95学習のきっかけとなれば言うことありません.ぜひご検討いただき,お試しください.