1. 導入:なぜモジュールとUSE文が重要なのか
数値計算の現場において、プログラムが大規模化すると「どの変数がどこで使われているか分からない」「共通変数の整合性が取れない」といった課題が頻発します。かつてのFortranではCOMMONブロックを用いてデータを共有していましたが、これはバグの温床となりやすく、現代のFortran開発では推奨されません。
そこで登場するのがモジュール(MODULE)とUSE文です。これらを活用することで、データと手続きを適切に「カプセル化」し、型安全かつ保守性の高いコードを実現できます。
2. 基礎知識:モジュールとUSE文の仕組み
モジュールとは、変数、定数、サブルーチン、関数などをひとまとめにして定義する「部品」のようなものです。
USE文は、その部品を別のプログラムユニットから読み込むための命令です。
カプセル化とは、モジュール内で変数の公開範囲を制御(PRIVATE/PUBLIC)することで、外部から直接触れられたくないデータを隠蔽する手法です。これにより、意図しないデータ書き換えを防ぐことができます。
3. 実装/解決策
モジュール化のステップは以下の通りです。
1. MODULE文で名前を定義し、変数を宣言する。
2. 必要に応じてPRIVATE属性を付与し、外部に公開すべきものだけをPUBLICにする。
3. 呼び出し側でUSE文を使ってモジュールをインポートする。
これにより、コンパイラが型チェックを自動で行うため、引数の不整合や型の食い違いをコンパイル時に検知できるようになります。
4. サンプルプログラム
物理定数や計算ロジックを別ファイル(または別セクション)として管理する例です。
! — モジュール定義 —
MODULE physics_mod
! 外部から直接変更させたくない変数はPRIVATEにする
IMPLICIT NONE
PRIVATE
! 公開する定数とサブルーチン
PUBLIC :: GRAVITY, calculate_free_fall
REAL, PARAMETER :: GRAVITY = 9.81 ! 重力加速度
CONTAINS
! 自由落下距離を計算する関数
FUNCTION calculate_free_fall(time) RESULT(distance)
REAL, INTENT(IN) :: time
REAL :: distance
distance = 0.5 GRAVITY time2
END FUNCTION calculate_free_fall
END MODULE physics_mod
! — メインプログラム —
PROGRAM main
USE physics_mod
IMPLICIT NONE
REAL :: t = 2.0
REAL :: result
! モジュール内の関数を呼び出し
result = calculate_free_fall(t)
PRINT , “落下距離:”, result, “m”
! PRINT , GRAVITY ! これはアクセス可能
END PROGRAM main
5. 応用・注意点
現場で役立つテクニックとして、ONLY句の活用があります。
例えば「USE physics_mod, ONLY: GRAVITY」と記述すれば、モジュール内の特定の要素のみをインポートできます。これにより、名前空間の汚染(意図しない変数名との衝突)を防ぎ、コードの可読性が大幅に向上します。
また、陥りやすいバグとして「循環参照」があります。AモジュールがBをUSEし、BモジュールがAをUSEするとコンパイルエラーになります。モジュール同士の依存関係は可能な限り一方向に整理し、階層構造を意識して設計することが、長期的なメンテナンスの秘訣です。

コメント