From: EGUCHI Osamu Date: 1997-10-12T11:22:42+09:00 Subject: [ruby-dev:723] Re: 64bit int support (Re: _muldi3 included in libgcc.a) えぐち です。 ---------- > 差出人 : Yukihiro Matsumoto > 件名 : [ruby-dev:722] Re: 64bit int support (Re: _muldi3 included in libgcc.a) > > まつもと ゆきひろです > > In message "[ruby-dev:719] 64bit int support (Re: _muldi3 included in libgcc.a)" > on 97/10/10, "EGUCHI Osamu" writes: > | > |えぐち です。 > |ところで、alpha-linuxでは > |sizeof({long,void*,int,short})は、それぞれいくつになりますか? > > short 2 > int 4 > long 8 > void* 8 > > です. > > |問題が > | sizeof(long) != sizeof(void*) > |なのか > | sizeof(long) != sizeof(int) > |なのかが理解できていないのです(面目ない)。 > > sizeof(int) != sizeof(void*)が問題なんですね. なるほど、なるほど、 sizeof(long) != sizeof(int) て事もそうですね、あぁ次の話題がそうですか。 逆に言えば sizeof(long) == sizeof(void*) ってのはある意味救いですね。 > まずプロトタイプ宣言をしていない関数の戻り値はintなのですが, > rubyではけっこうsizeof(int)==sizeof(VALUE)を仮定して,VALUE > を返す関数を宣言無しで使っていますのでで,全部の関数にプロト > タイプを付ける必要があります. あと int で VALUE の戻り値を受け取ってるのもあるので size_t 的な場合以外 long を使うべきってのもありますね。 gcc の typeof() を使うと ruby1.1 の #type と同等なコードが、 書けるのですが、いかんせん gcc 依存なので、 地道に gcc -Wall を黙らせるしかないのでしょう?! > またsetjmp()でポインタを返していた部分がありましたが,これは > 修正しました. longjump() の第二パラが int なのは、今となっては、 いやな仕様ですね >X3J11 。(専用の typedef ならよかったのに) > 後はFIX2INT(),INT2FIX()の扱いですね. ここでいう *INT* はC言語の int と言うことでなく 「Fixnumを格納するに十分なC言語の整数型」が求められているとすると 「左に1つシフトしてLSBをセット」の従来の方法で問題無いのでは? > |あと、Bignum の DIGIT の大きさを2バイトと仮定するのは > |今後問題にならないですか?(仕様ですか?) > |今の marshal はそれを仮定しているようですが如何でしょう? > > 現状のmarshalがそれを仮定しているのは確かですね.どうしましょ > うか? Flexibleなのが望ましいとは思うのですが…. marshal のメジャーバージョンを1つあげていいのであれば TYPE_FIXNUM と TYPE_BIGNUM を TYPE_INTEGER に統合して Fixnum の表現可能な範囲を気にしないでいいようにするのが 将来にわたってのデーター交換性を確保するにいい方法だとおもいます。 あと、 符号に1byte使うのもあれなので、 #define TYPE_POSINT '+' #define TYPE_NEGINT '-' なんてどうでしょうか? record MARSHAL_INT begin BYTE type; (* pos:'+' neg:'-' *) LONG len; BYTE digit[len]; end って感じです。 符号化効率を気にするのであれば、頻繁に現れるであろう 0 や 1 に #define TYPE_ZERO '0' #define TYPE_ONE '1' をマッピングすると効果的かもしれません。また #define TYPE_ZARRAY 'Z' なんかも状況によっては有効かも、、 符号化方法はともあれ、 現在の marshal で作られたデータファイルの継続的使用の保証の為、 reader は現と新の両バージョンに対応しつづける事が大切でしょう。 (ところでデータソースのmarshalバージョンを返すメソッドあったん?) writer では 新で書くを既定値とするにしても旧(現)バージョンでの 形式の書き込みも Marshal#set_write_version の様なメソッドで 選択可能にできると、いいんぢゃないでしょうか。 > |少なくとも、私はそう感じます、、でも仕事では使わざるをえない > |という悲しい現実が、、 > > 転職して以来 C++ からは開放されました. 理想的な脱出方法ですね。 (^^) まぁ、多重継承や friend の様な部分に手を出さない(!) と言う消極的な態度になってしまっています。 あと、開発効率より実行効率を優先するような、実時間アプリは C++ が妥当な選択に思えない事もないではないです。 あまり、ruby-dev な話でないので愚痴はこの辺にします。 えぐち