コーディングルール
複数人でプログラム開発を行うときには、ソースコード全体の統一を保って読みやすく管理しやすくするため、一定の共通のルールが求められる。以下に明文化した分は、プログラム開発者が共通に最低限守るべきものとする。
一行の行数
基本的に最大80字とする(Fortran標準)。 改行の際は行末と次の行の行頭に「&」をつける。 文字列の場合は適当な位置で文字列を区切り、「//」による文字列の結合を行う。
例. abc = “aaaaaaaaaa bbbbbbbbbbb cccccccccc ddddddddd eeeeeeeeee ” // & & “ffffffffff gggggggggg hhhhhhhhhhh iiiiiiiiii jjjjjjjjjj kkkkkkkkkkk”
また、一行に複数の文を書かないこと。
字下げ
2字ずつ字下げする。
コメント
コメントは「!!!」を使い、コメントアウトは「!」を使う。 ここで、コメントとは、それ自体に意味のあるもの、コメントアウトとはテスト等で一時的にコメント化しているものである。
大区切りは「!」を80文字続けたものを使う。 中、小区切りについては「!!!」で始めること以外は特に規定しない。
例 test = “テスト” !!! test に「テスト」を代入する。 !!! 80字を超える場合はこっちに。 !print *, test !!! テスト用の出力。 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! test2 = “テスト2” !!! 大区切りは上のような形で使用する。
プログラムを読みやすくメンテナンスしやすくするため、コメントは重要なプログラムの一部である。(コメントがないプログラムを扱うのは、暗号解読に近い労力を強いられる。) 基本的に自分が作成したプログラム中で、プログラム単位およびその中のプロシージャ―の機能と入出力変数、およびプログラム中で定義される主な変数の意味は、必ずコメントをつけて説明する。
宣言の明示化
すべてのプログラム単位には implicit none を書いて、変数・定数を明示的に宣言する。
実数
実数の宣言は REAL8で行い、real*8, real(8) 等は用いない。宣言されたREAL8の実数は、プリコンパイル命令 #include “define.h” により、プログラム共通の精度に統一的に書き換えられる。(現在の仕様では、倍精度実数 double precision に統一される。)
配列
変数宣言では配列サイズを
integer :: a(1:3)
の形で宣言し、
integer,dimension(1:3) :: aa integer :: aaa(3)
のような宣言は指定しない。
サイズの分からない配列は基本的に allocatable を使用する。
配列のアロケートや演算ではサイズを「(n:m)」 の形で指定し、無記載や「(:)」による省略を使用しない。
例
a(1:3) = b(1:3) + c(1:3)
文字列
character(len=80) により宣言し、character(80) やcharacter*80 の形は使用しない(Fortran標準)。
プログラム単位の引数属性
プログラム単位(サブルーチンや関数)の仮引数には、intent属性をつける。
intent(in) --- 入力のみ、 intent(out) --- 出力のみ、 intent(inout) --- 入出力両方。
なお、構造体の属性は intent(inout) とすること(そうしないと思わぬバグの原因となる。)。
モジュール
モジュールは1ファイル1モジュールとし、名前は 「ファイルの基幹名」+「_module」とする。
関数はすべてモジュール内関数とし、外部関数は使わない。
use 文を使用する際は基本的に only 節をつけ、どの変数 or 関数がどこに記載されているのかモジュール名からたどれるようにする。
commonモジュールの共通利用
commonモジュールに定義されている変数や手続き(10-2 またはcommon.docxを参照)は、プログラム全体にわたって共通性の高いもので、これらが必要なときには、新たに自分で定義せずにcommonの中のものを使うこと。
commonモジュールのように、共通性の高い機能をサブルーチン化することは、プログラムを読みやすく使いやすくするコツの一つである。mpiモジュールもその例で、mpiライブラリを生に使う代わりに、できれば用意されたラッパーのサブルーチンを使うこと。自分でcommonモジュール等を拡張することも推奨する。
出力
テスト用の一時的な出力は print 文、それ以外はwrite 文を用いる。
装置番号は common_module 内の newunit 関数により取得する。
エラー出力、warning 出力、ログ出力は出来る限り、common_module 内の該当関数を使用する。
入力
標準入力(リダイレクトを含む)からの入力は使用しない。
これは一般性はないが、FreeFlex中では共通ルールとする。読み込みファイルをrewindすることを想定しているため。
gitの利用
各人のプログラム開発の経過は、gitで共通化して管理する。git簡易マニュアル を参照のこと。
旧式の文法
古いFortranで用いられるgoto文、文番号等は使わない。(Gaussianなど昔からのコードでは使用されているので、読めることは必要である。)
テストプログラム
プリコンパイラ命令 #ifdef MAIN ~ #endif 中に単体テスト用のプログラムを作成することが望ましい。