Let's start Scheme

2012-03-18

WATCOMとGCCの違いメモ

結構違いがあってびびった。まだコンパイルが通るだけでまだまともに動かないが・・・
あと、WATCOMのターゲットはWindowsなので、UNIX関連はまた別になるけど
voidの関数が値を返すようなreturnをするとコンパイルエラー
これはGCCやMSVCが甘すぎるのだと思う。正直こうあってほしい。
small、medium、large、hugeがマクロとして定義されてる
Linux版GCCのgetcとかputcのマクロ並に邪悪です。速攻undef。
構造体の初期化で使えるのは定数のみ
結構使っている箇所があった。正直許せよこれくらいと思った。
NaNが0より大きい
これははまった。数字じゃないのに、そんなの返すなよ。多分コンパイラのバグ(と思う)。
左シフトで桁あふれすると0になる
Cの規格では未定義動作なのでコンパイラの警告を無視していた僕が悪いのだが。
静的領域や大域変数は4バイト境界に配置
8バイトを期待したコードを書いていると困る。doubleを噛ませても問答無用だった。__farキーワードで回避
exp、log、powが微妙
まだ原因を特定してないけど、上記の数学関数がOverflowやらRange errorやらDomain errorを投げる。GCCとMSVCは投げない。多分シフトの桁あふれと関連してるのだろう。中身があんまり賢くないようだ。
externされている大域変数の参照が不正
__farキーワードのせいなのか、LoadLibraryの問題なのかは分からない。後者はWin32 APIだからちょっと考え難いか。前者かな?リンカーという線もあるが。
modfにINFINITYを渡すとNaNを返す
GCCとMSVCは0を返す。
根本的にNaNの扱いがおかしい
NAN==0.0が真になるとかありえないだろう。他にもいろいろ偽を返すべきところで真を返す。
logに-INFINITYを渡すとDomain error
だけならいいんだけど、そのまま-inf.0を返しやがる。+nan.0を期待しているのだが・・・
エクスポートされる関数の名前がおかしい
普通は_nameなんだけど、name_と逆になる。dllexportがおかしい?。__cdeclをつける必要あり。
最後のが特定できてないのでR6RSのテストケースが通らない。通した。modfのNaN問題だった。
また、動的モジュールのロードがおかしいのか分からないけど、拡張モジュールがまったくテストできない。
あまりメジャーな処理系ではないらしく、資料もそんなにないし、マニュアルでは痒いところに手が届かない(8バイト境界とか)。2日で何とかなるとは思っていなかったが、想像以上に癖がありすぎて挫折しそう。
とりあえずブランチ切ってコミット。他の処理系で問題なく動くならマージしようかな。とりあえず入れておけば誰か(一人プロジェクトなのに?)が突っ込みいれてくれるかもしれない。

No comments:

Post a Comment