1 概要
nAG Fortran コンパイラのリリース 7.2 は、主要なアップデートです。
以前のリリースからアップグレードするお客様は、このリリース用の新しいライセンスキーが必要です。
Kusari ライセンス管理についての詳細は、KLICENCE.txt を参照してください。
2 リリース概要
リリース 7.2 は Fortran 2018 の全てをサポートしているため、デフォルトの言語レベルは現在 -f2018 になっています。
OpenMP 4.0 と 4.5 の部分的なサポートが 7.2 の初期リリースに含まれています。 2024年初頭には、これを完全サポートにアップグレードするアップデートが行われます。
3 互換性
3.1 リリース 7.1 との互換性
リリース 7.2 はリリース 7.1 と完全に互換性があります。3.2 リリース 7.0 との互換性
リリース 7.2 はリリース 7.0 と互換性がありますが、-C=calls オプションでコンパイルされたファイルは、 手続きポインタ引数を持つ手続きが含まれている場合、またはそのような手続きへの参照が含まれている場合に再コンパイルが必要です。3.3 リリース 6.2 との互換性
MacOSでは、-abi=32 を通じてアクセス可能だった 32 ビット ABI モードが削除されました。その結果、 64 ビットコンパイルのみがサポートされ、-abi= スイッチが完全に削除されました。この点を除けば、リリース 7.2 は共配列が使用されている場合や -C=calls オプションが 代替戻り値を持つサブルーチンに使用されている場合を除き、リリース 6.2 と完全に互換性があります。 これらの機能を使用しているプログラムは再コンパイルが必要です。
3.4 リリース 6.1 との互換性
HPF(High Performance Fortran)からの機能を使用するプログラム、例えばILEN 組み込み関数や HPF_LIBRARY モジュールは、
もはやサポートされません。
Linux x86-64 上で非推奨とされていた -abi=64 オプションが撤回されました。 このオプションは、64ビットポインタを持つが、32ビットのオブジェクトサイズと添字算術を提供し、リリース 5.1 以前との互換性のために存在していました。
HPF サポートと非推奨オプションの撤回を除けば、nAG Fortran コンパイラのリリース 7.2 はリリース 6.1 と完全に互換性があります。
3.5 リリース 6.0 との互換性
HPF サポートと非推奨オプションの撤回を除けば、リリース 7.2 の nAG Fortran コンパイラはリリース 6.0 と互換性がありますが、パラメタ化派生型 の割り当て可能配列を使用するプログラムは再コンパイルが必要です(これはモジュール変数と仮引数にのみ影響します)。
3.6 リリース 5.3.1, 5.3 および 5.2 との互換性
HPF サポートと非推奨オプションの撤回を除けば、リリース 7.2 の nAG Fortran コンパイラはリリース 5.3.1 と完全に互換性があります。 Windows 上では、名前がドル記号 ($) で始まるモジュールや手続きは再コンパイルが必要です。
新しい パラメタ化派生型 機能を使用するプログラムでは、パラメタ化された派生型の多相変数を割り当て、解放、初期化、
またはコピーするプログラムのすべての部分がリリース 7.1 以降でコンパイルされることを強く推奨します。
3.7 リリース 5.1 との互換性
nAG Fortran コンパイラのリリース 7.2 は nAGWare f95 リリース 5.1 と互換性がありますが、次の例外があります:- HPF からの機能を使用するプログラムはサポートされません;
-
CLASSキーワードを使用するプログラムやライブラリ、または拡張される型を含むものは再コンパイルが必要です; - Linux x86-64 でリリース 5.1 でコンパイルされた 64 ビットのプログラムとライブラリはバイナリ互換性がなく、再コンパイルが必要です。
4 新しい Fortran 2018 の機能
-
GENERIC文は、総称引用仕様を宣言するための簡潔な方法を提供します。 その構文は以下の通りです:
ここで、オプションの access-spec はGENERIC[ , access-spec ]::generic-spec=>procedure-name-listPUBLICまたはPRIVATE、 generic-spec は総称識別子(名前、ASSIGNMENT(=)、OPERATOR(op)、または {READ|WRITE}({FORMATTED|UNFORMATTED}))、 そして procedure-name-list は名前付き手続きのコンマ区切りリストです。access-spec は、
GENERIC文がモジュールの仕様部分にある場合にのみ許可されます。 リスト内の各名前付き手続きは、明示的な引用仕様を持たなければなりません;つまり、内部手続き、モジュール手続きであるか、またはインターフェイスブロックまたは手続き宣言文で明示的なインターフェイスを指定して宣言されている必要があります。 手続きは、全てが関数または全てがサブルーチンであり、かつ明確であるという通常の総称規則を満たさなければなりません。オプションの access-spec を除いて、
GENERIC文はINTERFACE generic-spec PROCEDURE procedure-name-list END INTERFACEと同じ効果があります。 唯一の利点は、数行短く、同じ行でアクセシビリティを宣言できることです。 この構文は派生型定義の generic-binding と同じですが、名前のリストは型に結び付けられた手続きではなく通常の名前付き手続きです。例えば、プログラム
Module print_sqrt Private Generic,Public :: g => s1, s2 Contains Subroutine s1(x) Print '(F10.6)',Sqrt(x) End Subroutine Subroutine s2(n) Print '(I10)',Nint(Sqrt(Real(n))) End Subroutine End Module Program test Use print_sqrt Call g(2.0) Call g(127) End Programは1.414214 11を出力します。 -
E0指数幅指定子は、指数幅を指定できるすべての編集記述子(つまりE、ENなど、ただしDは除く)で使用できます。 これは指数の最小幅の書式設定を指定します。 例えば、Print '(7X,3ES10.2E0)', 1.23, 4.56E24, 7.89D101は以下を出力します1.23E+0 4.56E+24 7.89E+101 -
E、D、ENおよびES編集記述子は出力で幅ゼロを持つことができます。 これはIおよびその他の編集記述子と同様に、最小幅編集を提供します。つまり、 処理系はフィールドがアスタリスクで埋められることなく幅 w の最小値を選択します。 これは、先頭の空白が抑止され、EおよびDについては、スケール ファクターがゼロ以下の場合、小数記号の前のオプションのゼロが抑止されることを意味します。例えば、以下に示す書式で 12.3 を印刷すると、先頭および末尾の空白なしで以下の結果が表示されます。
E0.4.1230E+02E0.4E3.1230E+0021PE0.41.2300E+00EN0.412.3000E+00ES0.41.2300E+01E0.4E0.1230E+2フィールド幅は指数の形式に影響しません。つまり、数字を最小幅で印刷するには、指数幅ゼロも使用する必要があります(上記の最後の例で示されているように)。
これらの編集記述子の仮数部分の末尾のゼロを除去する手段はありません(新しい
EX編集記述子では可能です)。 -
G0.d編集記述子は、整数、論理、および文字型で許可されます。 Fortran 2008 ではこれは入出力エラーでした。 Fortran 2018 では、整数の場合はI0、論理の場合はL1、文字の場合はAと同じ効果があります。 例えば、Print '(7X,"start:",3G0.17,":end")', 123, .True., 'ok'はstart:123Tok:endを印刷します。 -
新しい編集記述子
EXw.dおよびEXw.dEeは、 16進仮数部を持つ浮動小数点数の出力に使用することができます。 書式は[ s ]
ここで、s はオプションのプラスまたはマイナス符号(+ または −)、 各 xi は16進数(0Xx0.x1x2… exponent0…9またはA…F)、 そして exponent は10進数で表された2のべき乗(二進指数)で、書式はPs z1…zn です。オプションのEe が現れる場合、n は e と等しく、そうでない場合は指数を表すのに必要な最小の桁数です。 指数がゼロに等しい場合、符号 s はプラス符号です。数字 d の桁数がゼロの場合、生成される仮数桁 xi の数は内部値を正確に表す最小の数です。 内部値の基数が2のべき乗でない場合、d はゼロであってはなりません。
入力において、
EX編集記述子の効果はF編集記述子と同一です。最初の16進数桁の値はゼロでないことを除いて標準化されていません。 したがって、コンパイラ によっては、
EX0.1で 1.0 の値を書くと0X1.0P+0、0X2.0P-1、0X4.0P-2、または0X8.0P-3を生成するかもしれません。 nAG Fortran コンパイラは常に最上位ビットをセットするように仮数をシフトするため、 この場合は0X8.0P-3を出力します。 -
並び、変数群、および明示的書式設定(例:
F編集記述子)を使用した浮動小数点数の入力は、16進数仮数部形式の入力値を受け入れます。 これは、EX編集記述子によって生成される形式です。 16進数仮数部値は常にオプションの符号に続いて数字のゼロと文字Xで始まります。 つまり、+0X、-0X、または0Xであり、明確な曖昧さはありません。例えば、‘
-0XA.P-3’ を読み取ると値-1.25を生成します。数値入力の通常の規則として、小文字入力は大文字と同様に扱われます。したがって
-0xa.p-3は-0XA.P-3と同じ値を生成します。 -
要素的組み込み関数
OUT_OF_RANGEは、変換が範囲外である場合にのみ真を返します。 その構文は以下の通りです:OUT_OF_RANGE ( X, MOLD [ , ROUND ] )
X: 実数型または整数型MOLD: 実数型または整数型のスカラーROUND(オプション) : 論理型のスカラー結果 : 基本種別の論理型。
結果は、
Xの値がエラーなしでMOLDの型および種別に変換できる値の範囲外である場合にのみ真です。MOLD引数が変数である場合、値が定義されている必要はありません。その型と種別だけが使用されます。ROUND引数は、Xが実数型でMOLDが整数型の場合にのみ許可されます。実数から整数への変換では、デフォルトのチェックは値が組み込み関数
INT (X, KIND (MOLD))に対して範囲外であるかどうかです。これは組み込み代入で使用される同じ変換です。ROUND引数が.TRUE.の値で存在する場合、チェックは代わりに値が組み込み関数NINT (X, KIND (MOLD))に対して範囲外であるかどうかです。例えば、
OUT_OF_RANGE (127.5, 0_int8)は偽ですが、OUT_OF_RANGE (127.5, 0_int8, .TRUE.)は真です。Xの値が IEEE 無限大である場合、OUT_OF_RANGEは、MOLDの型および種別が IEEE 無限大をサポートしていない場合にのみ.TRUE.を返します。 同様に、Xが IEEE NaN である場合、結果はMOLDが IEEE NaN をサポートしていない場合にのみ真です。ある種別の実数型から別の種別の実数型への変換をチェックする場合(例えば、
REAL(real32)からREAL(real16)またはREAL(real64)からREAL(real32)へ)、 有限値がHUGE (KIND (MOLD))より大きい場合は範囲外と見なされますが、 無限大の値は範囲外とは見なされません。 つまり、OUT_OF_RANGE (1.0E200_real64, 1.0_real32)は.TRUE.を返しますが、OUT_OF_RANGE (IEEE_VALUE (1.0_real64, IEEE_POSITIVE_INF), 1.0_real32)は.FALSE.を返します。この関数は要素的であり、定数式(
Xの値が定数であり、ROUND引数が欠落しているか定数である場合)で使用できますが、X引数のみが配列であることが許可されています。 したがって、結果は常にXのランクと形状を持ちます。 -
組み込みサブルーチン
DATE_AND_TIMEのVALUES引数は、少なくとも 4 の 10 進指数範囲を持つ任意の種別の整数であることができます。つまり、8ビット整数を除く任意の種別です。 例えば、Program show_year Use Iso_Fortran_Env Integer(int16) v(8) Call Date_And_Time(Values=v) Print *,'The year is',v(1) End Program -
組み込みサブルーチン
EXECUTE_COMMAND_LINEのWAIT引数は、任意の種別の論理型であることができます。CMDSTATおよびEXITSTAT引数は、少なくとも 4 の 10 進指数範囲を持つ任意の種別の整数であることができます。つまり、8ビット整数を除く任意の種別です。 例えば、Program ok Use Iso_Fortran_Env Logical(logical8) :: w = .True._logical8 Integer(int16) :: cstat Integer(int64) :: estat Call Execute_Command_Line('echo ok',w,estat,cstat) If (estat/=0 .Or. cstat/=0) Print *,'Bad STAT',estat,cstat End Programは、‘echo’ が Unix の echo コマンドであると仮定すると、okを表示します。 -
組み込みサブルーチン
GET_COMMAND、GET_COMMAND_ARGUMENT、およびGET_ENVIRONMENT_VARIABLEには、引数リストの最後にオプションのERRMSG引数があります。 エラーが発生すると(つまり、STATUS引数に正の値が割り当てられる場合)、ERRMSG引数に説明メッセージが割り当てられます。 エラーが発生しない場合(STATUS引数にゼロまたは負の値が割り当てられる場合)、ERRMSG引数は変更されません。STATUS引数が省略されても、ERRMSG引数に対する効果は(または発生しません)発生します。 しかし、エラーが発生しない場合には変更されないため、エラーを検出するためのSTATUS引数の代わりにはなりません。例えば、このプログラムを実行すると、
Program test Character(200) msg,value Integer status Call Get_Environment_Variable('Does Not Exist',value,status,Errmsg=msg) If (status>0) Print *,Trim(msg) End Programは、‘Does Not Exist’ という環境変数が存在しない限り、以下を出力しますEnvironment variable does not exist -
組み込み関数
IMAGE_INDEXには2つの追加形式があります:IMAGE_INDEX( COARRAY, SUB, TEAM ) IMAGE_INDEX( COARRAY, SUB, TEAM_NUMBER )
TEAM:TEAM_TYPE型のスカラー、Intent(In);
TEAM_NUMBER: 整数型のスカラー、Intent(In)。COARRAYとSUB引数の意味は変わりませんが、サブスクリプトは指定されたチーム用として解釈されます。 返り値も同様に指定されたチームの像番号です。 -
乱数生成器(組み込み
RANDOM_NUMBER)は現在、像ごとになりました。 Fortran 2008 ではコンパイラがすべての像間で共有される単一の乱数ストリームを使用することを許可していましたが、 Fortran 2018 ではそれを許可せず、代わりに各像が独自の乱数状態を持つことを要求します。 -
新しい組み込みサブルーチン
RANDOM_INITは、呼び出し像上の乱数生成器を初期化します。 その構文は以下の通りです:CALL RANDOM_INIT ( REPEATABLE, IMAGE_DISTINCT )
REPEATABLE: 論理型のスカラー、Intent(In);
IMAGE_DISTINCT: 論理型のスカラー、Intent(In)。IMAGE_DISTINCTが真の場合、乱数生成器の初期状態(シード)は呼び出し像ごとに異なります。そうでない場合、初期状態は像に依存しません。REPEATABLEが真の場合、プログラムの各実行は同じ初期シード(IMAGE_DISTINCTも真である場合は像依存)を使用します。そうでない場合、プログラムの各実行は異なる初期シードを使用します。RANDOM_INITの呼び出しがない場合、nAG Fortran コンパイラのデフォルトはREPEATABLE=偽 およびIMAGE_DISTINCT=真です。 -
標準組み込みモジュール
IEEE_ARITHMETICには、IEEE (ISO/IEC 60559) 算術の追加サポートを提供する追加の定数、型、および手続きがあります。 既存の手続きの3つには、追加のオプション引数があります。-
名前付き定数
IEEE_AWAYはIEEE_ROUND_TYPE型で、ゼロから離れる方向への丸めモードを表します。 IEEE 標準はこの丸めモードを十進数でのみ要求し、二進数ハードウェアはこれをサポートしていないため、使用できません。 -
要素関数
IEEE_FMAは、融合乗算加算演算を実行します。 その構文は以下の通りです:IEEE_FMA (A, B, C)
A: 実数型;
B:Aと同じ型および種;
C:Aと同じ型および種。結果 :
Aと同じ型および種。この関数の結果は、(
A×B)+Cの値が1回の丸めでのみ行われることです。 つまり、全体の操作が数学的に計算され、最後にAの形式に丸められます。 例えば、A×BがオーバーフローしてもIEEE_OVERFLOWはシグナルされませんが、最終結果が範囲外である場合のみシグナルされます。制限:
Aの種別が IEEE 形式でない場合、この関数を呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (A)が偽を返す場合です。 -
純粋なサブルーチン
IEEE_GET_MODESは、停止モード、丸めモード、およびアンダーフローモードを単一のオブジェクトで取得します。 その構文は以下の通りです:IEEE_GET_MODES (MODES)
取得されたモードはMODES:IEEE_MODES_TYPE型のスカラー、Intent(Out)。IEEE_SET_MODESによってモードを復元するために使用することができます。 -
現在の丸めモードを取得する純粋なサブルーチン
IEEE_GET_ROUNDING_MODEには、基数を指定するオプションの引数が追加されました。 その構文は現在以下の通りです:IEEE_GET_ROUNDING_MODE (ROUND_VALUE [, RADIX ])
ROUND_VALUE:IEEE_ROUND_TYPE型、Intent(Out);
RADIX(オプション) : 整数、Intent(In)、2または10と等しくなければなりません。ROUND_VALUE引数には指定された基数の現在の丸めモードが割り当てられます。RADIXが現れない場合、二進丸めモードが割り当てられます。 -
要素別処理関数
IEEE_INTは、IEEE 実数値を特定の丸めモードで整数に変換します。 その構文は以下の通りです:IEEE_INT (A, ROUND [, KIND ])
A: 型 実数;
ROUND: 型IEEE_ROUND_TYPE;
KIND(任意) : スカラ 整数 定数式;
結果 : 型 整数,KINDが指定されている場合はKINDの種別、それ以外の場合は基本種別。Aの値は、ROUNDによって指定された丸めモードを使用して整数に丸められます。 その値が結果の種別で表現可能な場合、結果はその値を持ちます; そうでない場合、結果は処理系依存で、IEEE_INVALIDが通知されます。この操作は、IEEE 標準によって指定された
convertToInteger{round}またはconvertToIntegerExact{round}操作のいずれかです。 後者の場合、IEEE_INVALIDが通知されず、Aが既に整数でなかった場合、IEEE_INEXACTが通知されます。制限: この関数は、
Aの種別が IEEE 形式でない場合には呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (A)が false を返す場合です。 -
要素別処理関数
IEEE_MAX_NUM,IEEE_MAX_NUM_MAG,IEEE_MIN_NUM,IEEE_MIN_NUM_MAGは、NaN 値を無視して最大/最小操作を実行します。 引数が signalling NaN の場合、IEEE_INVALIDが発生します。 引数の一方だけが NaN の場合、結果はもう一方の引数です; 両方の引数が NaN の場合のみ、結果は NaN です。IEEE_MAX_NUMの構文は以下の通りです:IEEE_MAX_NUM (X, Y)
結果の値は、X: 型 実数;
Y:Xと同じ型及び種別;
結果 :Xと同じ型及び種別。XとYの最大値で、NaN を無視します。制限: この関数は、
Xの種別が IEEE 形式でない場合には呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (X)が false を返す場合です。IEEE_MAX_NUM_MAGは構文が同じです(名前を除く), そして結果はXとYのうち大きさが大きい方です。 同じ制限が適用されます。IEEE_MIN_NUMは構文が同じです(名前を除く), そして結果はXとYの最小値で、NaN を無視します。 同じ制限が適用されます。IEEE_MIN_NUM_MAGは構文が同じです(名前を除く), そして結果はXとYのうち小ささが小さい方です。 同じ制限が適用されます。 -
派生型
IEEE_MODES_TYPEには、すべての浮動小数点モードが含まれています: 停止モード、丸めモード、およびアンダーフローモード。 これは、IEEE_GET_MODESおよびIEEE_SET_MODESサブルーチンによって使用されます。 -
要素別処理関数
IEEE_QUIET_{EQ|NE|LT|LE|GT|GE} は、オペランドが quiet NaN であっても、信号を発生させずに二つの IEEE 形式数を比較します。 オペランドが signalling NaN の場合、IEEE_INVALID例外が発生します。IEEE_QUIET_EQとIEEE_QUIET_NEは、IEEE 形式の数値にのみ使用可能な点を除いて、==と/=と全く同じです。IEEE_QUIET_EQ関数の構文は以下の通りです:IEEE_QUIET_EQ (A, B)
A: 型 実数 (任意の IEEE 種別);
B:Aと同じ型及び種別;結果 : 基本種別の論理型。
IEEE_QUIET_NEなどの構文は、関数の名前を除いて同じです。制限: これらの関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、
IEEE_SUPPORT_DATATYPE (X)が false を返す場合です。 -
要素別処理関数
IEEE_REALは、整数またはIEEE形式の実数値を指定されたIEEE形式の実数値に変換します。 その構文は以下の通りです:IEEE_REAL (A, [, KIND ])
A: 型 実数 または 整数;
KIND(任意) : スカラ 整数 定数式;
結果 : 型 実数,KINDが指定されている場合はKINDの種別、それ以外の場合はデフォルトの種別。Aの値が結果の種別で表現可能な場合、その値が結果です。 そうでない場合、Aの値は現在の丸めモードを使用して結果の種別に丸められます。制限: この関数は、
Aの種別または結果の種別がIEEE形式でない場合には呼び出してはなりません。 つまり、IEEE_SUPPORT_DATATYPE (A)またはIEEE_SUPPORT_DATATYPE(REAL(0,KIND))が false を返す場合です。 -
純粋サブルーチン
IEEE_SET_MODESは、以前にIEEE_GET_MODESが呼び出されたときの状態に停止モード、丸めモード、およびアンダーフローモードを設定します。 その構文は以下の通りです:IEEE_SET_MODES (MODES)
MODES: 型IEEE_MODES_TYPEのスカラ、Intent(In)。MODESの値は、IEEE_GET_MODESを介して取得されたものでなければなりません。 -
純粋サブルーチン
IEEE_SET_ROUNDING_MODEは、丸めモードを設定しますが、 基数を指定するオプションの引数が追加されました。 その構文は現在以下の通りです:IEEE_SET_ROUNDING_MODE (ROUND_VALUE [, RADIX ])
ROUND_VALUE: 型IEEE_ROUND_TYPE,Intent(In);
RADIX(任意) : 整数,Intent(In), 2 または 10 でなければなりません。指定された基数の丸めモードは
ROUND_VALUEに設定されます。RADIXが指定されていない場合、二進の丸めモードが設定されます。制限: このサブルーチンは、いくつかの
X(それが存在する場合は基数RADIXで) に対してIEEE_SUPPORT_DATATYPE(X)とIEEE_SUPPORT_ROUNDING(ROUND_VALUE,X)の両方が true である場合にのみ呼び出されるべきです。 -
要素別処理関数
IEEE_SIGNALING_{EQ|NE|LT|LE|GT|GE} は、二つのIEEE形式の数を比較し、 オペランドがNaN(静かなNaNでも信号を発するNaNでも)である場合にはIEEE_INVALID例外を発生させます。IEEE_SIGNALING_LT,IEEE_SIGNALING_LE,IEEE_SIGNALING_GT,IEEE_SIGNALING_GEは、 IEEE形式の数値にのみ使用可能な点を除いて、<,<=,>,>=と完全に同じです。IEEE_SIGNALING_EQ関数の構文は以下の通りです:IEEE_SIGNALING_EQ (A, B)
A: 型 実数 (任意の IEEE 種別);
B:Aと同じ型及び種別;結果 : 基本種別の論理型。
IEEE_SIGNALING_NEなどの構文は、関数の名前を除いて同じです。制限: これらの関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、
IEEE_SUPPORT_DATATYPE (X)が false を返す場合です。 -
要素別処理関数
IEEE_SIGNBITは、IEEE 形式の数値の符号ビットを問い合わせます。 その構文は以下の通りです:IEEE_SIGNBIT (X)
X: 型 実数 (任意の IEEE 種別);結果 : 基本種別の論理型。
結果は符号ビットがセットされている(NaNでない任意の値に対して負を示す)場合、かつその場合に限り、真です。
制限: この関数は、
Xの種別が IEEE 形式でない場合には呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (X)が false を返す場合です。 -
要素別処理関数
IEEE_RINTは、現在必要とされる丸めを指定するオプションの引数を持つようになりました。 その構文は現在以下の通りです:IEEE_RINT (X [, ROUND ])
X: 型 実数;
ROUND(任意) : 型IEEE_ROUND_TYPE。結果 :
Xと同じ型及び種別。ROUNDが存在する場合、結果はROUNDによって指定されたモードに従って整数に丸められたXの値です。これはIEEE標準でroundToIntegral{rounding}と呼ばれる操作です。ROUNDが存在しない場合、結果は現在の丸めモードに従って整数に丸められたXの値です。これはIEEE標準でroundToIntegralExactと呼ばれる操作です。制限: この関数は、
Xの種別が IEEE 形式でない場合には呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (X)が false を返す場合です。
-
名前付き定数
-
組込みモジュール
ISO_C_BINDINGに名前付き定数C_PTRDIFF_Tが追加されました。 これは C の型ptrdiff_t、つまり二つのポインタ間の差を保持するのに十分な大きさの整数に対応する整数の種別です。 例えば、引用仕様Interface Function diff_cptr(a,b) Bind(C) Use Iso_C_Binding Type(C_ptr),Value :: a, b Integer(C_ptrdiff_t) diff_cptr End Function End Interfaceは C の関数ptrdiff_t diff_cptr(void *a,void *b) { return a - b; }と相互運用します。 -
組込みモジュール
ISO_C_BINDINGでは、手続きC_LOCとC_FUNLOCは 純粋手続きとみなされ、C_F_POINTERとC_F_PROCPOINTERは 非純粋手続きとみなされます。 純粋手続き内で使用される場合、C_FUNLOCの引数もまた 純粋手続きでなければなりません。組込みモジュール
ISO_C_BINDINGでは、手続きC_LOCとC_FUNLOCは 純粋手続と考えられ、C_F_POINTERとC_F_PROCPOINTERは 非純粋手続と考えられます。 純粋手続内で使用される場合、C_FUNLOCの引数もまた 純粋手続でなければなりません。 -
別のモジュールからアクセスされる実体のモジュール内のデフォルトのアクセシビリティ(
USE文を通じて) は、PUBLICまたはPRIVATE文でそのモジュール名を指定することにより制御でき、 インポートするモジュール内の他の実体のデフォルトのアクセシビリティを上書きできます。 例えば、Module mymod Use Iso_Fortran_Env Real(real32) x Integer(int64) y Private Iso_Fortran_Env End ModuleISO_FORTRAN_ENVのすべての実体は、個別にリストする必要なく、モジュールmymodではデフォルトでPRIVATEです。この新しいデフォルトのアクセシビリティは、明示的な
PUBLICまたはPRIVATE宣言によって上書きすることができます。 また、遠隔モジュール(2つ以上のUSE文がある)の実体に複数の介在モジュールを介してアクセスされる場合、その実体へのすべての経路がデフォルトでPRIVATEの場合にのみデフォルトでPRIVATEとなり、任意の経路がデフォルトでPUBLICである場合はデフォルトでPUBLICとなります。 例えば、Module remote Real a,b End Module Module route_one Use remote Private remote End Module Module route_two Use remote End Module Module my_module Use route_one Use route_two Private route_one End Moduleモジュール
REMOTEの変数AとBは、モジュールMY_MODULEでPUBLICです、 なぜならそれらはデフォルトでPUBLICのモジュールROUTE_TWO経由でアクセス可能だからです。 -
IMPLICIT NONE文は現在、TYPEおよびEXTERNAL仕様を持つことができます。 その完全な構文は次のとおりです:
ここで、implicit-none-specifier-list は、キーワードIMPLICIT NONE[([ implicit-none-specifier-list ])]EXTERNALとTYPEのコンマ区切りリストです。 リスト内にキーワードが複数回出現することはありません。 リストが表示されない場合、またはリストにTYPEが表示される場合、そのスコーピングユニットに他のIMPLICIT文が表示されることはありません。
とIMPLICIT NONE ()
のセマンティクスはIMPLICIT NONE (TYPE)
のそれと同一ですIMPLICIT NONEキーワード
EXTERNALが出現し、キーワードTYPEが出現しない場合、暗黙の型付けは 無効化されません、 そして他のIMPLICIT文がそのスコーピングユニットに出現することができます。 キーワードTYPEとEXTERNALの両方が出現する場合、 暗黙の型付けは無効化され、暗黙の引用仕様を持つ手続きにはEXTERNAL属性が必要です。 たとえば、Subroutine sub(x) Implicit None (External) Integer f Print *,f(x) End Subroutineは、関数FにEXTERNAL属性がないため、エラーを生成します。キーワード
EXTERNALが出現し、キーワードTYPEが出現しない場合、暗黙の型付けは 無効化されません、 そしてそのスコーピングユニットに他のIMPLICIT文が出現することができます。 キーワードTYPEとEXTERNALの両方が出現する場合、 暗黙の型付けは無効化され、暗黙の引用仕様を持つ手続きにはEXTERNAL属性が必要です。 -
IMPORT文は、BLOCK構造体とネストされたサブプログラム内に出現することができます。 デフォルトでは、そのようなスコーピングユニットは親スコープ内のすべての実体に対して親子結合によってアクセスできるため、 これ自体は(コンパイラがチェックした)ドキュメントとしてのみ有用です。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import :: x, y … -
親子結合に対する制御は、
IMPORT,NONE、IMPORT,ALL、およびIMPORT,ONLY文によって提供されます。 他のIMPORT文と同様に、それらは引用仕様本体、BLOCK構造体、および 含まれるサブプログラム内にのみ出現し、USE文と他の仕様文の間に出現します。IMPORT,NONE文は、親スコープ内の実体が親子結合によってアクセス不可能であることを指定します。 これは分離したモジュール手続き引用仕様以外の引用仕様本体のデフォルトです。 スコーピングユニット内にIMPORT,NONE文が出現する場合、他のIMPORT文は出現できません。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import,None Implicit Integer (a-z) Read *,x Print *,x End Subroutine End SubroutineサブルーチンINNERの中のXは、その親OUTERのXへの参照ではなく、INNERにローカルな暗黙の型付けされた(Integer)変数です。IMPORT,ALL文は、すべての親実体にアクセスされることを指定します。 つまり、そうでなければ親実体をアクセス不可能にする宣言(いわゆる「シャドウイング」)は無効です。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import,All Integer,External :: y …INNER内のYの宣言は無効であり、コンパイルエラーを生成します。 スコーピングユニット内にIMPORT,ALL文が出現する場合、他のIMPORT文は出現できません。IMPORT,ONLY文は、IMPORT,ONLY文で名前が指定された親実体のみが 親子結合によってアクセス可能であることを指定します。 スコーピングユニット内にIMPORT,ONLY文が出現する場合、他のすべてのIMPORT文はONLYキーワードを持たなければなりません。 例えば、Subroutine outer(x,y,z) Real,Intent(InOut) :: x, y(:),z … Contains Subroutine inner Import,Only:x,y z = x + yINNERのXとYへの参照は親(OUTER)の実体への参照ですが、INNERのZへの参照は暗黙の型付けされたローカル変数への参照です。 -
配列構成子または
DATA文の中の暗示的なDOループは、ループ制御の前に整数型の型指定を持つことができるようになりました。 配列構成子内のそのようなループの構文は
であり、(ac-value-list,integer-type-spec::ac-do-variable=from,to [,step ])DATA文内のそのようなループの構文は
です。ここで、integer-type-spec はキーワード(data-i-do-object-list,integer-type-spec::data-i-do-variable=from,to [,step ])INTEGERで始まる任意の型指定です。その効果は、ループ内部で、暗示的-
DO変数(ac-do-variable または data-i-do-variable)が、ループの外部で持つかもしれない型や種別にかかわらず、integer-type-spec によって指定された型と種別を持つことです。ループを含むスコープ内に同じ名前の実体がある場合、それはスカラ変数でなければならないことに注意してください。 たとえば、手続き名や型名であってはなりません。
例えば、
Real x Print *, [ (x, Integer :: x = 1, 10) ]は有効であり、整数値 1 から 10 までの出力を生成します。 同様に、Real x, y(10) Data (y(x),Integer::x=1,10,2) / 5*0 /は有効で、Yの奇数番目の要素をゼロで初期化します。これは、サブスクリプトが基本整数種別の範囲を超える可能性がある場合に特に有用です。 例えば、
Real,Pointer :: a(:) ... Print *, [ (f(a(i)), Integer(int64) :: i = Lbound(a,1,int64), Ubound(a,1,int64)) ]は、例えば境界が 20000000000:20000000005 であっても、Aの各要素に関数Fを適用します。 -
DO CONCURRENT構造体には、局所性指定子LOCAL、LOCAL_INIT、およびSHAREDを持つことができます。 これらの局所性指定子は、ループ内外で変数がどのように使用されるかを決定し、ループインデックス変数には適用されません。これらは常に実質的にLOCALです。DEFAULT(NONE)局所性指定子もあり、DO CONCURRENT内で使用されるすべての変数に明示的な局所性を指定する必要があります。DO CONCURRENT文の改訂された構文は、文番号と構造体名を無視して、次のようになります:
ここで、concurrent-header は以前と同じで、各 locality-spec は以下のいずれかです:DO CONCURRENTconcurrent-header [ locality-spec ]...LOCAL (variable-name-list)
LOCAL_INIT (variable-name-list)
SHARED (variable-name-list)
DEFAULT (NONE)LOCALまたはLOCAL_INIT指定子に出現する変数は、比較的普通の変数でなければなりません:ALLOCATABLEやOPTIONAL属性を持ってはならず、割付け可能な最終コンポーネントを持ってはならず、共配列や想定サイズ配列であってはなりません。 多相的である場合、POINTER属性を持っていなければなりません。 最後に、変数定義コンテキストに出現することが許可されていなければなりません:例えば、INTENT(IN)であってはなりません。LOCALとLOCAL_INITの効果は、構造体内の変数が構造体外のものと完全に別であることです。LOCALの場合、各反復は未定義で始まり、LOCAL_INITの場合、外部変数の値で各反復が始まります。 これにより、LOCALとLOCAL_INIT変数が反復間の依存関係を引き起こすことがないようにします。SHAREDである変数は、構造体内外で同じ変数です。 ある反復によって値が与えられた場合、他の反復によって参照されたり値が与えられたりしてはなりません。 割付け可能であるかポインタである場合、同様に単一の反復によってのみ割り当てられたり、解放されたり、ポインタ割り当てされたりしてはなりません。 不連続配列がSHAREDである場合、連続仮引数に実引数として渡されてはなりません(つまり、 仮引数は想定形状であるかポインタでなければならず、CONTIGUOUS属性を持ってはなりません)。DO CONCURRENT構造体内の変数に局所性指定子を提供することは、コードの可読性を向上させるだけでなく、 適切なコンパイラオプションを使用して、コンパイラがループを並列化しやすくします。 (リリース7.2時点で、nAG Fortran コンパイラにはそのようなオプションはありません。) -
算術
IF文は削除された機能として扱われます。 (これは、式がIEEE非数の場合の挙動が未定義であり、良い定義を持つことができないためです。) 例えば、ファイルdel.f90に以下が含まれている場合Subroutine sub(x) Real,Intent(In) :: x If (x) 1,2,3 1 Stop 1 2 Stop 2 3 Stop 3 End Subroutineこの警告メッセージが生成されます:Deleted feature used: del.f90, line 3: Arithmetic IF statement-Error=Deletedオプションが使用された場合、これはエラーとして扱われます。 -
文番号付きの
DO構文は廃止予定と見なされます (これは、END DO文と構築文番号によって効果的に置き換えられます)。 さらに、非ブロックDO構文は削除された機能として扱われます。 非ブロックのDOは、共有DO終了文番号を持つ2つ以上のネストしたDOループ、 またはEND DOまたはCONTINUE以外の終了文を持つDOループのいずれかです。 (これは、これらが理解しにくく、エラーが発生しやすく、Fortran 90以降はブロックDO構文を介してより良い機能が利用可能であるためです。) 例えば、ファイルobsdel.f90に以下が含まれている場合Subroutine sub(w,x,y) Real,Intent(InOut) :: w(:),x(:,:), y(:) Integer i,j Do 100 i=1,Size(w) w(i) = w(i)**2 + 4*w(i) - 4 100 Continue Do 200 j=1,Size(x,2) Do 200 i=1,Size(x,1) If (x(i,j)<0) Go To 200 x(i,j) = Sqrt(x(i,j)+1) 200 Continue Do 300 i=1,Size(y) If (y(i)<0) Go To 300 y(i) = Log(y(i)) 300 Print *,y(i) End Subroutineこれらの警告メッセージが生成されます:Obsolescent: obsdel.f90, line 4: DO statement with label (100) Obsolescent: obsdel.f90, line 7: DO statement with label (200) Obsolescent: obsdel.f90, line 8: DO statement with label (200) Deleted feature used: obsdel.f90, line 11: 200 is a shared DO termination label Obsolescent: obsdel.f90, line 12: DO statement with label (300) Deleted feature used: obsdel.f90, line 15: DO 300 ends neither with CONTINUE nor ENDDO -
FORALL文と構造は廃止予定と見なされます。 これは、通常、通常のDOまたはDO CONCURRENTよりもパフォーマンスが悪いためです。 例えば、ファイルobs.f90に以下が含まれている場合Subroutine sub(a,b,c) Real,Intent(InOut) :: a(:) Real,Intent(In) :: b(:),c Integer i Forall(i=1:Size(a)) a(i) = b(i)**2 - c End Forall End Subroutineこの警告メッセージが生成されます:Obsolescent: obs.f90, line 5: FORALL construct -
Fortran言語レベルが2018以上(デフォルト)の場合、
F90_KINDやOMP_LIBなどの非標準の組込みモジュールの使用に対して拡張メッセージが生成されます。
5 Fortran 2023 サポート
nAG Fortran コンパイラは、最近改訂され公開された Fortran 2023 標準の以下にリストされている機能をサポートしています。
- フリー形式のソースコードの行は最大 10000 文字までとなります。 -f2023 オプションが使用されていない場合、132 文字を超える任意の行に対して拡張メッセージが生成されます。 (nAG Fortran コンパイラは任意の長さの行を受け入れますが、10000 文字を超える行は Fortran 2023 の拡張として報告されます。)
-
組み込み問合せ関数
SELECTED_LOGICAL_KINDは、指定されたサイズの論理型の種別番号を返します。 この関数の構文は以下の通りです:SELECTED_LOGICAL_KIND ( BITS )
BITS: スカラー整数;結果 : 基本種別のスカラー整数。
結果は、
BITSビット以上のサイズを指定する論理型の種別タイプパラメタ値です。BITSが論理型の最大の種別のストレージサイズを超える場合、結果は −1 になります。 従って、BITSが 8 以下であれば、すべての既知のコンパイラがサポートしている単一バイトの論理型の種別を返します。 nAG Fortran コンパイラでは、BITSが 64 を超える場合、結果は −1 になります。これは、サポートされている最大の論理型が 64 ビットであるためです。 -
標準組み込みモジュール
ISO_FORTRAN_ENVには、指定されたビットサイズの論理型の種別型パラメタ値を提供する追加の名前付き定数が含まれています:LOGICAL8、LOGICAL16、LOGICAL32、およびLOGICAL64。 指定されたサイズの論理型が存在しない場合、その定数は −1 の値を持ちます。 -
AT編集記述子は文字データの出力に使用できます。 文字データは、出力項目の各要素が組み込み関数TRIMの呼び出しで囲まれているかのように、後続の空白が省略されて出力されます。例えば、以下のコードは
Character(100) :: a(3) a(1) = 'o' a(2) = 'ka' a(3) = 'y' Print '(8X,3AT)', a以下を出力します。okayここで、後続の空白はありません。AT編集記述子は入力(READ文)には使用できません。
6 追加の OpenMP サポート
現時点で OpenMP 4.0 および 4.5 は部分的にのみサポートされています。
これには SIMD および TARGET 構造体が含まれ、DO SIMD および TARGET DATA、
および LINEAR 節などの節が含まれます。
OpenMP 4.0 および 4.5 のサポートを完了するための更新が近日中に行われます。
7 追加のエラーチェック
-
FORMAT文または定数文字列として使用される書式の編集記述子のフィールド幅が、 一部の値の出力に対して小さすぎる可能性がある場合、警告メッセージが発行されます。 例えば、プログラムProgram na Read *,x Print 100,x 100 Format('X has the value ',E9.3) End Programは警告メッセージを生成しますWarning: na.f90, line 4: In E9.3 the width 9 may be too small for output of some numbersフィールド幅が有限数の出力に対して小さすぎる場合(IEEE NaN は 3 の幅が必要です)、メッセージはそれを指摘します。例えば、例のE9.3をE9.7に変更すると、警告が生成されますWarning: na.f90, line 4: Field width too small for output of finite numbers - the E9.7 edit descriptor will produce all asterisksフィールド幅が 3 より小さい場合、メッセージは再び変更されます。例えば、E2.1の場合、警告は以下のようになります。Warning: na.f90, line 4: Field width of 2 for the E edit descriptor will inevitably produce all asterisks as output -
デフォルト装置、例えば
UNIT=*でREC=やPOS=指定子が現れるのをコンパイル時にエラーとして検出します。 デフォルト装置はシーケンシャルな書式付きユニットであり、それらの指定子はシーケンシャル入出力と共に使用できません。 例えば、以下のコードをコンパイルするとProgram badio Write(*,'(A)',Rec=999) 'Oops' End Program以下のようなエラーが発生しますError: badio.f90, line 2: REC= and UNIT=* are not compatible -
ファイル内の他の場所で要素的であると表示されている手続きを、暗黙のインターフェイスで呼び出すことがコンパイル時にエラーとして検出されます。
例えば、以下をコンパイルすると
Program c Real a(10) Call d(a,1.0) Print *,a End Program Elemental Subroutine d(x,y) Real,Intent(Out) :: x Real,Intent(In) :: y x = y End Subroutine以下のようなエラーが発生しますError: c.f90: Explicit interface required for ELEMENTAL procedure D referenced from C -
CHANGE TEAM構造体内で活動状態のチーム変数を変更する最も明白なケースがコンパイル時にエラーとして検出されます。 Fortran 標準は、コンパイラが構造体全体を通じて活動状態のチーム変数を使用できるようにするために、そのような変更を禁止しています。 例えば、以下をコンパイルするとSubroutine teamswap(team1,team2) Use Iso_Fortran_Env Type(team_type),Intent(InOut) :: team1,team2 Type(team_type) tmp Change Team (team2) tmp = team1 ! Okay. team1 = team2 ! Okay. team2 = tmp ! BAD End Team End Subroutine以下のような、エラーメッセージが生成されますError: teamswap.f90, line 8: Variable TEAM2 on left-hand side of assignment statement is the active team value for the CHANGE TEAM statement at line 5 of teamswap.f90
8 その他の拡張
-
倍精度および 4 倍精度
RANDOM_NUMBERの低位ビットに完全なエントロピーがあります。 以前のリリースでは、数列に完全なエントロピーがありましたが、低位ビット(倍精度では 21 ビット、4 倍精度では 53 ビット)はランダムではありませんでした。 (これは、各個別の倍精度値に 32 ビット以上のランダム性が必要なシミュレーションにのみ影響します。)新しい方法は以前よりもかなり長い時間を要しますが、パフォーマンスは他のコンパイラと競合しています。 古い、より高速な方法は -random=5.3 オプションで選択でき、新しい方法は -random=7.2 オプションで確認できます。 これらのオプションはコンパイルされるファイル内の
RANDOM_NUMBERの使用にのみ影響し、異なるオプションでコンパイルされた別々のファイルは結果のプログラムで組み合わされることができます。 -
-gline オプションは、-coarray=cosmp オプションまたは -openmp オプションと共に使用することができます。
CoSMP モードでは、エラー終了を引き起こした像の番号(初期チーム内)が報告されます。例えば、
ERROR STOP: failatend pco391.f90, line 20: Error occurred in PCO391:SUB pco391.f90, line 18: Called by PCO391:SUB pco391.f90, line 11: Called by PCO391:TEST pco391.f90, line 7: Called by PCO391 Error termination initiated by image 2OpenMP モードでは、PARALLEL構造体によって作成されたスレッド番号が報告されます。例えば、ERROR STOP: failatend suy008.f90, line 19: Error occurred in SUY008:SUB suy008.f90, line 17: Called by SUY008:SUB suy008.f90, line 10: Thread 8 created by OpenMP PARALLEL construct suy008.f90, line 8: Called by SUY008:TEST suy008.f90, line 2: Called by SUY008 - 標準行長を超えて延長されたコメントは、標準行長を超えて延長されたステートメントテキストとは別に報告されます。
-
-xldarg オプションは、コマンドライン上の次の引数をリンカフェーズにその位置で渡し、
-Wl, オプションとは異なり、翻訳せずに渡します(-Wl, オプションはカンマ区切りのオプションリストとなります)。
例えば、
nagfor a.o -xldarg -pathlist=abc,xyz b.libはリンクフェーズで以下のように展開されます。gcc a.o -pathlist=abc,xyz b.lib nAG-rts-specificationsしかし以下のように指定した場合はnagfor a.o -Wl,-pathlist=abc,xyz b.libリンクフェーズで以下のように展開されます。gcc a.o b.lib nAG-rts-specifications -pathlist=abc xyz -
-fpplonglines オプションは、
fppプリプロセッサに対して、自由形式で 132 文字を超える出力行を折り返さないように指示します。 これは、fppの出力を別のツール(例えばfppプリプロセッサ自体)に渡す場合に便利です。そのツールはトークンが行を超えて続く中で#lineディレクティブを期待していません。 -
-w=longlines オプションは、自由形式の行が Fortran 標準によって許可されている長さを超えている場合の警告を抑止します。これは Fortran 2018 までの 132 文字、および Fortran 2023 の 10000 文字です。
nAG Fortran コンパイラは任意の長さの自由形式の行を受け入れます。
- -u=all オプションは、すべての -u= サブオプションがアクティブであることを指定します。 このリリースでは、これは -u=external、-u=locality、 -u=sharing、および -u=type を含みます。
-
-u=external オプションは、
IMPLICIT NONE (EXTERNAL)が有効であることを指定します。 これにより、外部および仮手続きは、明示的な引用仕様を持つか、明示的にEXTERNAL属性を与えられる必要があります。例えば、ファイル
bad.f90がProgram bad Call oops End Programを含んでいる場合、-u=external オプションでコンパイルするとエラーが発生します。Error: bad.f90, line 3: External procedure OOPS does not have the EXTERNAL attribute -
-u=locality は、すべての
DO CONCURRENT構造がDEFAULT (NONE)を指定したかのように扱われることを指定します。その局所性指定子は、DO CONCURRENT構造内で参照されるすべての変数に明示的な局所性を与えることを要求します。例えば、ファイル
b.f90がProgram b Real x(100) Do Concurrent(i=1:100) x(i) = i**2.0 End Do Print *,x End Programを含んでいる場合、-u=locality オプションでコンパイルするとエラーが発生しますError: b.f90, line 4: Locality not specified for X in DO CONCURRENT with DEFAULT(NONE) -
-Warn=double_real_literal オプションは、プログラム内の基本倍精度実数定数表現の存在を報告します。
これらは、D指数文字を持つ実数定数表現です(したがって、種別型パラメタはありません)。
報告は注釈として行われますが、10進数を基本倍精度に変換する際の不正確さが検出された場合は、警告として行われます。
例えば、以下のプログラムでは
Program dlits Print *,123d0 Print *,0.123d0 End Program報告される警告は以下の通りです:Note: dlits.f90, line 2: Default double precision literal constant 123D0 Warning: dlits.f90, line 3: Inexact default double precision literal constant 0.123D0このオプションは、特定の種別型パラメタを持つことを意図したプログラムで基本倍精度実数定数表現の存在を検出するのに役立つかもしれません。
-
-Warn=unkind_real_literal オプションは、プログラム内で種別指定子がない基本実数定数表現を報告します。
報告は注釈として行われますが、10進数をデフォルトの実数に変換する際の不正確さが検出された場合は、警告として行われます。
例えば、以下のプログラムでは
Program lits Print *,123.0 Print *,0.123 End Program報告される警告は以下の通りです:Note: lits.f90, line 2: Real literal constant 123.0 has no kind specifier Warning: lits.f90, line 3: Inexact real literal constant 0.123 has no kind specifierこのオプションは、倍精度であること、または特定の種別型パラメタを持つことを意図したプログラムでデフォルト(単精度)の実数定数表現の存在を検出するのに役立つかもしれません。
-
-Error=class オプションは、class の警告メッセージをエラーとして扱うように指定します。
class の値は以下のいずれかでなければなりません(大文字小文字は区別されません):
Ancient FORTRAN 77の廃止予定で非標準の拡張機能の使用 Deleted Fortran標準から削除された機能の使用 Extension Fortran標準への廃止予定の使用 Obsolescent Fortran標準が廃止予定であると述べている機能の使用 Questionable プログラミングエラーを示している可能性のある有効だが疑問のある使用法 Warning 上記以外の警告クラスのメッセージ Any_Warning 上記のいずれか。 -Error=Obsolescent は -Error=Deleted を含むことに注意してください、 なぜならすべての削除された機能は以前は廃止予定でした。 また、-Error=Extension は -Error=Ancient を含むことに注意してください、 なぜなら古い廃止予定の拡張は拡張です。 また、-Error=Extensionは-Error=Ancientを含みます。 過去の廃止予定の拡張機能は、現在も拡張機能だからです。
また、メッセージの接頭辞が変更されないことに注意してください、例えば警告メッセージは依然として ‘
Warning:’ で始まりますが、-colour オプションが使用される場合、メッセージの色はエラーとして色付けされます。 -
-strict95 オプションは、‘
CHARACTER*’ 構文の使用に対する廃止予定の(警告)メッセージを生成していましたが、現在はデフォルトで有効になっており、無視されます。 代わりに、-nonstrict という新しいオプションがあり、それはこれらのメッセージを抑止し、多相的割付可能成分の成分の宣言された型の拡張である値の宣言された型に関する拡張メッセージも抑止します(これは常に許可されることが意図されていましたが、Fortran 2003の語句の誤りがFortran 2018まで修正されませんでした)。 -
LinuxとWindowsで利用可能な追加の-target=machine オプションがあります。machine は nehalem, westmere, sandybridge, ivybridge, haswell, broadwell, skylake, cannonlake, icelake, zen, または native(現在のマシンをターゲットにします)である可能性があります。
-
ポリッシュ(ソース整形)オプション -elcase=X は、指数文字(
EまたはD)に使用するケースを設定します: X は Asis, lowercase, UPPERCASE、またはそれらの略語のいずれかでなければなりません; デフォルトは -elcase=UPPERCASE です。 X の解釈は大文字小文字を区別しません(例えば、-elcase=u は -elcase=U と同じです)。 -elcase=Asis は基本的なポリッシュ(=polish)でのみ利用可能であり、Enhanced Polish(=epolish)やその他のツール(例:=unifyprecision)では利用できないことに注意してください。 -
ポリッシュ(ソース整形)オプション -canonicalise_floating_literals は、浮動小数点定数表現の正規化を指定します。
浮動小数点リテラルの正規形は常に小数点を持ち、それより前とそれより後に少なくとも1桁があります。
指数文字が
Eの場合、指数は常に非ゼロです。 指数がある場合、指数文字の後には常に符号が続き、指数値に先行するゼロはありません。 例えば、Print *, .1, 1e0, 3d0, 2d-04は(-elcase=U を使用して)次のように再フォーマットされます:Print *, 0.1, 1.0, 3.0D+0, 2.0D-4 -
-openmp オプションが使用されると、PolishはOpenMP
DO構造を自動的に終了させ、その本体をインデントします。 例えば、以下をポリッシュ(整形)すると!$OMP do do i=1,10 a(i) = i end do以前は以下のように整形されましたが!$Omp Do Do i=1,10 a(i) = i End Do現在以下のようになります。!$Omp Do Do i=1,10 a(i) = i End Do !$Omp End Do -
拡張ポリッシュ(拡張整形)は、引数なしの
SUBROUTINE文とCALL文に括弧を追加できます。 デフォルトでは、括弧は省略されます(BIND(C)句を持つSUBROUTINE文を除く)。 -subroutine_parens オプションは、括弧を生成します。例えば、拡張ポリッシュを -subroutine_parens(他のオプションなしで)とすると
CALL mysub整形後はCall mysub()となります。 -
Makefileの依存関係を生成する際、-odir
dirオプションは、オブジェクトファイルが異なるディレクトリ(現在の作業ディレクトリではない)に配置されることを指定します。 例えば、“file.f90” に依存するオブジェクトファイルは、単に “file.o” ではなく “dir/file.o” とみなされます。
