プロが教える店舗&オフィスのセキュリティ対策術

変数宣言をしてその変数を使用する場合、ゼロクリアというのは常識なのかも知れませんが、フォートランはデフォルトでゼロクリアになっていたと理解しています。てっきりそうだと思っていたのですが、フリーのフォートランコンパイラg95はゼロクリアになっていないみたいです。すなわちg95では変数宣言して値を明示的に与える前に使用するとゼロと思っていたのがとんでもない値になっていました。
コンパイラの仕様を読んでおくというのは数値計算を行う上で重要なことだと考えます。

前置きが長くなりました。質問ですが、コンパイラで変数宣言した時点でゼロクリアになっていないというのは言語としてはどのようなものがあるのでしょうか? 全部なのでしょうか。全部そうだと思っていた方が安全ではあると思いますが。

よろしくお願いします。

A 回答 (4件)

C# や Java等の安全重視の最近の言語では0,nullなどでの初期化が保証されます。


CやC++など、性能重視の従来の言語では、無駄な初期化は保証されません。
# C/C++の静的変数など、一部保証されるケースもあります。
したがって、プログラマの判断/責任において最適な初期化をすることになりますが、
メモリやスピードを過度に要求されるコードでもない限り、
昨今は明示的に初期化して使われる方が多いのではないかと思います。
また、仕様上保証がないだけであって、他の方も書かれているように、
コンパイラによっては初期化保証などを行っているものもありえますが、
あくまでそのコンパイラの独自拡張機能となります。
    • good
    • 0
この回答へのお礼

回答、有難うございました。
Cの本などを見ると必ず初期化しているようで、言語の違いについて考えさせられました。これからはフォートランでもしっかり初期化しようと思います。

お礼日時:2008/01/05 23:59

ANSIのFORTRANの言語仕様では初期値は保証されていない筈です。


コンパイラやOSによっては保証している場合もあるかと思いますが、それはイレギュラーだし、それに頼る行為は信頼に欠けるプログラミングです。

なお、処理系によっては、整数のゼロと実数のゼロは違うし、実数のゼロとしてNULLと仮数部ゼロ、指数有りの複数を認める処理系もあります。ですから、ゼロクリアだったとしても、ヌルなのか浮動小数点表示のゼロなのかで結果が違う場合もあります(論理式に突っ込んだ場合など)。

なお、DATA文で初期化した場合と、ループで初期化する場合とでは変数の置かれる場所が違ったり、最適化による効果が異なりますのでいろいろ試してみるのは面白いです。

なお、ゼロクリアが保証されないのは、初期のコンピュータにおいては主記憶が磁気コアや磁気ドラムなどに置かれ、領域を確保しただけでは自動的にクリアできなかったことなどが影響しています。サブルーチンや関数内の変数も一旦サブルーチンから出て戻った場合、SAVE文で保持を指定しないと不定に戻る使用でした(これは現在は保証される)。

ゼロクリアを言語仕様として決めているのは一部のインタープリタくらいじゃないかな。実際にはクリアされている処理系は結構あると思うけど。
言語仕様に従ってプログラムすれば、それに準拠したコンパイラでは少なくともそれは含んでいますから問題はないはず。
    • good
    • 0
この回答へのお礼

回答、有難うございました。
ソースプログラムはどこの環境にも持って行けるのですが、そこで正常に動作するかどうかはしっかり確認する必要があると思いました。

お礼日時:2008/01/05 23:56

同じ言語であっても提供元(メーカー、作成者)やバージョン


の違い、場合によってはデバッグモードとリリースモードと
で扱いが変わる事は良く有ります。
    • good
    • 0
この回答へのお礼

回答、有難うございました。
コンパイラのバージョンやモード設定でも変わるということですね。
複雑ですね。

お礼日時:2008/01/05 23:54

メジャーどころではCでしょうか。



プログラマが指定していないのに、ゼロやNULLをセットするというのは、実行速度の低下を招くだけなので、初期値セットはプログラマに任せる言語が主流だと思いますが。
変数に型のない言語だと、何らかの型の値での初期化がされていると思います。

fortranもfortran90の規格は知らないですけど、fortran66や77では初期化が必須でした。
    • good
    • 0
この回答へのお礼

有難うございました。
フォートランでの科学計算ですので、作りこんで行くとCPU時間1時間というのはざらです。計算を始めた時点でのゼロセットはトータルの時間ではあまり問題にはならないと考えています。

g95とvisual Fortran(両者ともfortran90対応)でも初期のゼロセットは異なるようです。

ケースバイケースのようですね。一方、ソースプログラムはどこにでも持っていけるのでトラブルが発生するかも知れません。
要注意と思った方が良いみたいですね。

お礼日時:2008/01/05 23:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!