電子書籍の厳選無料作品が豊富!

普段、何気なく使っていたUnixCに、いくつか種類があり、
結構、違いがあるらしい事にようやく気づきました。

種類がある事は、以前に気づきましたが、それは単なる
コンパイラの種類であり、使う側が意識する事はないと
思い込んでいました。今考えれば、コンパイラが違えば、
使用する際にそれを意識するのは当たり前な気もします。

しかし、未だに明確な違いや特徴が良く分かりません。
コーディングする上で、またコンパイルする上で、何か
意識すべきこと、注意すること等、ご存知の方がいらし
たら、御教授下さい。

A 回答 (4件)

> こういったノウハウは、実践で身につけるものなのでしょうね。



やる気があれば、全てドキュメント化されていることなので、座学のみで習得する
ことは可能です。

また、実際に複数のコンパイラを使うはめに陥らないと、なかなかやる気にならない
ということも事実です。

> 注意点や「仕様上不変な部分」の見極めに、何か良いアドバイス(書籍とか)等
> ありましたら、後学の為、御教え頂きたく候ふ。

ANSI の規格書が一番です。

規格書に「不定」とか「未定義」とか書いていないところ(*)が「仕様上不変
な部分」です。

  (*) 明示的に『実装により定義された(implementation-defined)動作』と記述されているところもある
    • good
    • 0
この回答へのお礼

大変、理解が深まりました。ありがとうございました。
これからは、少しコンパイラを意識してコーディング
する様にしてみます。

お礼日時:2002/08/20 16:42

>これに関しては、コンパイルが両方で通ればOKということでいいのかな。



不十分だと思います。
a-kumasさんが書いている他にも、片方は正常に動くが片方が異常終了するとか,
結果が異なるとか無いとは言えません。

また、構造体のサイズが絡む場合、通信時のデータサイズが変わったりとか,データファイルのサイズが変わったりとかで
問題がでる場合があります。


>コーディングする上では、さほど意識しなくて良いと認識しましたが。

言語の仕様上不変な部分が身についていれば,
注意すべきところはすぐわかってそこは注意する,
そうでないところは特別に意識しないということはありますが、
なんらかの形で意識はしていると思います。

また、意識しないでうまくいった時はいいですが、
問題が出てから苦労すると思いますが。
    • good
    • 0
この回答へのお礼

ありがとうございました。
注意点や「仕様上不変な部分」の見極めに、何か良いアドバイス(書籍とか)等
ありましたら、後学の為、御教え頂きたく候ふ。

お礼日時:2002/08/20 13:23

> これに関しては、コンパイルが両方で通ればOKということでいいのかな。



そうでもありません。最近の unix (あなたがお使いの Solaris のように) では、
ライブラリは静的にリンクするのではなく、動的にリンクするのがデフォルトに
なっているのが多いです。

例えば、実行時の LD_LIBRARY_PATH が別のところを指していると、きちんと
動かない、ということがありえます。


> コーディングする上では、さほど意識しなくて良いと認識しましたが。

「さほど」の加減が難しいところ。

ANSI と POSIX の範囲だけにとどまっており、ポインタに関する正しい理解が
あるひとであれば、さほど意識しなくても良いと思います。

でも、最近までコンパイラが複数あることを知らなかったのであれば、何が「普通」な
のかが分からない(今まで自分が普通にやってきたことと同じとは限らない)です
から、一概には言えません。

私の経験では、ひとつのコンパイラしか知らない人が作ったプログラムを、他の
OS (もちろん、コンパイラも違う)に持ってゆく場合には、それなりの覚悟をして
かかります。

  ※ すんなりとはいかないことが多いです

因みに、これが c++ になると、もっと違いが深刻になってきます。
    • good
    • 0
この回答へのお礼

ありがとうございました。
こういったノウハウは、実践で身につけるものなのでしょうね。

お礼日時:2002/08/20 13:12

いろいろありますが、思いついたことをその順であげてみます.



1) ライブラリ,インクルートファイルの違い
ANSI規格に沿った部分は同じでしょうが,それ以外の物は同じライブラリ、関数があるとは限りませんし,インクルードファイルも名前や中身が違う可能性があります。

2) 言語の実装依存部分の違い
例えば,intのサイズは決まっていません。
そこまで極端なことは無いかも知れませんが,
その手の違いがある可能性があります。
構造体も定義によってはサイズが違ってくる可能性がありますね。

3) コンパイラ依存部分
#pragma
なんていうのを使っていると,書き換える必要があるでしょう。
また、言語使用を独自に拡張している場合もありますので、
そういう機能を使わないようにする必要があるでしょう。

4) コマンドライン引数の違い
-cなんかは同じでしょうが,細かいところで違っていると思います。
必要に応じて直す必要があるでしょう。

5) 共存問題
両方同時に使う場合は、それぞれの環境がまざらないか注意がいるでしょう。
.objファイルは混同出来ないかもしれません。
LIBという環境変数でライブラリが参照できる必要があるばあい、それが使っているほうのCコンパイラのそれになっている必要はあるでしょう。


まあ、コンパイルしたプログラムの実行速度やサイズが違うこともあるでしょうが、
実行するうえで問題にはならないですよね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
細かいところでは、それぞれ独自のものがあり、注意が必要ですね。
これに関しては、コンパイルが両方で通ればOKということでいいのかな。
コーディングする上では、さほど意識しなくて良いと認識しましたが。

以上、私の認識に勘違い等があったら、御指摘頂きたく。

お礼日時:2002/08/14 09:51

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