[Anthy-dev 2536] Re: ScmObjInternalのCompacting

Back to archive index

YamaKen yamak****@bp*****
2005年 10月 14日 (金) 10:42:35 JST


At Thu, 13 Oct 2005 16:59:59 -0700,
jun.l****@gmail***** wrote:
> 
> On Fri, 14 Oct 2005 07:51:04 +0900
> YamaKen <yamak****@bp*****> wrote:
> 
> >       S        Type
> > 0000000|00G : #f      (S = 0)
> > .......|00G : Cons
> > ------------------------------
> > 0000000|01G : ()      (S = 0)
> > .......|01G : Closure
> > ------------------------------
> > 0000000|10G : Unbound (S = 0)
> > .......|10G : Others
> > ------------------------------
> > ......0|11G : Integer (imm)
> > ------------------------------
> > ......1|11G : Char    (imm)
> > ------------------------------
> 
> ここを
> .......0|11G : Integer (imm)
> ......01|11G : Const (imm)
> ......11|11G : Char (imm)
> とすれば、#f, (), unbound, #t, EOF, undef その他入れたければ 128M 種類が
> 即値に入ります。int の表現範囲も犠牲になりません。

charも自由度の高いエンコーディングのためになるべく広く取っておき
たいところです。それからNULL|tag形式は後述のように実行・サイズ効
率のためでもあるので。

あ、ついでですがshift無しでcharacter valueを扱う場合のためにint
じゃなくてcharの方を011Gにした方がよいと思います。

......0|11G : Char    (imm)
------------------------------
......1|11G : Integer (imm)

> > S->Y of Others
> >    O           Type                 content of O
> > ........|001 : Symbol             : vcell
> 
> string name でないといけません。Others の定義は S->Y が ScmObj の
> convention に縛られない、です。

stringの8byte alignを保証できるならそれでもいいんですが、さすが
にちょっと移植性が気になります。heapと違って割り当てサイズ小さい
し。

ScmObj の convention に縛られない、というのはわかるんですが、
ScmObjを格納してはいけないという制約もあるんでしたっけ?

> > ........|011 : String             : string length
> > ........|101 : Vector             : vector length
> > .....|000111 : Values             : unused, all 0 (for efficiency)
> > .....|001111 : Func               : ScmFuncTypeCode
> > .....|010111 : Port               : ScmPortDirection
> > .....|011111 : Continuation       : unused, all 0
> > .....|100111 : C Pointer          : pointer type (0 = void *, 1 = ScmFuncType)
> 
> この ScmFuncType というのは? sizeof(function pointer) != sizeof(object
> pointer) への対策でしょうか。でもこういう platform は今でも使われてるん
> ですか? C99-rationale には PDP-11 がどうとか書いてあった気がしますが。
> ;; 何々 pointer というのは C 規格 level での用語の意味。

↓こいつの事です。

typedef ScmObj (*ScmFuncType)();

が、こっちを使う方が適切ですね。

typedef void (*ScmCFunc)(void);

ポインタのサイズはvoid *と同じ事を仮定してますが、warningを黙ら
せるために型を分けてありました。SCM_REINTERPRET_CASTを使えば
void *だけで済むんですが、せっかく値が格納できる事だし将来の拡張も見
越して型チェックに使ってもよいかなと。

> > .....|101111 : Reserved
> > .....|110111 : Special Constant   : constant ID
> >                                     1 : #t
> >                                     2 : EOF
> >                                     3 : Undef
> > .....|111111 : FreeCell           : unused, all 1 (for efficiency)
> > 
> > 
> > ・定数はeq?さえできればOKなので即値向けの専用の型は作らない
> > 
> > ・NULL|tagによく使う定数をエンコード。大抵のアーキテクチャで
> >   immediate operandに収まる事を期待。CONSP等にNULLチェックが必要
> >   になるけどそこは妥協
> > 
> > ・#t, EOF, UndefはOthersに押し込める
> > 
> > ・#fは効率のため0にエンコード (重要)
> 
> 何故? >NULL|tag, #f==0

#f == 0についてはzero register, jnz, jz, cmovnz, cmovzの類での効
率化期待です。

#fや()は井上さん形式にすると5-6bit必要になるんでアーキテクチャに
よっては最小のimmediate operand fieldに収まらなくなったりするし、
明示的な比較命令も必要になります。

> CONSP() が多いので code size は増えそうな気がしますが? というか↑のように
> して他の即値と一緒に入れましょうよ。

逆にNFALSEP, FALSEPではコードサイズ減少が見込めるんでそうそう肥
大化はしないんじゃないかと思ってます。CONSPでもレジスタに残って
る値のゼロ判定が追加されるだけだし。実際どうなるか確実な予測はで
きてませんが。

まあ分類上醜いという気持ちはよくわかるんですが。

> > ・こいつらは定数ではなく普通のsyntaxやsymbolとして扱う
> > 
> >   - Quote
> >   - Quasiquote
> >   - Unquote
> >   - UnquoteSplicing
> 
> そういや symbol 回りを独立させるとかいう話はどうなったのかなー…なんて
> 言ってみたり

ありゃ、なんかありましたっけ。もう思考がSigSchemeから離れて
composer branchの方に戻っちゃってるんで思い出せない…

-------------------------------
ヤマケン yamak****@bp*****



Anthy-dev メーリングリストの案内
Back to archive index