このプログラムは言語規則に違反していますx
。サブルーチンの仮引数は行によって変更されていますx = x + 1
が、式 (単純な定数) に関連付けられています。一般に、式の結果の値は変更できません。
その特定のコードは、Fortran 2008 でも構文的に有効です。Fortran IV/66 の場合と同様に、Fortran 2008 でもプログラミング エラーのままです。これは、コンパイラが診断する必要があるものではありません。おそらく追加のデバッグオプションを使用して実行する場合もあれば、実行時まで実行しない場合もあります。
プログラムは言語規則に違反しているため、プログラムを実行すると何かが起こる可能性があります。正確には、コンパイラによって生成されたコードに依存します。コンパイラは、内部的に変数のように見えるように、式の結果の値用に変更可能なストレージを確保している可能性があります (プログラムは 3 を出力し、プログラムは続行する可能性があります)。定数2
(突然 の値が2
どこでも 3 になる!)、定数の値のストレージが変更不可能なメモリにある可能性があり (プログラムがクラッシュする可能性があります)、コンパイラがエラー メッセージを発行する可能性があり、プログラムが動揺して不機嫌になる可能性があります。ベッドルームで、プログラムが隣国に宣戦布告する可能性があります。これはプログラミング エラーです。何が起こるかは不明です。
Fortran 90 の時点で、コンパイラーがこれらのようなエラーをチェックするのに実用的な新しいコードをプログラマーが記述できるようにするための機能が言語に導入されました(場合によっては、エラーが標準と見なされる場合、コンパイラーはエラーをチェックする必要があります)。準拠)。
提示されたコードでは、メイン プログラムとサブルーチンは別々にコンパイルされたと見なされます。メイン プログラムはサブルーチンの詳細を認識せず、その逆も同様です (サブルーチンがメイン プログラムのずっと後にコンパイルされる可能性があります。別のマシンで、2 つの出力が後の段階で一緒にリンクされます。したがって、凝ったリンク時の動作や静的解析がなければ、このようなエラーを解決することはできません)。言語規則では、メイン プログラムをコンパイルするときに、サブルーチンが参照される方法のみに基づいて、サブルーチンのインターフェイスの詳細をコンパイラが暗黙的に想定する必要があります。メイン プログラム内では、サブルーチンには暗黙的なインターフェイスがあります。
Fortran 90 では、明示的インターフェースの概念が導入されました。コンパイラは、サブルーチンのインターフェースがさまざまな方法で明示的に通知され、サブルーチンへの参照がそのインターフェースと一致しているかどうかをチェックできます。プロシージャがモジュール プロシージャ、内部プロシージャ、または組み込みプロシージャである場合、そのインターフェイスは自動的に実現されます。代わりに、外部サブプログラム、プロシージャ ポインターなどの場合、プログラマはインターフェイス ブロックを使用してインターフェイスを明示的に記述できます。
さらに、Fortran 90 では、intent 属性が導入されました。これは、プロシージャの仮引数の特性であり、プロシージャのインターフェイスの特性でもあります。引数の意図は、プロシージャーが引数を定義できるかどうか (また、デフォルトの初期化およびコンポーネントの割り振り状況に影響を与える可能性がある)、したがって式が有効な実引数であるかどうかをコンパイラーに示します。 x
サブルーチンでfoo
は通常、INTENT(INOUT) と宣言されます。
これらの新しい言語機能を総合すると、基本レベルの実装品質を備えたコンパイラを使用する場合に、この種のプログラミング エラーに対する強力な防御が提供されます。この言語を使い始める場合は、これらの新機能を標準的なアプローチの一部にすることをお勧めします。つまり、暗黙的な none を使用します。通常、すべてのプロシージャはモジュール プロシージャまたは内部プロシージャにする必要があります。絶対に必要な場合にのみ外部プロシージャを使用し、常に仮引数を指定します。自由形式のソースを使用してください。