LoginSignup
1
0

More than 3 years have passed since last update.

Fortranコンパイラのシンボル名制限

Last updated at Posted at 2019-05-08
1 / 6

そもそも...

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による切り詰めはエラーでなく警告なので、無視してもよいですが、標準からの逸脱によるものなので、命名について再検討したほうがよいです。

他コンパイラの情報をお持ちの方がいらっしゃいましたら、提供していただきたいです。(バージョン番号もほしいです。)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0