web-dev-qa-db-ja.com

PUREキーワードFortranの適切な使用

私は現在Fortranを調べていますが、副作用のない関数/サブルーチンを指定するpureキーワードに出くわしました。

私は本を​​持っていますFortran 90/95 S Chapmanによるpureキーワードを紹介していますが、奇妙なことに「良いコーディング慣行」の使用法を提供していません。

手続きの中でこのキーワードをどれだけ自由に使うべきか疑問に思います。周りを見回すだけで、副作用のないほとんどの手順では、pureキーワードを含める必要がないことは明らかです。

それで、それはどこで最もよく使われますか?したい手順でのみ完全に保証には副作用がありませんか?または、おそらく手順で、後でelemental手順に変換する予定ですか? (elementalプロシージャは最初にpureでなければならないため。)

18
River

PUREが必要な場合もあります。たとえば、仕様式内で、またはFORALLまたはDO CONCURRENT構造から呼び出されるプロシージャです。 PUREは、これらの場合、特定のコード範囲から合理的に決定論的な結果を得ながら、Fortranプロセッサにプロシージャ呼び出しの順序の柔軟性を与えるために必要です。

これらの必須の場合を超えて、PUREを使用するかどうかは基本的にスタイルの問題であり、ある程度主観的です。

PUREの使用にはコスト(プロシージャ内でIOを実行できない、PURE以外のプロシージャを呼び出すことができない))と利点(純粋なプロシージャ)があります。今日書かれたものは、純粋なプロシージャを必要とする明日書かれたコンテキストから呼び出すことができます。PUREプロシージャには副作用がないため、そのようなプロシージャの呼び出しの影響は、コードの読者にとってより明確になる可能性があります)、トレード-2つの間のオフは詳細によって異なります。

この標準は、Fortranプロセッサに、式および式内の関数参照を評価する方法にかなりの余裕を与える可能性があります。これは、関数の実行と関数の引数の変更の副作用に関して、いくつかの方法でプログラムを確実に制約します。純粋関数の要件は、その余裕と制約と一致しているため、ほとんどの関数が純粋であるスタイルを使用する人もいます。繰り返しになりますが、それでも詳細に依存する可能性があり、Cの相互運用性や外部APIとの相互作用などの例外が存在する必要がある場合があります。

12
IanH

Chw21で示唆されているように、PUREの主な動機は、コンパイラーがより適切に最適化できるようにすることです。特に、関数にPUREがない場合、未知の副作用による並列化が妨げられます。 PUREサブルーチンは、関数とは異なり、INTENT(INOUT)引数を持つ場合がありますが、副作用には制限があります(また、PUREプロシージャは他のPUREプロシージャのみを呼び出すことができます)。

Fortran 2003までは、ELEMENTALプロシージャは暗黙的にPUREです。 Fortran 2008は、そのアスペクトを無効にするためにIMPUREプロシージャで使用できるELEMENTALプレフィックスを追加します。

7
Steve Lionel

INTENT(IN)を持つ変数を変更しようとすると、コンパイルされません。

純粋関数はINTENT(IN)引数のみを持つことができ、引数のみに依存する値を返します。純粋なサブルーチンは、INTENT(OUT)およびINTENT(INOUT)引数を変更できますが、これも引数の値にのみ基づいています。

どちらの場合も:同じ引数->同じ結果。

利点は、プログラムの動作を変更せずに(コードを最適化するために)実行の順序を入れ替えることができることをコンパイラーに保証することです。

0
chw21