[Anthy-dev 2534] Re: ScmObjInternalのCompacting

Back to archive index

Jun Inoue jun.l****@gmail*****
2005年 10月 14日 (金) 08:59:59 JST


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 の表現範囲も犠牲になりません。


> S->Y of Others
>    O           Type                 content of O
> ........|001 : Symbol             : vcell

string name でないといけません。Others の定義は S->Y が ScmObj の
convention に縛られない、です。


> ........|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 での用語の意味。


> .....|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

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


> ・UnboundはSCM_INVALIDとしても使う

そうそう、最初 SCM_INVALID を導入したときに choose an appropriate value
と書いたのは UNBOUND にするかどうするかというつもりだったんですが、忘れ
てました。即値の空間が有り余ってるので、少なくとも debug 中は別物にした
方がいいと思います。Scheme level でバグってるのか C level なのか見分けが
つきますし。


> ・こいつらは定数ではなく普通のsyntaxやsymbolとして扱う
> 
>   - Quote
>   - Quasiquote
>   - Unquote
>   - UnquoteSplicing

そういや symbol 回りを独立させるとかいう話はどうなったのかなー…なんて
言ってみたり


とりあえずまとめ: こんなんでどうですか。


      S        Type
.......|00G : Cons
------------------------------
.......|01G : Closure
------------------------------
.......|10G : Other
------------------------------
......0|11G : Integer (imm)
.....01|11G : Char (imm)
.....11|11G : Constant (imm)
------------------------------

Constants (showing only (unsigned)S >> 5)
0: INVALID
1: UNBOUND
2: FALSE
3: TRUE
4: NULL ()
5: EOF


S->Y of Others
   O           Type                 content of O
........|001 : Symbol             : symbol name
........|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)
.....|101111 : Reserved
.....|110111 : Special Constant   : constant ID
                                    1 : #t
                                    2 : EOF
                                    3 : Undef
.....|111111 : FreeCell           : unused, all 1 (for efficiency)


-- 
Jun Inoue
jun.l****@gmail*****



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