1 概要
nAG Fortranコンパイラ リリース 6.2はマイナーアップデートです。
本リリースでは新たなライセンスキーが必要です。(古いバージョンのものはご利用いただけません)
Kusariライセンス管理についての詳細はKLICENCE.txtをご参照下さい。
1.1 リリース 6.1との互換性
HPF(High Performance Fortran)の機能を用いるプログラム(例えばILEN組込み関数やHPF_LIBRARYモジュール)は本リリースよりサポートされません。既に廃止予定であったLinux x86-64の-abi=64オプションは削除されました。 今回削除されたこのABIは、リリース 5.1以前との互換性のために含まれていたもので、 64ビットのポインタを用いるものの、実体サイズ及び添字計算は32ビットというものでした。
HPFのサポート停止と廃止予定オプションの削除を除き、 nAG Fortranコンパイラ リリース6.2はリリース6.1と完全に互換性があります。
1.2 リリース 6.0との互換性
HPFのサポート停止と廃止予定オプションの削除を除き、 nAG Fortranコンパイラ リリース6.2はリリース6.0と完全に互換性があります。 例外として“パラメタ化構造型”の割付け配列を用いるプログラムは再コンパイルが必要です。 (これはモジュール変数と仮引数にのみ影響します)1.3 リリース 5.3.1, 5.3
HPFのサポート停止と廃止予定オプションの削除を除き、 nAG Fortranコンパイラ リリース 6.2はリリース 5.3.1と完全に互換性があります。 また、リリース 5.3と5.2とも互換性がありますが、 Windows版でモジュールもしくは手続きの名前が$ではじまるものについては再コンパイルが必要です。新機能である“パラメタ化構造型”を用いるプログラムは、 実行時の型がパラメタ化構造型になる可能性がある多相変数の割付け、 解放、初期化もしくはコピーを行う場合は、その部分について、 リリース 6.2でコンパイルする事が強く推奨されます。
1.4 リリース 5.1との互換性
nAG Fortranコンパイラ リリース 6.2は、nAGWare f95 Release 5.1 と以下の点を除き互換性があります。- HPFの機能を用いるプログラムはサポートされません。
- CLASSキーワードを用いるかもしくは拡張される型を持つプログラムもしくはライブラリは、 再コンパイルが必要です。
- Linux x86-64のリリース 5.1(製品コード NPL6A51NA)でコンパイルされた、 64ビットのプログラムとライブラリはバイナリ非互換であるので、再コンパイルが必要です。
1.5 それより前のリリースとの互換性
ここに示される以外について、 nAG Fortranコンパイラ リリース 6.1は、 nAGWare f90 リリース 2.1、2.1、 及びnAGWare f95 リリース from 1.0 から 5.0と互換性があります。リリース 5.1より以下の非互換性が存在します。
- ALLOCATE文とDEALLOCATEのSTAT=から戻される値が、 5.1より前のリリースと異なる場合があります。 これについての詳細はF90_STATモジュールのドキュメントをご参照下さい。
- 5.0で型拡張(EXTENDS属性)を用いるプログラムは再コンパイルが必要です。
- IEEEの無限及び非数の書式付き出力が変更されてFortran 2003に準拠するようになりました。
- 浮動小数点ゼロの並び出力がE書式からFortran 2003に準拠するようF書式に変更されました。
- 変数郡名(NAMELIST)の入力で、 i/oエラーもしくは書式エラーが発生した場合、 エラーが発生したレコードをスキップするようになりました。 この振る舞いは並び入力を含む全ての書式付き入力と同じです。
2 新機能の概要
リリース 6.2では、利用者定義入出力の追加でFortran 2003の再帰的な宣言関数が完全にサポートされました。 その他で主な新機能として、単一像の共配列(Fortran 2008)がサポートされました。
その他にもいくつかのFortran 2008の機能が追加されました。 また、古い拡張機能も追加されました。
実行時のエラー診断機能が更に強化されました。 その他マイナーな機能強化が行われました。
3 新しいFortran 2003の機能
-
宣言式で使われる関数が再帰的(RECURSIVE属性)であっても良くなりました。
例えば、以下の関数は、宣言式内でも利用可能となりました。
PURE INTEGER RECURSIVE FUNCTION factorial(n) RESULT(r) INTEGER,INTENT(IN) :: n IF (n>1) THEN r = n*factorial(n-1) ELSE r = 1 END IF END FUNCTION
宣言関数は、それ自身を呼び出した手続きを、呼び出してはいけない事に注意して下さい。 - 利用者定義入出力(構造型)が利用可能となりました。 詳細につきましては、Fortran 2003の言語ドキュメント、 もしくはテキスト等をご参照下さい。
4 Fortran 2008の新機能
-
共配列の文法及びセマンティクスが受け入れられ、その正確性がチェックされます。
共配列は“像”と呼ばれるプログラムのコピーが、
複数並列に実行されるSPMD(Single Program Multiple Data)プログラミングモデルの一部です。
nAG Fortranコンパイラの本リリースでは、実行は単一の像に限定されています。
(つまり並列実行は行われません)
共配列についての詳細は、Fortran 2008言語のドキュメントかもしくは書籍をご参照下さい。
- 組込みモジュールISO_C_BINDINGに、純粋照会関数のC_SIZEOFが追加されました。 この関数は相互運用可能な一つの引数(X)を受け付け、 記憶域の大きさをバイト単位で返します。(C言語のsizeof演算子相当) Xが配列の場合、その結果は(単一成分ではなく)配列全体の大きさとなります。 Xは大きさ引継ぎ配列であってはならない事に注意して下さい。
-
束縛ラベルを伴う外部手続きの名前は大域的ではなく局所的な識別子とみなされるようになりました。
これにより、以下のコードは標準に準拠している事になります。
SUBROUTINE sub() BIND(C,NAME='one') PRINT *,'one' END SUBROUTINE SUBROUTINE sub() BIND(C,NAME='two') PRINT *,'two' END SUBROUTINE PROGRAM test INTERFACE SUBROUTINE one() BIND(C) END SUBROUTINE SUBROUTINE two() BIND(C) END SUBROUTINE END INTERFACE CALL one CALL two END PROGRAM
- 内部手続きは、NAME=指定子が無い場合に限り、BIND(C)属性が許されています。 このような手続きはCと相互運用可能ですが、(NAME=''と指定したかのように)束縛ラベルを持ちません。
-
組込み関数MAXLOC及びMINLOCに省略可能な引数BACK(KIND引数の直後に位置する)が追加されました。
この引数はスカラで論理型です。
この引数が存在して値が.True.の場合で且つ一つ以上の成分が最大値(MAXLOCの場合)、
もしくは最小値(MINLOCの場合)を持つ場合、
返される配列成分インデックスは(最初ではなく)最後に見つかった成分のものとなります。
例)
MAXLOC( [ 5,1,5 ], BACK=.TRUE.)
配列[ 3 ]であり[ 1 ]ではありません。 -
SOURCE=句を持つALLOCATE文には複数の割付け対象が許されています。
source-exprは割付けされる全ての変数に代入されます。
例)
PROGRAM multi_alloc INTEGER,ALLOCATABLE :: x(:),y(:,:) ALLOCATE(x(3),y(2,4),SOURCE=42) PRINT *,x,y END PROGRAM
上記コードでは“42”が11回(xの3個の成分とyの8個の成分)出力されます。 source-exprが配列の場合全ての割付け対象は同じ形状でなければなりません。 -
これまで定数DO形並びのループ及び初期化DO形項目の添え字にかけられていた制限が緩和されました。
これらの制限は(他の場所では許される)組込み関数の使用を許しません。
例)
DATA (x(i),i=1,SIZE(x))/1,2,3,4,5,6,7,8,9,10/
上記が許されるようになりました。 -
VALUE属性を持つ仮引数は配列が許され、非定数もしくは、及び、1以外の長さのCHARACTER型が許されます。
(ALLOCATABLE属性もしくはPOINTER属性を持つ仮引数、
及び共配列は、依然として許されていません。)
これにより、実引数の複製が作られ、仮引数はその複製と接続されます。 仮引数への変更は実引数に影響を及ぼしません。 例)
PROGRAM value_example_2008 INTEGER :: a(3) = [ 1,2,3 ] CALL s('Hello?',a) PRINT '(7X,3I6)',a CONTAINS SUBROUTINE s(string,j) CHARACTER(*),VALUE :: string INTEGER,VALUE :: j(:) string(LEN(string):) = '!' j = j + 1 PRINT '(7X,A,3I6)',string,j END SUBROUTINE END PROGRAM
上記コードは以下を出力します。Hello! 2 3 4 1 2 3
5 Fortran 2018ドラフトの新機能
- ERROR STOP文及びSTOP文の式は、非定数が許されます。 しかし依然として、基本整数型、もしくは基本文字型のみが許されます。
-
ERROR STOP文及びSTOP文に省略可能なQUIET=指定子が追加されました。
この指定子の前にはカンマ、後ろには任意で停止コードが指定できます。
また論理式も受け付けます。実行時にTRUEの場合、
STOP(もしくはERROR STOP)はいかなるメッセージも出力せず、
また、シグナルを発するIEEE例外に関する情報も抑制されます。
例)
STOP 13, QUIET = .True.
上記は通常の‘STOP: 13’を表示しません。 ただ単に終了ステータスが13の通常終了となります。 ですので、例えば以下の2つ文が同じであると言う事になります。STOP, QUIET=.True. STOP 'message not output', QUIET=.TRUE.
-
組込みサブルーチンMOVE_ALLOCに、
省略可能な引数STATとERRMSGが追加されました。
STAT引数は十進4桁以上の整数型(つまり8bit整数型は利用不可)でなければならず、
サブルーチンの実行に成功した場合にはゼロが代入され、
それ以外はゼロ以外の値が代入されます。
引数ERRMSGは基本文字型でなければなりません。
STATが存在し、ゼロ以外の値が代入された場合、ERRMSGには説明文(存在する場合)が代入されます。
そうでない場合はERRMSGの値は保持されます。
例)
INTEGER,ALLOCATABLE :: x(:),y(:) INTEGER istat CHARACTER(80) emsg ... CALL MOVE_ALLOC(x,y,istat,emsg) IF (istat/=0) THEN PRINT *,'Unexpected error in MOVE_ALLOC: ',TRIM(emsg)
これらの引数の目的は、複数像の共配列の割付けと解放に関わるエラーを見つける事です。 (例えばSTAT_STOPPED_IMAGEやSTAT_FAILED_IMAGE) nAG Fortranコンパイラの本リリースでは、単一の像のみがサポートされているので、 STATには常にゼロが代入され、ERRMSGには何も代入されません。
6 その他の拡張
-
廃止予定の機能: 固定形式のD(debug)行
1列目が‘D’もしくは‘d’の行はD行と呼ばれます。 オプション-d_linesが指定されると、 このような行についてはDを空白で置き換えて解釈し、通常の行として取り扱います。 このオプションが指定されない場合には、このような行はDをCで置換て解釈し、 コメント行として取り扱われます。例えば以下のコードでは
SUBROUTINE TEST(N) INTEGER N D PRINT *,'TESTING N' ...
PRINT文は-d_linesを指定した場合のみコンパイル対象となります。継続行の最初の行がD行である場合、 継続される行もすべてD行でなければなりません。 同様に、最初の行がD行でない場合、継続される行もすべてD行であってはなりません。
D行はTAB書式を用いる事ができます。この場合、TABが空白に展開される際に (D文字が空白として解釈済なので)一つ少ない空白で展開されます。
-
廃止予定(“dusty deck”)拡張: 大きさの異なる名前付きCOMMONブロック
-dustyオプションで、同一ファイル内における異なる大きさの名前付きCOMMONブロックが許容されます。 これにより全てのCOMMONブロックの大きさが最大のものと同じサイズに調整されます。 別々にコンパイルされた異なる大きさのCOMMONブロックの場合の結果は不確定であることに注意して下さい。 特にCOMMONブロックがBLOCK DATA副プログラムでより小さなサイズで初期化された場合は注意が必要です。この機能を使用することは全く推奨されていません。 また、COMMONブロックがOpenMP THREADPRIVATEの場合は、 -dustyを用いた場合であっても、異なる大きさは許されません。
-
文字型以外でバイト長指定子をオーバーライドする場合、
“*(integer)”が許されます。
これまでは“*integer”のみが許されていました。
例)
REAL X*4, Y*(8)
バイト長指定子は削除予定の拡張です。 代わりに種別パラメタを用いるべきです。
7 追加の診断機能
-
実行時オプションshow_danglingは、
コンパイルオプション-C=danglingでコンパイルされたコードの、
ぶら下がりポインタの検出を有効にします。
実行時オプションは環境変数nAGFORTRAN_RUNTIME_OPTIONSにより管理されます。 show_danglingが指定された場合、ぶら下がりポインタが作成された場合、 他のものと再結合された場合、結合解除された場合、存在しなくなった場合に、 実行時エラーファイルにメッセージが生成されます。 例)
[file.f90, line 20: Dangling pointer P detected (number 1), associated at file.f90, line 18] [file.f90, line 7: Dangling pointer P (number 1) has been reassociated] [file.f90, line 9: Dangling pointer Q (number 2) has been nullified] [file.f90, line 21: Dangling pointer R (number 3) no longer exists]
ぶら下がりポインタ番号は、ぶら下がりポインタが検出される度にインクリメントされます。 ぶら下がりポインタ要素を持つ配列が存在しなくなった場合、 それぞれの成分のそれぞれのぶら下がりポインタ要素についてメッセージが生成されます。 しかし要素添え字は含まれず、その代わりに配列成分である事を示すために、 ‘(...)’が生成されます。 例)[file.f90, line 44: Dangling pointer X(...)%A (number 8) no longer exists]
- (DO文及び入出力DOにおける)DO指標変数が誤って変更される可能性がある場合に “疑問”の警告メッセージが生成されます。 これには、POINTER属性もしくはTARGET属性を持つ場合、 COMMONブロックに定義されている場合、EQUIVALENCEされている場合、 局所変数ではない場合でUSE文もしくは親結合によりアクセスされる場合が含まれます。
- 組込み関数もしくは組込み演算の結果がアンダーフローによりゼロになる場合に警告メッセージが生成されます。 これまではべき乗による場合のみこの警告が生成されました。
-
-C=doオプションの機能が拡張され、
親結合によるアクティブなDO指標変数の変更がチェックされます。
以下にこのオプションを用いる例を示します。
Program example Do i=1,10 Call inner Print *,i End Do Contains Subroutine inner i = 999 End Subroutine End Program
上記コードは以下の出力をします。Runtime Error: example.f90, line 8: Assignment to active DO index I Program terminated by fatal error
-
文字定数書式のREAD文での使用、
もしくは文字列編集記述子を持つFORMAT文での使用がコンパイル時に検出されるようになりました。
例)
Read 1,n 1 Format("Oops",I10)
上記コードはコンパイル時にエラーとなります。 - 入出力装置番号が64ビット整数の場合で、 且つ負の値やHUGE(0_int32)よりも大きな値などの無効な値の場合、 より確実に検出されます。 負の値は常にIOERR_BAD_UNITとなり、 範囲外の正の値は存在しない装置として扱われ、従ってIOERR_BAD_UNIT(CLOSE、INQUIRE、ID=指定子を伴わないWAITはこの限りではない)となります。
-
新しいオプション-C=aliasは仮引数の別名化に関する診断を有効にします。
特にスカラ仮引数への代入がチェックされ、これが他のスカラ仮引数に影響を与えるかどうか調査されます。
そして影響を与える場合には実行時エラーとなります。
例えばsub.f90が以下の様であった場合で-C=aliasオプションを用いてコンパイルされた場合
Subroutine sub(a,b) a = 1 b = 2 End Subroutine Program test Call sub(x,x) Print *,x End Program
実行時に以下が出力されます。Runtime Error: sub.f90, line 2: Assignment to A affects dummy argument B Program terminated by fatal error
このオプションは-C=allオプションに含まれますが、 -Cオプションには含まれません。 この理由として、今後このオプションが拡張されて、 配列の場合のチェックを行う事になった場合に、 パフォーマンス面で大きなインパクトがあると考えられるためです。
- 範囲外の値の代入(例えば大きな倍精度の値を単精度の変数に代入する場合等)が行われる場合、 コンパイル時に警告が生成されるようになりました。
- 単連続ではない実引数に対応する仮引数が単連続ポインタの場合にエラーが出力されるようになりました。
- IMPORTを試みる前にUSEの結合で記号をアクセスする場合に、より良いエラーメッセージが生成されるようになりました。
8 その他の拡張
-
引用仕様宣言の生成機能(“nagfor =interfaces”)で、
USE文を標準化された形式で(それぞれの引用仕様宣言に必須の要素のみをONLY句でインポートし、不必要なモジュールは省略する)出力するようになりました。
例)
Subroutine s(n, x) Use iso_fortran_env Integer (int32) :: n Real (real64) :: x(n) Print *, compiler_options() x = 42._real64 End Subroutine
上記を与えた場合、以下が生成されます。Module interfaces ! Interface module generated on ... Interface Subroutine s(n, x) Use, Intrinsic :: iso_fortran_env, Only: int32, real64 Integer (int32) :: n Real (real64) :: x(n) End Subroutine End Interface End Module
- コールグラフの出力(“nagfor =callgraph”)において、 入力ソース内に、オプショナルではない仮引数に対応する実引数が無い場合、 それが示されるようになりました。
- ソース整形機能(“nagfor =polish”)及び依存関係解析機能(“nagfor =depend”)で、 -maxcontin=オプションが利用できるようになりました。 これにより255行を超える継続行も利用できるようになりました。
- ソース整形の設定オプションのデフォルトの-name_scopes=Insertが-name_scopes=Keywordsに変更されました。
-
新たなソース整形オプション-dcolon_in_decls=Xが追加されました。
このオプションは宣言文で省略可能な二連コロンを制御します。
Xは以下のいずれかです。
‘Asis’は何も行わず、‘Insert’は省略可能な二連コロンを(既にない場合)挿入し、
‘Remove’は省略可能な二連コロンを削除します。
例えば以下のコードが与えられた場合
Real x Real :: y Real, Save :: z
-dcolon_in_decls=Insertは以下を生成します。Real :: x Real :: y Real, Save :: z
また-dcolon_in_decls=Removeは以下を生成します。Real x Real y Real, Save :: z
-
新たに、拡張ソース整形ツールが追加され、コンパイル可能なファイルに対して、
高度な処理を行えるようになりました。
オプションは以下の通りです。
- -add_arg_keywords
- 明示的な引用仕様を持ち、且つ2つ以上の仮引数を持つユーザ定義の手続き、
及び3つ以上の仮引数を持つ組込みモジュール手続き(例外:MAX及びMIN)の参照において、
実引数にキーワードを追加します。
文番号引数が後に続く引数にはキーワードは追加されません。 引数の順序は変更されません。
- -add_arg_keywords=proc_class_list
- it{proc_class_list}で示される一連の手続きで、
手続きが明示的な引用仕様宣言を持つ場合に、
手続き参照における実引数にキーワードを追加します。
it{proc_class_list}はカンマ区切りで、以下を含める事ができます。
all (一連の全ての手続き), bound (実体結合手続き、及び型結合手続き), dummy (仮手続き), external (外部手続き), internal (内部手続), intrinsic (組込み手続き及び組込みモジュール手続き), module (非組込みモジュール手続き), user (組込み手続きと組込みもジュール手続き以外の手続き). 文番号引数が後に続く引数にはキーワードは追加されません。 引数の順序は変更されません。 手続きポインタ成分は“実体結合手続き”としても知られていて、 -add_arg_keywords=boundに含まれます。 名前付き手続きポインタは外部手続きとして取り扱われます。 従って-add_arg_keywords=externalに含まれます。
サブオプションの名前にはゼロではない数字一文字を付加できます。 例)“intrinsic3” このサブオプションによって、指定された数以上の仮引数をもつ手続きについてのみ、 キーワードが追加されます。 型結合手続き及び実体結合手続きの場合、 渡される実体の仮引数はこの数に含まれません。(引数並びに出現しないので) 組込み関数MAX及びMINは代わりに実引数の数を用います。
サブオプション名+数字一文字に続いて‘a’が続く場合(“intrinsic3a”等)、 引数の制限は、手続き参照における実引数の数に対して適用されるのであって、 仮引数の数に対してではありません。(実引数の数は、省略可能な引数が省略された場合、 仮引数の数より小さくなります)
サブオプションは左から右へ解釈されるので、 後から指定したサブオプションが、 先に指定されたサブオプションを上書きする事に注意して下さい。
- -intrinsic_case=analogy
- 組込み手続き名の大文字小文字種別を、 他の名前(as_names)と同じにするか、 もしくは言語キーワード(as_keywords)と同じにするかを指定します。 デフォルトは-intrinsic_case=as_namesです。
- -remove_intrinsic_stmts
- 実引数として渡されなかった組込み手続き名を INTRINSIC文から削除します。 またその際に、全てのINTRINSIC文がこのように削除された場合、 INTRINSIC文そのものも削除します。 INTRINSIC文に関連するコメントは削除されません。
- 精度の一元化ツールが強化され、より精度良くEQUIVALENCE文の解析を行うようになりました。 これにより、警告メッセージの有用性が向上しました。
- 同じ型と種別の単連続配列に、 文字型以外の組込み型のスカラ値を代入する場合のパフォーマンスが、多くの場合において向上します。
-
新たに-kind=uniqueオプションが追加され、
全ての組込み型の種別番号を一意にする事ができるようになりました。
ただし実数型と複素数型は例外で同じ種別番号を持ちます。
これにより、ある型の種別番号を誤って別の型の種別番号として用いた場合にコンパイルエラーとなります。
例)
Integer,Parameter :: rkind = Selected_Real_Kind(15) Integer,Parameter :: ikind = Selected_Int_Kind(9) Real(rkind) :: x Integer(rkind) :: n
上記コードは‘Integer(rkind)’文でエラーとなります。 -
新たに-Warn=classオプションが追加され、
以下に示すclassに基づき、追加の警告メッセージが生成されるようになりました。
- allocation
- 組込み代入において、 代入される側の変数(もしくは部分成分)の割付けを発生させる可能性がある場合に警告します。
- constant_coindexing
- 像選択子が定数共添え字を持つ場合に警告します。
- reallocation
- 組込み代入において、 代入される側の割付け済変数(もしくは部分成分)の再割付けを発生させる可能性がある場合に警告します。
- subnormal
- 通常の演算対象を持つ組込み演算もしくは関数の結果が非正規化数なる場合に警告します。 (精度の減少、TINY(...)よりも小さい)
再割付けは、配列の形状、無指定型パラメタ、 もしくは動的な型(多相的の場合)が、 変数(もしくは部分成分)同士と式(もしくは対応する部分成分)同士が異なるの場合のみ行われます。 割付は、変数もしくは部分成分)が代入の実行前までに割付けられていない場合にも行われます。 (例外:ブロードキャスト代入) 従って、-Warn=allocationは-Warn=reallocationを包含します。
例)
Subroutine s(x,y) Integer,Allocatable :: x,y(:) x = 123 y = [ 1,2,3 ] End Subroutine
上記コードで、両方の代入が割付けを伴います。(-Warn=allocationで警告が発せられます) しかしyへの代入の場合のみ再割付けが有りえます。 (その場合-Warn=reallocationで警告が発せられます) -
PARAMETER宣言の変換エラーでより正確な行番号が示されるようになりました。
これまでは、これらのエラーは、パラメタの宣言に関しては発せられず、
パラメタの利用に関してのみ発せられました。
同様に、変数の初期化においてのエラーは、行番号を伴わずに発せられる事がありましたが、
今では初期化が行われた行が示されます。
例)
Program bad Use Iso_Fortran_Env Integer(int8),Parameter :: x = 1000 Print *,x End Program
上記で、Xの変換エラーは(4行目ではなく)3行目で起きることが示されます。更に、このような状況で、浮動小数点定数値を整数に変換する際にオーバーフローが発生した場合、 警告ではなくエラーとして取り扱われるようになりました。 (-dustyを指定すると、これまでと同じ振る舞いとなります。) 例)
Subroutine s Integer :: x = 1d300 x = x + 1 Print *,x End Subroutine
上記コードで、変換オーバーフローが2行目にあると示されます。 -
fppプリプロセッサが処理を行わない部分にある、認識されないディレクティブを許容するようになりました。
例えばファイル“test.ff90”が以下の内容であった場合であっても、
エラーを発すること無く、問題なくコンパイルされるようになり、実行時には‘ok’と出力されます。
Program test #if 0 #unknown directive #endif Print *,'ok' End Program
- 完全なコンパイラマニュアルがHTML(html/manual/compiler.html)で利用可能になりました。