1 イントロダクション
nAG Fortranコンパイラ リリース5.3には コンパイラの機能向上とFortran 2003及びFortran 2008の言語機能の追加が含まれます。
リリース5.1とリリース5.2のライセンスキーはリリース5.3では利用できません。 ライセンスキー取得の詳細はnAGにお問い合わせ下さい。
KUSARIライセンス管理についての詳細はKLICENCE.txtをご参照下さい。
1.1 リリース5.2との互換性
nAG Fortranコンパイラ リリース5.3はリリース5.2と完全に互換性を保っています。1.2 リリース5.1との互換性
nAG Fortranコンパイラ リリース5.2はnAGWarae f95 リリース5.1と以下の点を除き互換性を保っています。- キーワードCLASSを利用するかもしくは型拡張を行うプログラムおよびライブラリは再コンパイルが必要です。
- NPL6A51NA及びNPMI651NAで生成されたバイナリと、-abi=64オプション(デフォルト)で生成されたバイナリは非互換ですので、すべてのプログラム及びライブラリの再コンパイルが必要です。
1.3 それ以前のリリースとの互換性
明記されている場合を除いてnAG Fortranコンパイラ リリース5.3はnAGWare f90 リリース2.1及びリリース2.2と互換性があります。 また以下に示す場合を除き nAGWare f95 Release1.0から5.0とも互換性があります。以下の非互換性はリリース5.1で導入されました。
- STAT=、ALLOCATE、DEALLOCATEから返される値は 5.1より前のリリースと異なる場合があります。 詳細についてはF90_STATモジュールドキュメントをご参照下さい。
- 5.0で型拡張(EXTENDS属性)を使うプログラムは再コンパイルが必要です。
- IEEEのNaNの書式付き出力が変更されてFortran 2003に準拠するようになりました。
- 浮動小数ゼロの並び出力はFortran 2003の要求に基づいてE書式ではなくF書式を使用するようになりました。
- NAMELISLT入力の過程で遭遇した入出力もしくは書式エラーは誤りのあるレコードをスキップするように変更されました。この挙動は並びを含む他の書式付き入力動作と共通になります。
1.4 新機能
リリース5.3はOpenMP 3.0 (-openmpオプションの指定が必要)をサポートし、 Fortran 2003とFortran 2008の多くの機能をサポートします。本リリースでパフォーマンスの向上の他、他のマイナーな機能向上もはかられています。 またいくつかのプログラミングツールもコンパイラに統合されました。
2 OpenMP 3.0のサポート
良く利用されるOpenMP 3.0の機能がサポートされました。 下記のリリース5.3でサポートされる指示文を示します。
実行指示文 | サポート状況 |
PARALLEL | COPYIN句以外全てサポート |
DO | COLLAPSE、LASTPRIVATE、ORDERED以外全てサポート |
SECTIONS | LASTPRIVATE以外全てサポート |
SINGLE | 全てサポート |
MASTER | 全てサポート |
WORKSHARE | 未サポート |
PARALLEL DO | PARALLEL、DOで示されているもの以外全てサポート |
PARALLEL SECTIONS | 全てサポート |
PARALLEL WORKSHARE | 未サポート |
TASK | 未サポート |
MASTER | 全てサポート |
CRITICAL | 全てサポート |
BARRIER | 全てサポート |
TASKWAIT | 未サポート |
ATOMIC | 全てサポート |
FLUSH | 全てサポート |
ORDERED | 未サポート |
データ指示文/句 | サポート状況 |
THREADPRIVATE | 未サポート |
DEFAULT | 全てサポート |
SHARED | 全てサポート |
PRIVATE | 全てサポート |
FIRSTPRIVATE | PARALLEL指示文にてサポート |
LASTPRIVATE | 未サポート |
REDUCTION | 全てサポート |
COPYIN | 未サポート |
COPYPRIVATE | 未サポート |
OpenMP標準のセクション3.2の手続き(以下)は全てサポートされています。
omp_set_num_threads,omp_get_num_threads,omp_get_max_threads,omp_get_thread_num,omp_get_num_procs,
omp_in_parallel,omp_set_dynamic,omp_get_dynamic,omp_set_nested,omp_get_nested,omp_set_schedule,
omp_get_schedule,omp_get_thread_limit,omp_set_max_active_levels,omp_get_max_active_levels,get_level,
omp_get_ancestor_thread_num,omp_get_team_size,omp_get_active_level
OpenMP標準のセクション3.3のlock手続きはこのリリースではサポートされていません。
OpenMP標準のセクション3.4の時間計測ルーチン(以下)はサポートされています。
omp_get_wtime、omp_get_wtick
全てのOpenMP環境変数はサポートされています。
IEEE算術サポートモジュールを利用する場合、 IEEEモジュール(丸め、停止、アンダーフロー)は PARALLEL構文の最初にOpenMPスレッドにも伝搬されます。 またOpenMPスレッドにより設定されたIEEEフラグは PARALLEL構文の最後で親スレッドに返されます。
3 Fortran 2003の機能
- FINALサブルーチンが追加され、ユーザ定義の最終化が行えるようになりました。
- 構造体構築子の成分選択にキーワードが利用できるようになり、基本初期化が行われる成分では省略が可能となりました。 キーワードを利用して(個々の継承成分に対してではなく)親成分全体(もしくは他の先祖成分)に値を提供できるようになりました。
- 構造体構築子が総称関数でオーバーロードできるようになりました。
- 組込関数EXTENDS_TYPE_OF
- 組込関数SAME_TYPE_AS
- INQUIRE文でEXIST=,NAMED=,OPENED=,PENDING=指定子にどの種別のLOGICAL変数でも指定できるようになりました。
- 型パラメータ問い合わせの組込関数%KINDと%LENが追加されました。 これらは変数特定子に適用可能です。 variable%KINDの形式とKIND(variable)は同じです。 またvariable%LENはLEN(variable)とほぼ同じですが 問い合わせ形式の方は組込関数名が利用可能でない場合でも使う事ができます。 更に%LENの形式はその長さを表すことができる種別で値を返します。 (デフォルト整数型で返されるとは限りません)
- 全ての組込関数が定数表現で利用可能となりました。
- ISO 10646 4バイト文字セットがフルにサポートされるようになりました。 組込関数SELECTED_CHAR_KIND('ISO_10646')により種別が返されます。 ISO 10646は4バイト文字セットに加え2バイトのサブセット(UCS-2)も定義しているため、 組込関数SELECTED_CHAR_KINDはこの文字セットの'UCS_4'も認識します。
- ISO 10646のファイルエンコーディングであるUTF-8がサポートされました。 利用するにはENCODING='UTF-8'としてファイルをオープンして下さい。 この際どのような種別の文字であってもUTF-8ファイルの入出力が可能です。
- 組込モジュールISO_FORTRAN_ENVに整数定数IOSTAT_INQUIRE_INTERNAL_UNITが追加されました。 今後のnAG Fortranコンパイラのリリースで定義された入出力(defined I/O)がサポートされます。 その際にはIOSTAT_INQUIRE_INTERNAL_UNITの値が IOSTAT=エラー値(内部ファイルとの子データ転送文でINQUIREより返される)を識別します。
4 Fortran 2008の機能
-
BLOCK構築子が追加されました。
この構築子は実行可能コード内で要素の宣言を可能とします。
例)Do i=1,n Block Real tmp tmp = a(i)**3 If (tmp>b(i)) b(i) = tmp End Block End Do
ここで変数tmpの有効範囲はこのBLOCK内に限られ、それ以外に影響を及ぼしません。 BLOCK構築子はINCLUDEによりコードをインクルードする場合やマクロ処理に特に有用です。COMMON,EQUIVALENCE,IMPLICIT,INTENT,NAMELIST,OPTIONAL,VALUE 及び文関数定義以外の全ての宣言がBLOCK構築子内で許されています。 BLOCK構築子はネストすることができます。他の構築子と同様に外部からBLOCK構築子内への分岐は許されていません。
- 構造体構築子内で、割付可能な成分の値は省略することができます。 省略するとNULL()を指定した事と同じ意味となります。
- STOP文で、stop-codeが整数型もしくは基本文字型のどのようなスカラ定数式も指定できるようになりました。 (この変更はPAUSE文にも適用されていますが、現在ではPAUSE文はFortran標準ではなくなっています)
- -f2008オプションが指定されている際にENTRY文は削除予定機能として扱われます。
- 組込モジュールISO_FORTRAN_ENVにはスカラ整数定数INT8,INT16,INT32,INT64,REAL32,REAL64,REAL128が追加されました。 これらは指定ビットサイズの整数と実数の種別型パラメータ値を提供します。
- 組込モジュールISO_FORTRAN_ENVに配列の名前付き定数 CHARACTER_KINDS,INTEGER_KINDS,LOGICAL_KINDS,REAL_KINDSが追加されました。 これらは利用可能な種別型パラメータ値を列挙します。
- CONTAINS文の後に空の内部副プログラム部分、モジュール副プログラム部分、 及び型束縛手続部分の記述が許されるようになりました。 型束縛手続部分の場合では(特に効果のない)PRIVATE文が (指定する必要のない)CONTAINS文の後に許されるようになりました。
-
型束縛手続宣言文が複数の型束縛手続を宣言できるようになりました。
例)PROCEDURE,NOPASS :: a PROCEDURE,NOPASS :: b=>x PROCEDURE,NOPASS :: c
は以下のように書くことができます。PROCEDURE,NOPASS :: a, b=>x, c
-
NEWUNIT=指定子がOPEN文に追加されました。
これにより他の論理装置番号と重ならない新しい特別な装置番号(負の値)を割り付けることができるようになりました。
例)INTEGER unit OPEN(FILE='output.log',FORM='FORMATTED',NEWUNIT=unit) WRITE(unit,*) 'Logfile opened.'
NEWUNIT=指定子はFILE=指定子を指定した場合か、 もしくはSTATUS=指定子に'SCRATCH'を指定した場合にのみ利用可能です。 -
要素別組込関数BGE,BGT,BLE,BLTが追加されました。
これらはビットワイズの(つまり符号なしの)比較を行います。
またこれらの関数は2つの整数型(異なる種別であっても良い)の引数I、
Jを持ち、基本論理型を返します。
例えばBGE(INT(Z'FF',INT8),128)は真となり、 INT(Z'FF',INT8)>=128は偽となります。
- 配列集計組込関数IALL,IANY,IPARITYが追加されました。 これらはSUM及びPRODUCTと似た動作をし、 SUM及びPRODUCTがそれぞれ+もしくは*演算により集計を行うのに対して IALL,IANY,IPARITYはそれぞれIAND,IOR,IEORにより集計を行います。 つまりそれぞれの要素がビットワイズの論理積、論理和、排他的論理和により集計されます。 IANYとIPARITYで集計対象要素が一つもない場合の結果はゼロとなります。 またIALLではNOT(zero)となります。
- 要素別組込関数LEADZとTRAILZが追加されました。 これらは整数型(どの種別でも良い)の引数Iの左側の0のビット数、及び右側の0のビット数を返します。 結果は基本整数型です。
- 要素別組込関数MASKLとMASKRが追加されました。 これらは左寄せもしくは右寄せされたビットマスクを生成します。 MASKL(I,KIND)の値は指定された種別の整数で、左側Iビットが1に設定され、残りのビットは0に設定されます。Iは負ではない値で且つ結果のビットサイズ以下でなければなりません。 KINDが省略された場合、結果は基本整数型となります。 MASKRもほぼ同様ですが右側のIビットが1に指定されます。
- 配列集計組込関数PARITYが追加されました。 この関数はALL及びANYと同じような振る舞いをしますが.AND.もしくは.OR.演算を行う代わりに.NEQV.演算で集計を行います。 つまり集計要素の.TRUE.の数が奇数であった場合その結果は.TRUE.となります。
- 要素別組込関数POPCNTとPOPPARが追加されました。 POPCNT(I)は整数引数Iで1に設定されているビット数を返します。 POPPAR(I)はIで1に設定されたビットの数が奇数の場合1をそうでない場合は0を返します。 結果は基本整数型です。
-
Fortran 2008のルールが総称解決と総称内手続きのあいまいさの判断に使われるようになりました。
このルールでは:
- 仮手続は仮引数と区別が可能です。
- ALLOCATABLE仮変数はINTENT(IN)を持つPOINTER仮変数と区別可能です。
5 パフォーマンスの向上
- 組込関数ACHARとCHARが場合によっては(特に配列に対する場合と式の中に含まれる場合に)より速くなりました。
- 組込関数ADJUSTL,ADJUSTR,LEN_TRIM,TRIMは多くの場合に、より速くなりました。
- 組込関数MAXLOC及びMINLOCが文字列の場合により速くなりました。
- 組込関数MERGEが場合によっては(特に選択されないソース式の計算に時間がかかる場合に)より速くなりました。
- 組込関数SPREADが連続配列で、より速くなりました。
- 組込関数TRANSPOSEが大きな配列(特にキャッシュにおさまりきらないようなサイズ)で、より速くなりました。
- 寸法が可変の配列構築子の評価がより速くなりました。(特に多くの成分を持つ場合や implied-DOの構造が複雑な場合)
- -thread_safeが指定された場合のメモリー確保が、より速くなりました。
- 多くの場合において文字の代入がより速くなりました。
6 追加された診断機能
- 重複部分配列代入で組込代入文の左辺がベクトル添字部分配列で、 ベクトル添字に重複がある場合の検出が行われるようになりました。ベクトルが定数の場合はコンパイル時に、 また-C=arrayオプションを指定した場合には実行時に検出されます。
- ポインタの使用法に関して、コンパイル時により多くの誤りを検出するようになりました。
- IEEE_SET_ROUNDING_MODEは誤ったROUND_VALUE引数を検出するようになりました。 IEEE_VALUEは誤ったCLASS引数を検出するようになりました。
- 要素別サブルーチンの形状不一致の検出の信頼性が高まりました。
- 組込関数の形状不一致をコンパイル時に検出するようになりました。
7 その他の機能拡張
- 組込モジュールISO_C_BINDINGが-C=undefinedオプションを指定した場合でも利用できるようになりました。 (このオプションはABIをCと非互換なものに変更しますが、Fortranプログラムでは問題なく利用できます。)
- IEEE算術をサポートする標準組込モジュール IEEE_ARITHMETIC,IEEE_EXCEPTIONS,IEEE_FEATURESが-C=undefinedオプションを指定した場合でも利用可能となりました。
- nAG 組込モジュールF90_GCとF90_PRECONN_IOが-C=undefinedオプションを指定した場合でも利用可能となりました。
- POSIXをサポートするnAG組込モジュール F90_UNIX_DIR,F90_UNIX_DIRENT,F90_UNIX_ENV,F90_UNIX_ERRNO,F90_UNIX_FILE,F90_UNIX_IO,F90_UNIX_PROC, F90_UNIXが-C=undefinedオプションを指定した場合でも利用可能となりました。
- INTENT(IN)ポインタの誤った利用に関して、より詳細なエラーメッセージを出力するようになりました。
- STOPもしくはEXITが原因で繰り返しができないDOループに関して警告を出力するようになりました。
- より多くの実行時エラーに関して、-gオプションを指定した場合にエラーの発生場所(行番号)の情報が得られるようになりました。
- Windows x64環境で-abi=64オプション及び-abi=32オプションを指定して 64ビットプログラムもしくは32ビットプログラムの生成が行えるようになりました。
- -C=recursionオプションが-thread_safeオプションと共に指定できるようになりました。
- -no_underflow_warningオプションが追加されました。 このリンク時オプションは通常実行時に発生する浮動小数点アンダーフローを抑止します。
- OPEN文にCONVERT=指定子が追加されました。 指定可能な値は'BIG_ENDIAN','BIG_DOUBLEDOUBLE','BIG_IEEE','BIG_NATIVE','BIG_ENDIAN', 'BIG_DOUBLEDOUBLE', 'BIG_IEEE', 'BIG_NATIVE', 'NATIVE'です。 この指定は書式なしファイルでのみ行うことができ、実行時のエンディアンとファイル形式の変換が行えます。 変換は環境変数により実現させることも可能です。 FORT_CONVERTn(ここでnは変換対象となるファイルの装置番号です)は OPEN文のCONVERT=指定子より優先されます。 -convert=オプションはCONVERT=を指定しない装置や環境変数で指定されていない装置の デフォルトの変換モードの指定も行えます。
- Windows x64,x86-64 Linux,Apple Intel Macで アンダーフローの管理にIEEE_SET_UNDERFLOW_MODE (及びIEEE_GET_UNDERFLOW_MODE)が利用できるようになりました。
- 値が設定されたものの参照されない変数に関して警告メッセージが出力されるようになりました。 この警告は-w=unreffedオプションで抑止することが可能です。
- 改行コードCRLF(DOS/Windows形式)のファイルがUnixもしくはLinuxでも書式付きファイルとして読めるようになりました。
- JIS X 0213:2004日本語文字セットがサポートされるようになりました。 組込関数SELECTED_CHAR_KIND('JIS_0213')で種別が返されます。 この文字セットは‘Shift-JIS’とも呼ばれるため、 組込関数SELECTED_CHAR_KINDは'SHIFT_JIS'も識別します。
- 2バイトユニコード文字セット(UCS-2)がサポートされました。 組込関数SELECTED_CHAR_KIND('UCS_2')で種別が返されます。
- Shift-JISファイルエンコーディングがサポートされました。 この機能を使うにはファイルをENCODING='SHIFT_JIS'でオープンして下さい。 いかなる種別の文字でもShift-JISファイルへの出力もしくはShift-JISファイルからの読み込みが行えます。 ISO-8859-1,UCS-2,UCS-4を出力の際にShift-JISで表現できない文字がある場合には'?'で置き換えられます。 同様にISO-8859-1,UCS-2,UCS-4変数へ読み込む場合に、表現できない文字は'?'(ISO-8859-1の場合) もしくはCHAR(INT(Z'fffd'),KIND(variable))(UCS-2、UCS-4の場合)でそれぞれ置き換えられます。
- F90_KINDモジュールに日本語、ユニコード USC-2、ISO 10646 UCS-4の種別選択のための 名前付き定数JIS,UCS2,UCS4が追加されました。
- 新たに書込み権限のみのファイルへの出力がサポートされました。 書込み権限のみのファイルが POSITION='ASIS'もしくはPOSITION=指定子無しでOPENされた場合、 ファイル位置は終端に設定されます。 (通常の場合の動作はこれとは異なりファイル位置は先頭に設定されます。) ファイル位置の変更が可能な場合にはREWIND文でファイル位置を先頭に設定することも可能ですが BACKSPACE文は動作しません。
- INQUIRE文がより正確な情報を伝達するようになりました。 (特に(接続された場合もそうでない場合も)SIZE=,READ=,READWRITE=,WRITE=指定子)
- 整数定数表現の最大値より1大きい値に負の単項演算子を付けた指定を受け付けるようになりました。 例えば式-128_1(本来であれば-127_1-1_1と書くもの)を受け付けるようになりました。
- BIND(C)手続きがELEMENTALであっても良くなりました。 この場合、このような手続きへの参照は配列要素順に行われます。
8 プログラミングツールの統合
3つのソフトウエアツールがnAGコンパイラシステムに統合されました。
- コールグラフ生成 — (オプショナルでインデックスと呼び出し元テーブルを含む)コールグラフの生成を行います
- 依存関係解析 — モジュールもしくはINCLUDEファイルの依存関係を ‘make’形式、英語短文、ビルドリストのいずれかの形式で出力します。
- ポリッシュ — Fortranのソースコードの整形を行います。オプショナルで文番号の付け替えや DO文のブロックDO形式への変換を行います。
9 その他
- Linux,Mac,Unixシステムで-gオプションを指定しても upsf95用のデバッグ情報を生成しなくなりました。(同デバッガを利用しなくなったため) これらのシステムでは-gオプションはそのままCコンパイラへ渡されます。
- 新たなオプション-max_parameter_size=Nが追加され、 名前付き定数(PARAMETER)の最大サイズの指定が(MB単位で)コンパイル時に行えるようになりました。 名前付き定数のサイズ制限は誤って想定外に大きいサイズの定数を作成してしまう事を防ぎます。 デフォルトの最大サイズは50 MBです。
- 古い-f77オプションの名前が変更になり -compatibleとなりました。 これにより名前がより正確に実際の動作(他のコンパイラとのABIの互換性)を表すようになり、 -f77オプションがFortran標準のレベルを表す-f95,-f2003,-f2008オプションに 関連するオプションとして間違えられる可能性を低くしました。
10 新しいFortran標準
ここで説明された拡張でFortran 2003及びFortran 2008の標準に関するものを、 書籍「Modern Fortran Explained - by Metcalf, Reid & Cohen, Oxford University Press, 2011 printing (ISBN 978-0-19-960142-4)」のセクション番号と共に下記に示します。
- セクション番号
- 機能
- 13.3
- 型パラメータ問い合わせ(%KIND 及び %LEN)
- 14.8
- 最終サブルーチン
- 14.10
- EXTENDS_TYPE_OFとSAME_TYPE_AS
- 15.3
- 構造体構築子キーワードとオーバーロード
- 15.10
- 定数式における組込関数
- 17.13
- INQUIRE文のLOGICAL変数種別
- 20.1.3
- より良くなった型束縛手続宣言文
- 20.1.4
- 構造体構築子における割付値の省略
- 20.1.6
- STOP文の変更
- 20.5.7
- 総称の解決方法の変更
- 20.7.2
- NEWUNIT=指定子
- 20.10.1
- 新たな組込関数BGE,BGT,BLE,BLT
- 20.10.3
- 新たな組込関数IALL,IANY,IPARITY
- 20.10.4
- 新たな組込関数LEADZ,POPCNT,POPPAR,TRAILZ
- 20.10.5
- 新たな組込関数MASKL,MASKR
- 20.10.7
- 新たな組込関数SHIFTA,SHIFTL,SHIFTR
- 20.11.5
- 新たな組込関数PARITY
- 20.12.2
- ISO_FORTRAN_ENV内の良く使われる種別の名前
- 20.12.3
- ISO_FORTRAN_ENV内の種別の配列
- B.10.2
- 重複するCONTAINS文
- C.2
- 削除予定のENTRY文