Fortran 95における廃止事項および廃止予定事項


 Fortran 95は本ページ作成時点においてFortranの最新規格です.これはISO/IEC 1539-1:1997(E)で規定されており,本ページもこれをベースに作成されています.本ページはFortran 90のマイナーバージョンアップであるFortran 95における廃止事項および廃止予定事項についてまとめたものです.

 間違いが無いようにチェックは行っているつもりですが,バグが入っている可能性が多分にございます.見つけられた方はお手数ですがメールにてご連絡いただけませんでしょうか.何卒よろしくお願いいたします(mOm).

2004年8月
吉田佳典


 廃止事項および廃止予定事項について

 まず最初に言っておきたいことは、廃止になる機能は決して使わない、そして廃止予定の機能についても絶対に使わないということです。理由は簡単,これらの機能を使用しているコードは将来、コンパイラを通らなくなるからです.新規にコードを書く場合はもちろんのこと,既存のコードの修正も早めに行いましょう! (「面倒臭い」は,理由として認められません)

 廃止になるというのは
それなりの理由があるからです.悪いことは言いません,今すぐコードを見直しましょう,


 廃止事項

 Fortran 95における廃止事項は以下の5項目です.絶対に使わないようにしましょう.

  1. 実数型 及び 倍精度実数型のDO変数
  2. IF構文の外部からEND IF文への飛越し
  3. PAUSE文
  4. ASSIGN文,割当て形GO TO文および文番号割当てによるFORMAT文の指定
  5. H形編集記述子

(1) 実数型 及び 倍精度実数型のDO変数

 【解説】

省略

(2) IF構文の外部からEND IF文への飛越し

 【解説】

省略

(3) PAUSE文

 【解説】

省略

(4) ASSIGN文,割当て形GO TO文および文番号割当てによるFORMAT文の指定

 【解説】

省略

(5) H形編集記述子

 【解説】

省略



 廃止予定事項

 廃止予定事項は下記の9項目です.確かにコンパイラは通るかも知れません.しかし,絶対に使わないようにしましょう.
 
これらはFortran 2003でも廃止予定事項として残るようです.つまり廃止されないということです…

  1. 算術IF文
  2. DO構文での端末文の共有及びEND DO文でもCONTINUE文でもない端末文
  3. 選択戻り
  4. 計算形GO TO文
  5. 文関数
  6. 実行文の間のDATA文
  7. 文字長引継ぎ文字関数
  8. 固定形式
  9. CHARACTER*の形の文字型宣言

(1) 算術IF文

 【対策】

 IF文 または IF構文を使って下さい.

 【解説】

 処理内容が直感的に掴みにくいが故に,コードの解読が困難および修正時にバグが入りやすいという問題があります.

(2) DO構文での端末文の共有及びEND DO文でもCONTINUE文でもない端末文

 【対策】

 多重ループでは面倒くさがらずに,一つのDO文に対して一つのEND DO文を用いること.あと,CONTINUEはもう使わないこと!

 【解説】

 端末文の共有は,ループ構造が分かりづらい,解読が困難およびプログラムを拡張する際にバグが入りやすい等の問題があります.具体的に下のようにちゃんと対応をとること.

DO I = 1, N
 
DO J = 1,M
 (処理)
 
END DO
END DO

また,END DOあるいはCONTINUEを用いないループ端末の使用は禁止です.

 DO 10 I = 1, 10
  DO 10 J = 1, 10
10 IVAR(I, J) = I + J

(3) 選択戻り

 【対策】

リターンコードを用いて,CASE構文にて実装するなどして下さい.

 【解説】

 文法上の統一性を著しく乱しており,なおかつ処理内容が直感的に掴みにくいが故にコードの解読が困難および修正時にバグが入りやすいという問題があります.
 
 選択戻りを用いたコードの例を下記に示します.

PROGRAM main
 IMPLICIT NONE
 CALL sub(
*10,*20,*30) ←subには仮引数はないのに実引数が存在するように見える
 PRINT *, 'Out of order'
 STOP
10 PRINT *, '1 was selected'
 STOP
