導入:なぜ今、無名COMMONを知る必要があるのか
数値計算の現場で、数十年前から稼働している大規模なFORTRANプログラムをメンテナンスする際、必ずと言っていいほど遭遇するのが「無名COMMON(Blank COMMON)」です。なぜこれが重要かというと、複数のプログラムユニット(メインとサブルーチンなど)間で巨大なメモリ領域を共有し、メモリ不足を回避するための「古くからの知恵」だからです。現代のプログラムではあまり見かけませんが、レガシーコードを読み解き、修正を加えるためには避けては通れない必須の知識です。
基礎知識:無名COMMONとは何か
通常、COMMONブロックには名前を付けますが、名前を省略してスラッシュで囲んだ部分を空にすると、それは「無名COMMON」となります。
最大の特徴は、プログラム実行中、常に特定のメモリ領域に確保され続ける「静的な性質」です。名前付きCOMMONと異なり、一度定義するとプログラム全体で同じ領域を共有します。これにより、引数として巨大な配列を何度も受け渡す必要がなくなり、計算速度やメモリ効率の面で有利に働きます。ただし、初期化(DATA文など)には制限がある点には注意が必要です。
実装:無名COMMONの使い方
実装は非常にシンプルです。COMMONと記述し、その直後に配列や変数を並べるだけです。重要なのは、共有したいすべてのサブルーチンで「同じ順序・同じ型・同じサイズ」で定義することです。この規則を守らないと、データがずれてしまい、計算結果が壊れる原因となります。
サンプルプログラム
以下のコードは、メインプログラムで確保した大きな作業用配列を、サブルーチン側で計算に利用する例です。
! メインプログラム
PROGRAM MAIN
! 1000個の要素を持つ無名COMMONを定義
COMMON / / WORK(1000)
! 配列に値を代入
WORK(1) = 10.0
! サブルーチンを呼び出し
CALL CALCULATE
STOP
END
! サブルーチン
SUBROUTINE CALCULATE
! メインと同じサイズ・型で定義(無名COMMON)
COMMON / / WORK(1000)
! メインで代入した値を利用
PRINT , '受け取った値:', WORK(1)
RETURN
END
応用・注意点:現場で陥りやすい罠
無名COMMONを扱う上で、最も注意すべきは「メモリの整合性」です。
1. 定義順序の厳守
サブルーチン側で変数の型や並び順を一つでも間違えると、コンパイラはエラーを出さずに、全く別のデータ領域を参照してしまいます。これは「サイレントエラー」と呼ばれ、非常にデバッグが困難です。
2. 初期化の制限
無名COMMON内の変数は、BLOCK DATAサブルーチンを使わない限り、DATA文で直接初期化することができません。基本的には、実行時にメインプログラムなどで値を代入して使うのがルールです。
3. 現代的な設計への移行
もしあなたがこれから新しいコードを書くのであれば、無名COMMONの使用は推奨されません。現代のプログラミングでは、モジュール(MODULE)を使用したデータの共有が一般的です。あくまで「既存の古いコードを動かすための技術」として理解し、無理に新しいプロジェクトで採用しないようにしましょう。

コメント