2. スタイルルール¶
2.1. フリーフォーマット(自由形式)¶
7-72桁に文を書かなければならない等の制約がなくなり、それ以外の桁位置に書いた文字が無視されるなどの誤りを防ぐことができる。
2.2. 1ファイルには同名のプログラム単位1つを格納はしない¶
ソースコードが多くなるため1ファイル1プログラムはやらない。
2.3. 名前¶
いつも主プログラムは program 文ではじめること。また end 文としては “end program name” や “end subroutine name” 等の形を使用すること。
2.4. 継続記号¶
6文字目に何かしらの文字を入れる。
2.5. 字下げ(インデンテーション)¶
読みやすさのため、字下げすること。字下げとはプログラムの構造上ひとまとまりとなる文をそのほかの文に比べて数文字右側の桁位置から書き始めることである。 字下げを行う「まとまり」とはプログラム単位(subroutine)、引用使用宣言(interface)、実行部ブロック(do, if など)である。これらの終わり の文はすべて「end」で始まる文なので、「end まで字下げ」と覚えれば簡単である。 字下げされた範囲の中の注釈行も字下げすること。これによって、行頭の空白でない最初の桁位置を追うだけでプログラムのアルゴリズム構造が見出せるようになる。 継続行は開始行に対してさらに字下げすること。
2.6. 空白¶
読みやすさのため、名前と演算子など、字句の間に適切な空白を入れ、同じスタイルを一貫して用いること。英文タイプの句読法に従うのが望ましい。
- 演算子の前後に空白を入れる。ただし掛け算の場合は入れない。(例: 1 + 2*3)
- コンマ、コロン、セミコロンの後に空白を入れる。(例: a, b, c)
- 括弧類の内側に入れない。(例: array(index))
- またブロックではない一群の文は前後の文との間に空行を入れて区別すること。
- 空白は原則として1個とするが、似たような構成の代入文が連続するときに余分な空白をいれて等号の桁位置をそろえ、類似性を見比べやすくするなどしてもよい。
2.7. implicit none¶
すべてのプログラム単位の冒頭(use 文があるときはその直後) に implicit none文を書くことは必須である。そしてすべての変数・定数は明示的に宣言すること。これによって、宣言されていない名前を用いるとコンパイルエラーを起こすので、名前のつづり間違えによるバグを防ぐことができる。
2.8. 1行に複数の文を書かない¶
プログラムがわかりにくくなる。
2.9. 意味がわかる名称をつける¶
変数名やサブルーチン名は、その役割に基づいた名前をつけておくとプログラムを読む際にその意味や構造を把握しやすい。
2.10. 変数の宣言方法¶
FORTRAN 77 では型宣言文と属性を与えるための文 (SAVE, DATA, DIMENSION, PARAMETER, など) が別であったため、同じ名前の列を何度も書く必要があった。Fortran90では型宣言文で属性をすべて設定できるようになったため、すべての属性を型宣言文で指定すること。たとえば以下の3つのコードはまったく等価である。
昔ながらの書き方
INTEGER N
DIMENSION N(2)
SAVE N
DATA N / 400, 224
◎推奨する書き方
integer, save:: n(2) = (/400, 224/)
×推奨しない書き方
integer, save, dimension(2):: n = (/400, 224/)
上記例3行目のような、型宣言文のdimension属性は使わないこと。代わりに2行目のような書き方を用いること。
pointerの時はdimensionを付ける。
pointerはallocatableとする。
2.11. 引数の入出力特性¶
識別を容易にするためintent(in), intent(inout)をつける。例えばintent(in)がつけられた変数の値を変更する文が存在すると、コンパイル時にエラーが発生し、デバッグを助ける。 なお、手続のモジュール化または interfaceブロックによって引用仕様を明示することにより、さらにその恩恵を受けることが可能である。 intent(out)は付けない方がいい。
2.12. 入出力のフォーマット情報¶
文番号を伴ったformat文は禁止する。代わりに入出力文の fmt指定子に記述すること。
2.13. 配列表記¶
プログラムの行数が少なくなるので、可能であれば使用すること。配列か変数かの区別をつけて読みやすくするため、カッコ内に配列の形状を示すこと。
昔ながらの書き方
DIMENSION(N) X, Y
DO 300 I = 1, N
X(I) = Y(I)
300 CONTINUE
◎推奨する書き方
real:: x(n), y(n)
x(1:n) = y(1:n)
×推奨しない書き方
x(:) = y(:) または x = y
並列最適化コンパイラの動作を助け、バグを少なくするため、配列代入文の上下限指定は省略しないほうがよい。
2.14. 論理比較¶
従来の .GT., .GE., .EQ., .LT., .LE., .NE. の代わりにそれぞれ >, >=, ==, <, <=, /= を使用する。数学表記に近いこの新しい構文の方が意味がわかりやすい。
2.15. goto 文¶
goto文を使うとプログラムがわかりにくくなることが多い。Fortranに限らず、ほとんどのプログラムはループと条件分岐だけで書くことができ、そうすることが望ましいと考えられている(構造化プログラミング)。 FORTRAN77では固定長のループしか表現できないため GOTO文を用いる必要があったが、do のあとの繰り返し指定を省略すると無限ループを表し、ループの途中からの脱出は exit文で行えるようになったので、構造化プログラミング理論で用いられるすべてのループが GOTO文なしで書ける。