私は現在Fortranを調べていますが、副作用のない関数/サブルーチンを指定するpure
キーワードに出くわしました。
私は本を持っていますFortran 90/95 S Chapmanによるpure
キーワードを紹介していますが、奇妙なことに「良いコーディング慣行」の使用法を提供していません。
手続きの中でこのキーワードをどれだけ自由に使うべきか疑問に思います。周りを見回すだけで、副作用のないほとんどの手順では、pure
キーワードを含める必要がないことは明らかです。
それで、それはどこで最もよく使われますか?したい手順でのみ完全に保証には副作用がありませんか?または、おそらく手順で、後でelemental
手順に変換する予定ですか? (elemental
プロシージャは最初にpure
でなければならないため。)
PURE
が必要な場合もあります。たとえば、仕様式内で、またはFORALL
またはDO CONCURRENT
構造から呼び出されるプロシージャです。 PURE
は、これらの場合、特定のコード範囲から合理的に決定論的な結果を得ながら、Fortranプロセッサにプロシージャ呼び出しの順序の柔軟性を与えるために必要です。
これらの必須の場合を超えて、PURE
を使用するかどうかは基本的にスタイルの問題であり、ある程度主観的です。
PURE
の使用にはコスト(プロシージャ内でIOを実行できない、PURE
以外のプロシージャを呼び出すことができない))と利点(純粋なプロシージャ)があります。今日書かれたものは、純粋なプロシージャを必要とする明日書かれたコンテキストから呼び出すことができます。PURE
プロシージャには副作用がないため、そのようなプロシージャの呼び出しの影響は、コードの読者にとってより明確になる可能性があります)、トレード-2つの間のオフは詳細によって異なります。
この標準は、Fortranプロセッサに、式および式内の関数参照を評価する方法にかなりの余裕を与える可能性があります。これは、関数の実行と関数の引数の変更の副作用に関して、いくつかの方法でプログラムを確実に制約します。純粋関数の要件は、その余裕と制約と一致しているため、ほとんどの関数が純粋であるスタイルを使用する人もいます。繰り返しになりますが、それでも詳細に依存する可能性があり、Cの相互運用性や外部APIとの相互作用などの例外が存在する必要がある場合があります。
Chw21で示唆されているように、PURE
の主な動機は、コンパイラーがより適切に最適化できるようにすることです。特に、関数にPURE
がない場合、未知の副作用による並列化が妨げられます。 PURE
サブルーチンは、関数とは異なり、INTENT(INOUT)
引数を持つ場合がありますが、副作用には制限があります(また、PURE
プロシージャは他のPURE
プロシージャのみを呼び出すことができます)。
Fortran 2003までは、ELEMENTAL
プロシージャは暗黙的にPURE
です。 Fortran 2008は、そのアスペクトを無効にするためにIMPURE
プロシージャで使用できるELEMENTAL
プレフィックスを追加します。
INTENT(IN)
を持つ変数を変更しようとすると、コンパイルされません。
純粋関数はINTENT(IN)
引数のみを持つことができ、引数のみに依存する値を返します。純粋なサブルーチンは、INTENT(OUT)
およびINTENT(INOUT)
引数を変更できますが、これも引数の値にのみ基づいています。
どちらの場合も:同じ引数->同じ結果。
利点は、プログラムの動作を変更せずに(コードを最適化するために)実行の順序を入れ替えることができることをコンパイラーに保証することです。