そもそも...
FORTRAN77 まで識別子(手続き、変数)の長さは、6文字以下の制限があった。
Fortran90で、その制限が撤廃されたと誤解されがちだが、実際は31文字以内に延長しただけ。
コンパイラベンダの親切心
FORTRAN77の時代から、7文字以上の識別子でコンパイルできるコンパイラは多い。
Fortran90でも、32文字以上の識別子でコンパイルできるコンパイラが多い。
識別子名の限界は、60文字程度
コンパイラ | バージョン | 文字数 |
---|---|---|
ifort | 17.0.1 | 63文字以内 |
gfortran | 4.8.5 | 63文字以内 |
gfortran | 7.3.0 | 62文字以内 |
どうすれば?
-std=f95
(gfortran) または -stdf90
(ifort) をつけてコンパイルすれば、
識別子が32を超えた時点で弾いてくれるので、安心。
シンボル名のルール
モジュール副プログラムのシンボル名は、モジュール名と手続き名を連結することが多い。
readelf -s --wide
コマンドで、確認できる。
コンパイラ | シンボル名の例 |
---|---|
ifort | ${module}_mp_${procedure} |
gfortran | __${module}_MOD_${procedure} |
※デバッグのときなど思い出すと◎
シンボル名に対する制限
ifortは、シンボル名が91文字を超えると警告を出して前方の文字を切り詰めて、91字以内にする。
シンボル名の連結で _mp_ が追加されるため、モジュール名+手続き名は87文字以内にする必要がある。
∴ 標準規格に従って、31文字以下の識別子を使えば、モジュール名+手続き名が62以下になるので気にしなくてよい。
gfortranではこのような制限は存在しない。
考察
ifortのシンボル名切り詰めは、モジュール名+手続き名の合計数に対して発生するもののようであり、
モジュール名を短くしても、手続き名を短くしても対応する事ができる。いくつかの戦略が考えられる。
-
長過ぎる手続き名が少しと、短い手続き名が大量にあるモジュールなら、モジュール名を変えずに
手続き名を短縮してはどうだろうか? -
モジュール名が長すぎると、どんな手続も制限にかかるので、モジュール名を短くするというのはどうだろうか?
まとめ
-
Fortran90の標準に従いましょう。
-
gfortranで50文字くらいのモジュール名と手続き名を使ったコードを開発していると、ifortに移行した場合に、シンボル名の切り詰めが発生するかもしれません。
-
ifortによる切り詰めはエラーでなく警告なので、無視してもよいですが、標準からの逸脱によるものなので、命名について再検討したほうがよいです。
他コンパイラの情報をお持ちの方がいらっしゃいましたら、提供していただきたいです。(バージョン番号もほしいです。)