[Anthy-dev 2530] Re: ScmObjInternalのCompacting

Back to archive index

YamaKen yamak****@bp*****
2005年 10月 14日 (金) 07:51:04 JST


ヤマケンです。開発おつかれです。

At Thu, 13 Oct 2005 13:25:07 -0700,
jun.l****@gmail***** wrote:
> 
> On Fri, 14 Oct 2005 03:16:46 +0900
> Kazuki Ohta <mover****@hct*****> wrote:
> 
> > [ 変更点その1 ]
> > まず、即値(immediate value)の部分です。char型はポインタを一つ持っているだけですが、
> > アラインメントの関係上(mallocは8byteにアラインメントされたメモリアドレスを返す)ので、下
> > 位4ビットを占有出来ません。そこでCharだけを特別扱いしています。
> > また、なるべくintegerの取れるビット数を増やしたいと思い、Integerも特別扱いしています。

charは数値として扱いましょう。R5RSがchar->integer, integer->char
が可能な事を仮定してるので。

> Other types に押し込んでもいいでしょうけど、Unicode 系を全部 UCS-4 に
> べったり符号化したものに canonicalize すると即値にもできます。Emacs の
> src のどっかに "RMS によれば世界中の文字をあらわすには 22 bits いるかも
> しれないので数 bit 予約云々" とあったので、24 あれば相当先まで大丈夫で
> しょう。元がどの符号化方式だったかの管理はハナから schemer に押しつけて
> るので無問題。

値のエンコーディングは各character codecまかせという事でcanonical 
な内部形式まではSigSchemeで規定しなくてもよいと思います(少なくと
も現時点では)。同一codecを使う限り数値及び文字列との変換で情報の
欠落や変質が無い事さえ保証されてれば。

> > [ 変更点その2 ]
> > 次にその他(other types)の部分です。Symbol, Continuationは共にポインタを2つ抱えてい
> > る為、これもまたアラインメントの関係から特別視しています。
> > String->len, Vector->len, Port->type等はint型なので、S-Yに無理矢理押し込めようと
> > 思っています。
> 
> ちゃんと見てないので間違ってるかもしれませんが、継続の pointer の一方は
> jmpbuf の横に置いておけばいいのでは?
> 
> ScmObj Scm_CallWithCurrentContinuation(ScmObj proc, ScmEvalState *eval_state)
> {
>     struct {
>       jmp_buf state;
>       void *opaque;
>     } env;
>     ScmObj cont = SCM_FALSE;
>     ScmObj ret  = SCM_FALSE;
> ...
> }

これでOKです。


上記の事情を踏まえて以下のようなフォーマットはどうでしょう。

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

S->Y of Others
   O           Type                 content of O
........|001 : Symbol             : vcell
........|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)


・定数はeq?さえできればOKなので即値向けの専用の型は作らない

・NULL|tagによく使う定数をエンコード。大抵のアーキテクチャで
  immediate operandに収まる事を期待。CONSP等にNULLチェックが必要
  になるけどそこは妥協

・#t, EOF, UndefはOthersに押し込める

・#fは効率のため0にエンコード (重要)

・CONSTANTPを効率化するためint, charの即値は11Gに変更

・UnboundはSCM_INVALIDとしても使う

・こいつらは定数ではなく普通のsyntaxやsymbolとして扱う

  - Quote
  - Quasiquote
  - Unquote
  - UnquoteSplicing

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



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