1.5.9 EXTERNAL文とINTRINSIC文

EXTERNAL文は, そこに指定された関数名が外部関数であることを宣言するものであり, INTRINSIC文は, そこに指定された関数名が組み込み関数であることを宣言するものである. これらは, 上記のように関数名をサブルーチンの実引数として使用する時に 必ず必要なものであるが, それ以外も重要な意味がある.

SINCOSのような組み込み関数は, FORTRAN規格によって処理系が用意しなければならないが, FORTRAN規格はさらに処理系が規格外の組み込み関数を用意することを許している. したがって, 各処理系はFORTRAN規格に定められた組み込み関数よりも多くの 組み込み関数を持っているのが普通である. そして当然のことながら, それら拡張された組み込み関数の名前に関しては, 処理系によって全く異なる. ということは, FORTRAN規格にない関数名で, EXTERNAL文やINTRINSIC文によって宣言されていない関数名は, 処理系によって組み込み関数として解釈されたり外部関数として解釈されたり することがある.

例えば, 自分で外部関数を定義して, それを引用しているつもりでも, たまたまその処理系が同名の組み込み関数を持っていた場合には, ユーザー定義の関数ではなく, 処理系が用意した関数が呼ばれてしまう可能性がある. 関数名の長さは6文字以内と制限されている上, 人間の発想も多様性に限りがあるので, この手の衝突は意外に多い. しかも, この種の原因でプログラムが暴走したりすると, その原因を突き止めるのはかなり難しい. (自分のプログラムそのものには全く誤りがないのだから)

そこで, 処理系に依存しないプログラムを書くためには, そのプログラム単位で引用している外部関数名は全て EXTERNAL文に指定することが望ましい. また, FORTRAN規格にない処理系固有の関数を引用している場合には, INTRINSIC文に指定すべきである.

なお, 当然のことながら, 電脳ライブラリが用意する関数は全て「外部関数」である. 処理系から見れば電脳ライブラリを含めて全て「ユーザープログラム」 であるから, 自分が書かなかったからといって組み込み関数と混同することのないように 注意されたい.