20 PRINT *, '2 was selected'
 STOP
30 PRINT *, '3 was selected'
 STOP
END PROGRAM
!
SUBROUTINE sub()
 IMPLICIT NONE
 INTEGER::num
 PRINT *, 'Input a number(1-3)'
 READ(*,*) num
 
RETURN (num)  ←これが選択戻りの実装部分です
END SUBROUTINE

下記のようにリターンコードをもちいてCASE構文で書くようにして下さい.

PROGRAM main
 IMPLICIT NONE
 INTEGER::RETURN_CODE
 CALL sub(RETURN_CODE)
 
SELECT CASE(RETURN_CODE)  ←リターンコードによって処理を選択!
  CASE (1)
   PRINT *, '1 was selected'
  CASE (2)
   PRINT *, '2 was selected'
  CASE (3)
   PRINT *, '3 was selected'
  CASE DEFAULT
   PRINT *, 'Out of order'
 END SELECT
END PROGRAM
!
SUBROUTINE sub(RETURN_CODE)
 IMPLICIT NONE
 INTEGER::RETURN_CODE
 PRINT *, 'Input a number(1-3)'
 READ(*,*)
RETURN_CODE ←結果の状態をリターンコードで返す
 RETURN
END SUBROUTINE

(4) 計算形GO TO文

 【対策】

 CASE構文を使ってください.

 【解説】

 処理内容が直感的に掴みにくいが故に,コードの解読が困難および修正時にバグが入りやすいという問題があります.
 

(5) 文関数

 【対策】

 外部関数を定義するか,内部関数を使って下さい.

 【解説】

 代入文と見分けがつきにくいので,コードが読みづらくなってしまい,修正時の障害となります.
 ごく稀に初心者のコード中で,そのつもりはないのに,代入文がいつの間にか文関数定義文になってたり,その逆のになる場合があります.意味不明(笑)のエラーメッセージに悩まされ続ける場合,このケースも疑いましょう.

(6) 実行文の間のDATA文

 【対策】

 DATA文は前方にまとめて書きましょう!

 【解説】

 コードが読みやすくなり,DATA文を捜しまわる・見落とす・書き忘れるということが少なくなります.

(7) 文字長引継ぎ文字関数

 【対策】

(8) 固定形式

 【対策】 

やっとなくなるようです\(^_^)/.片っ端から自由形式に直して下さい!
えっ? 手作業でやるつもり???

 【解説】

 今まで残っていたのがおかしい.固定形式にまつわる歴史的経緯については…(以下略)

(9) CHARACTER*の形の文字型宣言

 【対策】

CHARACTER(LEN=長さ)::変数名リスト または
CHATACTER(長さ)::変数名等のリスト または
CHARACTER::変数名リスト を使ってください.

 【解説】

例えば

CHARACTER*10 C1, C2*5, C3*1
と書かれた時,C1,C2およびC3はそれぞれ長さ10,5,1の文字列変数となり,C2およびC3については結局*10は無視されます.だったら最初から

CHARACTER(LEN=10)::C1
CHARACTER(5)::C2
CHARACTER::C3
と書けば,コードは長くなるものの,読みやすくなりますね.


 最後に

 上記に挙げられた廃止対象事項は,?な文法に起因した項目がほとんどです.昔はソースレベルにおいて一行でも,また1文字でもコードを少なくしたかったという事情があったために,これらはやむなく導入されたものと思われます.しかし,現在はスクリーンエディタでコードを書くのはあたり前.多少長くなっても読みやすいコードを書くことが,メンテナンスの観点から非常に重要です.コードをゴミにしてしまわないためにも,早速アップデートを開始しましょう.


参考文献

1) Information technology-Programming languages-Fortran- Part 1:Base language, ISO/IEC1539-1, First edition, 1997-12-15.

2) プログラム言語Fortran ― 第1部:基底言語, JIS X 3001-1:1998 .

3) FORTRAN77入門 改訂版,浦昭二,培風館,1982


(c) 2004 Yoshinori Yoshida. All rights reserved.