nAG Fortranコンパイラ リリース 5.3.2 リリースノート
1 イントロダクション
nAG Fortranコンパイラ リリース 5.3.2 はマイナーなアップデートです。
リリース 5.3.2はリリース5.3.1と同様、リリース 5.3と同じライセンスキーで利用が可能ですので、5.3を既にご利用のお客様は新たなライセンスキーを取得する必要はありません。
Kusariライセンス管理についての詳細はKLICENCE.txtをご参照下さい。
1.1 リリース 5.3.1、5.3、5.2との互換性
nAG Fortranコンパイラ リリース 5.3.2はリリース5.3.1と完全に互換性があります。 また以下の点を除きリリース 5.3及び5.2と完全に互換性を保っています。 Windows版の場合でモジュールもしくは手続の名前がダラーサイン($)で始まる場合に再コンパイルが必要です。1.2 リリース 5.1との互換性
nAG Fortranコンパイラ リリース5.3.2はnAGWarae f95 リリース5.1と以下の点を除き互換性を保っています。- キーワードCLASSを利用するかもしくは型拡張を行うプログラムおよびライブラリは再コンパイルが必要です。
- NPL6A51NA及びNPMI651NAで生成されたバイナリと、-abi=64オプション(デフォルト)で生成されたバイナリは非互換ですので、すべてのプログラム及びライブラリの再コンパイルが必要です。
1.3 それ以前のリリースとの互換性
明記されている場合を除いてnAG Fortranコンパイラ リリース5.3.2は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.2はOpenMPの機能今まで以上にサポートします。 その他にエラー診断の機能が改善されました。2 OpenMP 3.0サポート
2.1 5.3.1からの変更
追加でサポートされたOpenMP 3.0の機能は以下のとおりです。:- REDUCTION 変数が連続配列でも良くなりました。
- TASK 指示句がサポートされました。
- TASKWAIT 指示文がサポートされました。
- TASKYIELD 指示句がサポートされました。
OpenMP 3.1 の機能である、ポインタの FIRSTPRIVATE データ共有がサポートされました。
OMP_LIBモジュールのOpenMPライブラリルーチンが組込みモジュール手続きになりました。 これにより制限はあるものの他のFortranコンパイラと本コンパイラのOpenMPの機能の混在が可能となりました。
非OpenMPのスレッドが存在する場合においてもOpenMP並列が機能するようになりました。
システムによってはOpenMP Barrierにおけるオペレーティングシステムのオーバーヘッドが軽減されます。
2.2 OpenMPサポート
以下にOpenMP 3.0機能のサポート状況を示します。
| 実行指示文 | サポート状況 |
| PARALLEL | 全てサポート |
| DO | 全てサポート |
| SECTIONS | 全てサポート |
| SINGLE | 全てサポート |
| MASTER | 全てサポート |
| WORKSHARE | 未サポート |
| PARALLEL DO | 全てサポート |
| PARALLEL SECTIONS | 全てサポート |
| PARALLEL WORKSHARE | 未サポート |
| TASK | 全てサポート |
| CRITICAL | 全てサポート |
| BARRIER | 全てサポート |
| TASKWAIT | 未サポート |
| ATOMIC | 全てサポート |
| FLUSH | 全てサポート |
| ORDERED | 全てサポート |
| データ指示文/句 | サポート状況 |
| THREADPRIVATE | 変数についてサポートされている |
| DEFAULT | 全てサポート |
| SHARED | 全てサポート |
| PRIVATE | 全てサポート |
| FIRSTPRIVATE | 全てサポート |
| 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手続き(以下)がサポートされています。 omp_destroy_lock, omp_destroy_nest_lock, omp_init_lock, omp_init_nest_lock, omp_set_lock, omp_set_nest_lock, omp_try_set_lock, omp_try_set_nest_lock, omp_unset_lock , omp_unset_nest_lock
OpenMP標準のセクション3.4の時間計測ルーチン(以下)がサポートされています。 omp_get_wtime, omp_get_wtick 全てのOpenMP環境変数はサポートされています。
IEEE算術サポートモジュールを利用する場合、 IEEEモジュール(丸め、停止、アンダーフロー)はPARALLEL構文の最初にOpenMPスレッドにも伝搬されます。 またOpenMPスレッドにより設定されたIEEEフラグは PARALLEL構文の最後で親スレッドに返されます。
3 追加のエラー診断
- 書式無し直接アクセスファイルでWRITEを行う際のバッファオーバーフローが検出されるようになりました。
- 仮手続きで CLASS(T) 引数があるにも関わらず CLASS(*) を渡した場合(もしくはその逆の場合)、 コンパイル時に検出されるようになりました。
- CLASS(*) 引数を伴う手続きポインタ代入を CLASS(T) の手続きポインタに対して行った場合(もしくはその逆を行った場合)、 コンパイル時に検出されるようになりました。
- 大きさ引き継ぎの結果(つまりCHARACTER(*))を持つ要素別処理関数がコンパイル時に検出されるようになりました。
- 文字列書式内のネストされないformat-item-listが実行時に検出されるようになりました。
- コンパチブルではない2つの属性(例えば ALLOCATABLE と EXTERNAL 属性)を与えた場合の検出信頼性が増しました。
- 手続きポインタへの無効な参照の検出信頼性が増しました。
- 同じ名前を持つ名前付き構文(例えば DO、IF-THEN) で、 一つが BLOCK 構文内にあり、もう一つが外側にある場合にエラーとして検出されるようになりました。
4 その他の改善点
- 書式付きシーケンシャルファイルの最大レコード長のデフォルト値が1024バイトから65536バイトに変更されました。
- 環境変数 OMP_NUM_THREADS が設定されていない場合のデフォルト値が、マシンのプロセッサ数(コア数)に変更されました。
- 多相 (CLASS) 変数と未定義変数の検出 (-C=undefinedオプション) における非整合性を取り除きました。
- -i8 オプションが追加されました。 このオプションは、基本整数型及び基本論理型を32ビットから64ビットに変更します。 (REAL、COMPLEX、DOUBLE PRECISIONは変更されません) これにより EQUIVALENCE と COMMON が Fortran標準に準拠しなくなる点に注意して下さい。 しかしながらこのオプションにより、より簡単に32ビット引数を持つライブラリと64ビット引数を持つライブラリを同様のインタフェースで呼び出す事ができます。
- -mtrace=all オプションにおいてより多くの領域解放が行番号情報を含むようになりました。
5 Release 5.3.1リリースノートのサマリー
本セクションではリリース5.3.1と5.3の違いを説明します。
5.1 OpenMPのサポート
(5.3.1で新たにサポートされた) OpenMP 3.0 の機能:- COLLAPSE 指示句がサポートされました。
- COPYIN 指示句がサポートされました。
- COPYPRIVATE 指示句がサポートされました。
- LASTPRIVATE 指示句がサポートされました。
- ORDERED 指示句がサポートされました。
- THREADPRIVATE変数のTHREADPRIVATEデータ共有指示句がサポートされました。
- セクション3.3のロックルーチンがサポートされました(シンプル及びネストの両方)
5.2 Fortran 2003の機能
以下のFortran 2003の機能が新たにサポートされました。- 整合配列、形状引継配列、自動配列がNAMELIST内で許されるようになりました。
- 可変長文字変数がNAMELIST内で許されるようになりました。
- ROUND=入出力指定子がサポートされました。
- パラメータ化された派生型
- ユーザ定義派生型入出力
5.3 Fortran 2008の機能
-
名前付き定数(PARAMETER)が“形状引継”で宣言できるようになりました。
これにより形状が定数値を定義する式(配列でなければなりません)により与えられる事になります。
書式はそれぞれの次元の上限をアスタリスク(‘*’)で記述します。
Integer,Parameter :: vten(*) = [ (i,i=1,10) ] Real,Parameter :: grid(*,*) = Re形状(vten, [ 2,5 ])通常と同様、下限に1以外を指定したい場合には例えば下記のように行います。Real,Parameter :: hgrid(100:*,-100:*) = grid -
非純粋要素別処理手続はキーワードであるIMPUREを使って定義できます。
非純粋要素別処理手続は要素別処理に適用される制限(すべての引数がスカラ)を持ちますが、
純粋な制限はありません。すなわち非純粋要素別処理手続には副作用として入出力及びSTOP文を含む場合があります。
例)Impure Elemental Integer Function checked_addition(a,b) Result(c) Integer,Intent(In) :: a,b If (a>0 .And. b>0) Then If (b>Huge(c)-a) Stop 'Positive Integer Overflow' Else If (a<0 .And. b<0) Then If ((a+Huge(c))+b<0) Stop 'Negative Integer Overflow' End If c = a + b End Function引数が配列の場合、非純粋要素別処理手続はそれぞれの配列内の要素に対して配列要素順に適用されます。 (特に順序に決まりがない純粋要素別処理手続とは異なります) 非純粋要素別処理手続は手続が純粋でなければならない場合には参照できません。 例)FORALL構文非純粋要素別処理手続はデバッグの際(入出力が許されている為)と最終手続で特に有用です。
- Fortran 2008では多相割付変数への代入が許されています。 変数が異なる動的な型もしくは型パラメータである場合、配列である場合、異なる形状である場合には、まず最初に解放されます。 割付されていない場合(もしくは上記で解放された場合)正しい型と形状で割付され、式の値が代入されます。 この機能の動作はALLOCATE(variable,SOURCE=expr)の動作に似ています。
-
新たに要素別処理組込関数 ACOSH, ASINH, ATANHが追加され、
それぞれ逆双曲線余弦、逆双曲線正弦、逆双曲線正接を計算します。
一つの引数 X は実数と複素数のいずれかを指定し、結果は同じ型と種別となります。
引数が複素数の場合、虚部はラジアンで以下の範囲となります。(ACOSHは 0≤im≤π、ASINH と ATANHは −π/2≤im≤π/2)
例えば ACOSH(1.543081), ASINH(1.175201), ATANH(0.7615942) は全てほぼ 1.0 となります。
- 組込関数 ACOS, ASIN, ATAN, COSH, SINH, TAN, TANH が新たに複素数型を受け入れるようになりました。 双曲線版と非双曲線版のこれらの関数と新たに追加された ACOSH, ASINH, ATANH は単純な代数上の関連があります。 例えば新しい COSH(X) は古い COS((0,1)*X) と同一であり、 新しい SINH(X) は古い (0,-1)*SIN((0,1)*X) と同一です。
- 組込関数 ATAN は新たに ATAN2(Y,X) と同じ意味で ATAN(Y,X) の形式が利用できるようになりました。
-
要素別処理組込関数 DSHIFTL と DSHIFTR は倍幅移動を行います。
これらの関数は3つの引数 I, J, SHIFT を持ち、
I もしくは J に非10進定数表現が許されている事を除き、それぞれInteger型である必要があります。
非10進定数表現は非10進定数表現を指定しなかった方(I もしくは J)の型と種別に変換されます。
I と J は両方共がInteger型である場合、同じ種別でなければなりません。
結果は I と J と同じ種別のInteger型となります。
I と J は連結されて一つの倍幅の値が形成され、
そしてその値が右方向にSHIFT位置分移動するような振る舞いとなります。
DSHIFTLの結果は上位半分の結合移動となり、DSHIFTRの結果は下位半分の結合移動となります。
例えば DSHIFTL(INT(B'11000101',1),B'11001001',2) はINT(B'00010111',1) (10進数の23)となり、 DSHIFTR(INT(B'11000101',1),B'11001001',2) はINT(B'01110010',1) (10進数の114)となります。
-
新しい組込サブルーチン EXECUTE_COMMAND_LINE はコマンドラインをOSのコマンドプロセッサに渡し実行させます。
このサブルーチンは以下に示す順番の通りの5つの引数を持ちます。
CHARACTER(*),INTENT(IN) :: COMMAND (実行されるコマンド)
LOGICAL,INTENT(IN),OPTIONAL :: WAIT (コマンドの実行終了を待つかどうか。デフォルトはtrue)
INTEGER,INTENT(INOUT),OPTIONAL :: EXITSTAT (コマンドの結果値)
INTEGER,INTENT(OUT),OPTIONAL :: CMDSTAT (以下参照)
CHARACTER(*),INTENT(INOUT),OPTIONAL :: CMDMSG (CMDSTATがゼロ以外の場合、エラーメッセージ)CMDSTATは正常終了の場合にゼロとなり、コマンドライン実行がサポートされていない場合は −1 となり、 WAITが指定されていて且つfalseであるにも関わらず非同期実行がサポートされていない場合は −2 となります。 その他のエラーが発生した場合には正の値となります。 CMDSTAT が存在しない場合でゼロ以外が返されるであろう状況が生じた場合にはプログラムが停止します。 リリース 5.3.1においては全てのシステムでコマンドライン実行がサポートされていますが、非同期実行はどのシステムでもサポートされていません。
例えば CALL EXECUTE_COMMAND_LINE('echo Hello') はおそらく ‘Hello’ をコンソールウィンドウに表示します。
-
新たに追加された要素別処理組込関数 HYPOT
は引数 X と Y の “ユークリッド距離関数” (二乗和の平方根) を X もしくは Y
が非常に大きな値もしくは小さな値であったような場合でもオーバーフローやアンダーフローを起こすことなく計算します。
(結果自体がオーバーフローもしくはアンダーフローである場合はこの限りではありません)
引数は同じ種別のReal型でなければならず、結果はその同じ種別の型となります。
HYPOT(X,Y) は意味としても数値としても ABS(CMPLX(X,Y,種別(X))) と同等です。
例えば HYPOT(3e30,4e30) は 5e30 とほぼ同等です。
-
新たに追加された要素別処理組込関数
MERGE_BITS(I,J,MASK) は整数値 IとJを合併しますが、
この際に対応するMASKのビットが1の場合にはIのビットを、
そしてゼロの場合にはJのビットを用いてそれを行います。
全ての引数は非10進定数表現もしくはInteger型でなければなりません。
また全てのInteger型の引数は同じ種別でなければなりません。
最低限、I と JのどちらかがInteger型でなければならず、結果はこれと同じ種別と型になります。
MERGE_BITS(I,J,MASK) は IOR(IAND(I,MASK),IAND(J,NOT(MASK))) と同等です。
例えば MERGE_BITS(INT(B'00110011',1),B'11110000',B'10101010') は INT(B'01110010') (10進値は114)と同じです。
-
新しい配列集計組込関数 NORM2(X,DIM) が追加されました。
この関数は足し算や掛け算で集計を行う SUM と PRODUCT と同じような動きをしますが、
L2ノルム(平方和の平方根)により集計を行います。
その他の多くの集計関数と異なり NORM2 には MASK 引数が無い点に注意して下さい。
DIM 引数は省略可能です。 DIM の実引数はそれ自身が省略可能な仮引数であってはなりません。
結果の値の計算は、結果自体が最大範囲外である場合を除き、計算途中におけるオーバーフローやアンダーフローを避けるように行われます。 例えば NORM2([X,Y]) は HYPOT(X,Y) とほぼ同等です。
- 組込関数 SELECTED_REAL_KIND に第三番目の引数 RADIX が追加されました。 この引数で必要とされる実数種別の基数を指定します。 組込モジュール IEEE_ARITHMETIC の関数 IEEE_SELECTED_REAL_KIND にもこの第三番目の引数が追加され、 今後IEEE十進浮動小数点種別が利用可能となった時点でこれを指定できるようになりました。
-
新しい組込関数 STORAGE_SIZE(A,KIND)
は A と同じ動的型と型パラメタを持つスカラ実体が配列要素として格納された場合の(パディングを含む)大きさをビット単位で返します。
KIND 引数は省略可能です。
結果はInteger型で種別はKINDもしくはKINDが省略された場合には基本種別となります。
A が割付もしくはポインタの場合には、 遅延型パラメタ(例:CHARACTER(:))を持つ場合もしくはCLASS(*)である場合を除き、 割付する必要はありません。 また多相ポインタである場合には未定義状態でなければなりません。
例えば STORAGE_SIZE(13_1) は8(ビット)となります。
- 内部手続及びモジュール手続において、 END文の FUNCTION 及び SUBROUTINE キーワードが省略可能となりました。(手続き名も指定しない場合のみ) 今までは外部手続でのみ省略可能でした。
5.4 パフォーマンスの向上
- SCHEDULE(static)を指定するOpenMP DO構文において反復がより均等に分散されるようになりました。
- 組込関数 COS, COSH, SIN, SINH が4倍精度においてより速くなりました。
5.5 追加されたエラー診断機能
- -C=intovf オプションが追加されました。 このオプションは実行時の整数オーバーフローを検出します。 オーバーヘッドが大きいためこのオプションは -C=all には含まれますが -C には含まれません。
- EXTENDS_TYPE_OF 及び SAME_TYPE_AS への未定義ポインタ引数 が検出されるようになりました。
- 組込関数 BTEST への POS 引数が範囲外であった場合、-C=bits オプションの指定により実行時に検出されるようになりました。
- -C=callsを指定することにより、 変更不可能な(例えば INTENT(IN))実引数と結合されている仮引数の割付を、 実行時に検出するようになりました。
5.6 その他の機能向上
- INCLUDEファイル内で生じた場合を除き、未使用の PARAMETER 定義に対する警告が発せられるようになりました。 この警告は -w=uparam オプションで抑止可能です。
- 未使用・未参照の変数に関する警告が文法エラーの後では抑止されるようになりました。
- いくつかの構文エラーにおいての発生箇所をより正確に伝えるようになりました。 これらは手続のヘッダもしくは型定義文を指し示すようになりました。
- 定数DO形内の組込関数参照において発生した複数の重複警告が抑止されるようになりました。
- “nagfor =depend” におけるMakefile互換の出力がより良くなりました。 具体的には、メインのソースファイルに関して一つの依存情報が生成される事と、 空白やダラーサインなどの特殊文字を含むファイル名が適切に括られるようになりました。
- “nagfor =depend” に -paths=absolute と -paths=relative オプションが追加されました。 このオプションは例えば INCLUDE文等で完全パスが指定されていないような場合に、 依存情報のパスを相対パスにするか絶対パスにするかを指定します。
- DO構文 と SELECT構文のネストレベルの制限が解除されました。 今まではそれぞれ199と30まででしたが、リリース5.3.1では利用可能なメモリにのみ制限されるようになりました。
- 実行時書式指定においてのTAB文字と非文字入力欄が空白として扱われるようになりました。
- T形編集記述子もしくはTR形編集記述子もしくはX形編集記述子のいずれかを利用して、 最後に書かれた文字を超えた位置指定を行った場合に、レコードの最後に空白が追加されなくなりました。
- NAMELIST 文が再入可能となりました。 これにより -thread_safe もしくは -openmp オプションを指定した場合でも安全に利用できるようになりました。
- -C=dangling オプションが -mtrace= とより上手く連動してメモリリークを検出するようになりました。
- シンボルテーブルの最大サイズが増加され、とても大きく複雑なソースファイルをコンパイルできるようになりました。
- -nan が指定された場合に、保存局所配列により大きくなっていた実行形式ファイルがより小さくなりました。
- Windowsでは “Large Address Aware” オプションを利用して32ビットの実行形式を作ります。 これにより64ビットOSで32ビットプログラムを利用する場合に、より大きなアドレス空間を使えるようになりました。
6 リリース 5.3のリリースノートのまとめ
本セクションではリリース5.2 と 5.3の違いについて説明します。
6.1 新機能についてのまとめ
リリース 5.3 はOpenMP 3.0をサポートします。(-openmpオプションが指定された場合のみ) またFortran 2003 と Fortran 2008より、いくつもの新しい機能が追加されています。Fortran 2003の機能が追加されました。
いくつかのFortran 2008の機能がサポートされました。
このリリースにはパフォーマンスの向上とその他のマイナーな機能向上が含まれます。 また、いくつかのプログラムツールがコンパイラに組み込まれました。
6.2 Fortran 2003の機能
- FINALサブルーチンが追加され、ユーザ定義の最終化が行えるようになりました。
- 構造体構築子の成分選択にキーワードが利用できるようになり、基本初期化が行われる成分では省略が可能となりました。 キーワードを利用して(個々の継承成分に対してではなく)親成分全体(もしくは他の先祖成分)に値を提供できるようになりました。
- 構造体構築子が総称関数でオーバーロードできるようになりました。
- 組込関数EXTENDS_型_OF
- 組込関数SAME_型_AS
- INQUIRE文でEXIST=,NAMED=,OPENED=,PENDING=指定子にどの種別のLOGICAL変数でも指定できるようになりました。
- 型パラメータ問い合わせの組込関数%種別と%LENが追加されました。 これらは変数特定子に適用可能です。 variable%種別の形式と種別(variable)は同じです。 またvariable%LENはLEN(variable)とほぼ同じですが 問い合わせ形式の方は組込関数名が利用可能でない場合でも使う事ができます。 更に%LENの形式はその長さを表すことができる種別で値を返します。 (デフォルト整数型で返されるとは限りません)
- 全ての組込関数が定数表現で利用可能となりました。
- ISO 10646 4バイト文字セットがフルにサポートされるようになりました。 組込関数SELECTED_CHAR_種別('ISO_10646')により種別が返されます。 ISO 10646は4バイト文字セットに加え2バイトのサブセット(UCS-2)も定義しているため、 組込関数SELECTED_CHAR_種別はこの文字セットの'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より返される)を識別します。
6.3 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_種別S,INTEGER_種別S,LOGICAL_種別S,REAL_種別Sが追加されました。 これらは利用可能な種別型パラメータ値を列挙します。
- 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,種別)の値は指定された種別の整数で、左側Iビットが1に設定され、残りのビットは0に設定されます。Iは負ではない値で且つ結果のビットサイズ以下でなければなりません。 種別が省略された場合、結果は基本整数型となります。 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仮変数と区別可能です。
6.4 パフォーマンスの向上
- 組込関数ACHARとCHARが場合によっては(特に配列に対する場合と式の中に含まれる場合に)より速くなりました。
- 組込関数ADJUSTL,ADJUSTR,LEN_TRIM,TRIMは多くの場合に、より速くなりました。
- 組込関数MAXLOC及びMINLOCが文字列の場合により速くなりました。
- 組込関数MERGEが場合によっては(特に選択されないソース式の計算に時間がかかる場合に)より速くなりました。
- 組込関数SPREADが連続配列で、より速くなりました。
- 組込関数TRANSPOSEが大きな配列(特にキャッシュにおさまりきらないようなサイズ)で、より速くなりました。
- 寸法が可変の配列構築子の評価がより速くなりました。(特に多くの成分を持つ場合や implied-DOの構造が複雑な場合)
- -thread_safeが指定された場合のメモリー確保が、より速くなりました。
- 多くの場合において文字の代入がより速くなりました。
6.5 追加された診断機能
- 重複部分配列代入で組込代入文の左辺がベクトル添字部分配列で、 ベクトル添字に重複がある場合の検出が行われるようになりました。ベクトルが定数の場合はコンパイル時に、 また-C=配列オプションを指定した場合には実行時に検出されます。
- ポインタの使用法に関して、コンパイル時により多くの誤りを検出するようになりました。
- IEEE_SET_ROUNDING_MODEは誤ったROUND_VALUE引数を検出するようになりました。 IEEE_VALUEは誤ったCLASS引数を検出するようになりました。
- 要素別処理サブルーチンの形状不一致の検出の信頼性が高まりました。
- 組込関数の形状不一致をコンパイル時に検出するようになりました。
6.6 その他の機能拡張
- 組込モジュール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_種別('JIS_0213')で種別が返されます。 この文字セットは‘Shift-JIS’とも呼ばれるため、 組込関数SELECTED_CHAR_種別は'SHIFT_JIS'も識別します。
- 2バイトユニコード文字セット(UCS-2)がサポートされました。 組込関数SELECTED_CHAR_種別('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'),種別(variable))(UCS-2、UCS-4の場合)でそれぞれ置き換えられます。
- F90_種別モジュールに日本語、ユニコード 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)手続きが要素別処理であっても良くなりました。 この場合、このような手続きへの参照は配列要素順に行われます。
6.7 プログラミングツールの統合
3つのソフトウエアツールがnAGコンパイラシステムに統合されました。- コールグラフ生成 — (オプショナルでインデックスと呼び出し元テーブルを含む)コールグラフの生成を行います
- 依存関係解析 — モジュールもしくはINCLUDEファイルの依存関係を ‘make’形式、英語短文、ビルドリストのいずれかの形式で出力します。
- ポリッシュ — Fortranのソースコードの整形を行います。オプショナルで文番号の付け替えや DO文のブロックDO形式への変換を行います。
6.8 その他
- Linux,Mac,Unixシステムで-gオプションを指定しても upsf95用のデバッグ情報を生成しなくなりました。(同デバッガを利用しなくなったため) これらのシステムでは-gオプションはそのままCコンパイラへ渡されます。
- 新たなオプション-max_parameter_size=Nが追加され、 名前付き定数(PARAMETER)の最大サイズの指定が(MB単位で)コンパイル時に行えるようになりました。 名前付き定数のサイズ制限は誤って想定外に大きいサイズの定数を作成してしまう事を防ぎます。 デフォルトの最大サイズは50 MBです。
- 古い-f77オプションの名前が変更になり -compatibleとなりました。 これにより名前がより正確に実際の動作(他のコンパイラとのABIの互換性)を表すようになり、 -f77オプションがFortran標準のレベルを表す-f95,-f2003,-f2008オプションに 関連するオプションとして間違えられる可能性を低くしました。
7 新しいFortran標準
ここで説明された拡張でFortran 2003及びFortran 2008の標準に関するものを、 書籍「Modern Fortran Explained - by Metcalf, Reid & Cohen, Oxford University Press, 2011 printing (ISBN 978-0-19-960142-4)」のセクション番号と共に下記に示します。
| Section | Feature |
| 13.3 | 型パラメータ問い合わせ(%種別 及び %LEN) |
| 14.8 | 最終サブルーチン |
| 14.10 | EXTENDS_型_OFとSAME_型_AS |
| 15.3 | 構造体構築子キーワードとオーバーロード |
| 15.10 | 定数式における組込関数 |
| 17.11 | ROUND= 指定子 |
| 17.13 | INQUIRE文のLOGICAL変数種別 |
| 17.17 | 拡張された NAMELIST文 |
| 20.1.1 | 暗黙形状配列 |
| 20.1.3 | より良くなった型束縛手続宣言文 |
| 20.1.4 | 構造体構築子における割付値の省略 |
| 20.1.6 | STOP文の変更 |
| 20.5.4 | 非純粋要素別処理手続 |
| 20.5.7 | 総称の解決方法の変更 |
| 20.6.2 | 多相割付代入 |
| 20.7.2 | NEWUNIT=指定子 |
| 20.9.1 | 組込三角関数の変更 |
| 20.9.2 | 新たな組込関数ACOSH, ASINH, ATANH |
| 20.9.4 | 新たな組込関数HYPOT, NORM2 |
| 20.10.1 | 新たな組込関数BGE, BGT, BLE, BLT |
| 20.10.2 | 新たな組込関数DSHIFTL, DSHIFTR |
| 20.10.3 | 新たな組込関数IALL, IANY, IPARITY |
| 20.10.4 | 新たな組込関数LEADZ, POPCNT, POPPAR, TRAILZ |
| 20.10.5 | 新たな組込関数MASKL, MASKR |
| 20.10.6 | 新たな組込関数MERGE_BITS |
| 20.10.7 | 新たな組込関数SHIFTA, SHIFTL, SHIFTR |
| 20.11.2 | 新たな組込関数EXECUTE_COMMAND_LINE |
| 20.11.5 | 新たな組込関数PARITY |
| 20.11.6 | 組込関数SELECTED_REAL_種別のRADIX引数 |
| 20.11.7 | 新たな組込関数STORAGE_SIZE. |
| 20.12.2 | ISO_FORTRAN_ENV内の良く使われる種別の名前 |
| 20.12.3 | ISO_FORTRAN_ENV内の種別の配列 |
| B.10.2 | 重複するCONTAINS文 |
| B.10.5 | module手続及び内部手続の省略可能なキーワードであるEND文 |
| B.10.6 | 名前ATANを用いてのcode{ATAN2}機能への参照 |
| C.2 | 削除予定のENTRY文 |
