1

私は常に、fortran が実体を「参照によって」仮引数に渡すと想定していました。それから私はこの答えを得ました(答えの実際の議論は関連していましたが、これについてではありません)

標準はそれを決して指定しておらず、実際、そのような指定を避けるためにかなりの努力をしています。あなたの考えはよくある誤解ですが、特に最適化がオンになっているほとんどの古いコンパイラでさえ、厳密には正確ではありませんでした。厳密な参照渡しは、多くの一般的な最適化を無効にします。

最近の標準では、参照渡しはほとんど許可されていない場合があります。標準では、その規範的なテキストでこれらの単語を使用していませんが、参照渡しで実装するのは実際的ではないものがあります。

ポインターのようなものに取り掛かり始めると、すべてが参照渡しであると想定する誤りが以前よりも明らかになり始めます。あなたはその誤解を捨てなければならないでしょう、さもなければ多くのことがあなたを混乱させるでしょう.

他の人が投稿の残りの部分に適切に答えていると思います。上記の点についても言及している人もいましたが、私はそれを強調したいと思いました。

帰属についてはこちらをご覧ください。

この回答によると、標準には、呼び出し元から呼び出し先にデータを送信する方法を指定するものは何もありません。実際には、特にインテント()仕様に関しては、(コンパイラが標準を実装する方法に起因する実際の影響に関係なく)実際に作業するという観点から、これをどのように解釈する必要がありますか?

編集:質問を明確にしたいと思います。私が理解しようとしているのは、通話を実行しているときに標準がどのように機能することを期待しているかということです。エンティティを渡すために使用される実際のコンパイラ戦略が標準によって定義されていないことを考えると、(標準によれば) 原則として、引数を関数に渡すことが実際に「参照渡し」として動作するとは期待できません。これは、この動作がコンパイラと最適化に依存するためです。したがって、標準は、実際の実装戦略に関係なく、動作するために従わなければならないプログラミング スタイルを課していると思います。

4

3 に答える 3

3

はい、本当です。Fortran 標準では、さまざまな INTENT 属性の正確な評価戦略を指定していません。たとえば、INTENT(OUT) を指定した仮引数の場合、一部の Fortran コンパイラは、参照渡しまたはコピー復元呼び出しによる評価を使用できます。

しかし、なぜどの評価戦略が使用されているかを本当に知る必要があるのか​​ わかりません。理由は何ですか?Fortranはそれを正しく行うと思います。人間の関心は (高レベルの) 議論の意図であり、コンピューターの関心は (低レベルの) 評価戦略です。「人間のものは人間に、コンピュータのものはコンピュータに返せ。」N.ウィーナー

標準には、さまざまな INTENT 属性の使用法に関する十分な情報が含まれていると思います。Fortran 2003 標準の最終委員会ドラフト(PDF、5 MB)のセクション「5.1.2.7 INTENT 属性」は、良い出発点です。

于 2010-10-22T12:23:38.067 に答える
2

他の人が言ったように、コンパイラが正しく機能する限り、コンパイラがどのように機能するかを知る必要はありません。Fortran >=90 では、引数の目的 (入力、出力、またはその両方) を指定できます。その後、コンパイラーが引数を渡します。コンパイラが正しく実装されていて、両方 (呼び出し元と呼び出し先) が同じメカニズムを使用している限り、プログラマーが気にする必要はありません。そのため、Fortran 標準は、コンパイラの作成者がコンパイラを実装する方法を制限しないように努めており、希望どおりに設計および最適化できるようにしています。

プログラミング スタイルに関しては、プロシージャの引数の目的を決定し、適切な意図で宣言します。次に、たとえば、誤ってプロシージャ内のインテント (in) 引数を変更しようとすると、コンパイラはエラー メッセージを発行し、この間違いを防ぐことができます。オブジェクト コードを発行する前にこれを行う場合もあるため、実際の引数の受け渡しメカニズムは、言語のこの要件の強制とは何の関係もありません。

C は下位レベルの言語であり、プログラマーはさまざまな理由から、値渡しと参照渡しのどちらかを選択する必要があります。しかし、科学的プログラミングなどの問題では、これは制御しなければならない不必要な側面です。これは、組み込みまたはデバイス ドライバーのプログラミングに不可欠です。

Fortran 2003 は、別の言語とのインターフェイスなど、引数を渡すメカニズムを制御する必要がある場合に備えて、ISO C バインディングを提供します (これは既に広く実装されています)。これにより、引数渡しの C メソッドと一致させることができます。

于 2010-10-22T15:15:09.767 に答える
1

あなたの質問を理解しているかどうかはわかりませんが、標準に準拠したコードを記述している限り、引数の受け渡しがどのように実装されているかを気にする必要はありません。コンパイラは、引数が標準に準拠した方法で渡されることを確認します (もちろん、コンパイラのバグは除きます)。

ここで、たとえば C 相互運用機能などを使用してトリックを実行すると、たとえば引数アドレスを比較することで、特定のケースでコンパイラが参照渡し、コピーイン/コピーアウト、またはその他の何かを使用するかどうかを判断できる場合があります。しかし、一般的に言えば、その時点であなたは標準の範囲外にあり、すべての賭けはオフになっています.

于 2010-10-22T12:26:12.353 に答える