狠狠撸

狠狠撸Share a Scribd company logo
実行时のデータ型の表现手法	
 ?
     Ver.	
 ?1.02	
 ?
    2012-?‐11-?‐24	
       前田敦司
このスライドの目的	
?? 64bit	
 ?ARMアーキテクチャのTagged	
 ?Pointer機
   能が話題になった	
 ?
?? よい機会なので,実行時にデータ型を判別す
   るためのデータ表現をまとめておこうと思った	
 ?
?? ホットなトピックというより,大昔からの,いわ
   ば教科書的な話題だが,教科書にはあんまり
   載ってない	
 ?
?? 手法の選択にはGCやメモリ管理との相互作
   用も絡むのだが,ほぼバッサリ省略
実行時になぜデータ型を判別する	
 ?
     必要があるのか?	
?? 動的型付き言語	
 ?
  –? 変数に静的な(=実行前の?コンパイル時の)型
     が付いていない	
 ?
  –? 実行するまで,どんな型のデータが入るかわから
     ない	
 ?
?? 多相型とGC	
 ?
  –? 整数のリストも文字列のリストも受け取れる関数
     の引数…GCが,ポインタを追跡する手がかり
実行時の型判別の基本操作	
?? is_type(x,	
 ?t)	
 ?	
 ?
     –? データxの型はtか?	
 ?
     –? 真偽値を返す.エラーは起きない.	
 ?
?? typecase(x)	
 ?case	
 ?t1=>…;	
 ?case	
 ?t2=>…;	
 ?…	
 ?
     –? データxの型に応じて多方向分岐	
 ?
     –? エラーは起きない	
 ?
?? 型エラーの動的チェック(check_type)	
 ?
     –? データxが期待した型(たとえば,整数加算に対して整
        数オペランド)なら正常に演算を行う	
 ?
     –? そうでないならエラー
前提:データ表現の一様性	
?? 動的データ型や多相型では,一般に,すべて
   のデータが一様に表現されている必要がある	
 ?
 –? 変数の記憶領域はすべて同じサイズ	
 ?
 –? 配列やリストの要素も同じサイズ	
 ?
 –? データ型の表現法も標準化	
 ?
 –? boxed表現などという(cf.	
 ?boxing,	
 ?unboxing)	
 ?
?? 効率を考えると,サイズは1ワード(CPUが自
   然に扱える特定のサイズ)に揃えるのが便利	
 ?
?? 1ワードに収まらないデータは?
データサイズの一様化とポインタ	
?? すべてのデータのサイズを1ワードに揃える
   手法の例(仮にオブジェクトタグと呼ぶ):	
 ?
 –? 変数や配列にはポインタを入れる	
 ?
 –? 実際のデータ本体は,別の場所(ヒープ)に置く	
 ?
 –? 本体のヘッダに,型やサイズの情報を入れる	
 ?
                型?サイズ	
 変数x	
                 データ	

 変数y	
              型?サイズ	

                     データ
オブジェクトタグでの基本操作	
?? is_type(x,	
 ?t)	
 ?
    –? xのポインタをたどり,ヘッダの型コードを読みだし
       てtと照合	
 ?
?? typecase(x)	
 ?
    –? xのポインタをたどり,ヘッダの型コードを読みだし
       て多方向分岐(テーブルジャンプ等)	
 ?
?? check_type	
 ?
    –? is_type(x,	
 ?t)で型を確認してから演算を実行	
 ?
オブジェクトタグの欠点	
?? メモリのオーバーヘッドが大きい	
 –? ポインタとヘッダの領域がオーバーヘッドとなる	
 ?
 –? 本体が1ワードなら,計3ワードが必要	
 ?
?? 速度的なオーバーヘッド	
 ?
 –? 整数をこの形式で表すと,たとえば加算は…	
 ?
   ?? 左辺のポインタをたどり,ヘッダを読んで整数であることを
      確認し,本体の整数データを読み出す	
 ?
   ?? 右辺も同様	
 ?
   ?? 加算命令の結果にヘッダを付けてヒープにアロケートし,そ
      の領域へのポインタを結果とする…ゴミが大量に出る	
 ?
改良手法1:イミディエイトデータのアド
       レスへのマップ	
  ?? たとえば値の小さな整数などを,ヒープ以外
     のアドレスを指すポインタにマップする	

                     例)	
 ?
                     ポインタ値pがboundaryより小さい時,整数
boundary	
           boundary-?‐pを表していると見なす.	
 ?
                     	
 ?
                     ?? メモリの節約:小さい整数は1ワード	
 ?
                     ?? 速度の節約:整数演算は速くなる	
 ?
             ヒープ	
   ?? その他のデータの操作には「ヒープを指して
                          いる事」を確認するオーバーヘッドがかかる
手法2:BIBOP	
?? Big	
 ?Bag	
 ?of	
 ?Pagesの略;たぶんビーバップと読む	
 ?
?? ヒープを2のべき乗サイズ(たとえば4KiB)の
   ページに分ける	
 ?
?? 1つのページには,1つの型のデータだけ入
   れる	
 ページ0	
                  ヒープのbase	

         	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?1	
     整数データが入るページ	
          	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?2	
    浮動小数点数データが入るページ	

          	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?3	
    リストデータが入るページ	
           	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?4
BIBOPでの型判別基本操作	
?? ページ管理表に型情報を入れておく	
 ?
?? ポインタ値	
 ?x	
 ?からヒープのbaseアドレスを引き,
   右にシフトしてページ管理表を引く	
 ?
                                                        ヒープのbase	
ページ0	
                                                                      x	
 ?-?‐	
 ?base	
	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?1	
     ポインタx	
                                                                                 ページ番号	
   オフセット12bit	


 	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?2	
       ページ管理表	
                                                            0	
 ?
                                                            1	
 ?     補注:文献[3]のマシンは1ワード36bit,	
 ?
 	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?3	
                                                            2	
 ?     アドレスはワード単位18bitなので,	
 ?
  	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?4	
       3	
 ?     ?? 1ワードにポインタ2個が入る	
 ?
                                                            4	
       ?? ポインタ中のbitは全く空きがない	
 ?
                                                                          (後述のポインタタグには向かない)
BIBOPの利点	
?? メモリ効率はオブジェクトタグよりずっとよい	
 ?
 –? オブジェクトごとに型情報を保つ必要はない	
 ?
?? 型判別操作の速度もそう遅くない	
 ?
 –? メモリアクセス回数は1回のまま	
 ?
?? 多種類の型の領域をかなり柔軟に管理できる	
 ?
?? 速度オーバーヘッドは?	
 ?
 –? 小さな整数は,あらかじめ順序良く並べて割り当てて
    おけばアドレスと簡単にマッピングできる(ポインタを
    たどって普通に本体を取り出すこともできる)
手法3:ポインタタグ	
?? Tagged	
 ?pointer…ポインタ内に型情報を埋め
   込む	
 ?
?? 観察:ポインタのすべてのビットが有効な情報
   を表しているわけではない	
 ?
       –? たとえば,最近のバイトアドレスマシンで,ワード
          以上のサイズのデータを指すポインタは,下位の
          2?3bitがたいていゼロ	
 ?
       –? また,64bitマシンでも,アドレス空間はそんなに
          なかったりする(上位ビットは実際は使ってない)	
 ?
	
 ?
ポインタタグ(Tagged	
 ?Pointer)とは	
?? ポインタ中の,使っていないビットに型情報を
   埋め込む	
 ?
?? 残りのビットで,データの値を表す	
 ?
 –? ポインタの指すアドレス	
 ?
 –? 文字や小さい整数等のイミディエイトデータ	
 ?
?? メモリアクセスなしで型を判別できる事が多い	
 ?
?? イミディエイトデータはヒープに割り当てずに
   すむ…メモリ効率,速度効率の向上	
 ?
バリエーション:ポインタの上位ビット
         にタグ	
?? 例:	
 ?IBM	
 ?System	
 ?360,	
 ?Motorola	
 ?MC68000等は,
   ポインタが32bitだが,アドレス空間は24bitで,
   上位8bitは無視される	
 ?
   →	
 ?上位8bitに型を表すコードを入れることができる	
 ?
   	
 ? 型タグ8bit	
         有効なアドレス24bit	
   	
 ?
   typecase操作:シフトして型タグを取り出す	
 ?
   is_type,	
 ?check_type:比較1回?2回	
 ?
上位ビットポインタタグの比較	
 型タグ8bit	
   有効なアドレス24bit	


?? 型タグが上位にあるので,シフトは不要で単
   に大小比較すればよい	
 ?
?? 符号なし,符号付き比較,型の包含関係を工
   夫すれば,多くの場合1回の比較ですむ	
?? たとえば「型タグが0x00か」の検査は,
   「0x01000000より符号なし比較で小さいか」を
   調べれば良い	
 ?
上位ビットポインタタグの例	
タグの値	
 型	
0x00	
   小さな整数	
                      Lisp系言語での架空の	
 ?
0x01	
   Bignum	
      整数	
           タグ値の例	
 ?
                              数値	
    	
 ?
0x02	
   Float	
                      ?? 小さな整数は(符号
0x03	
   複素数	
                             なしで良いなら)変
                                           換なしで演算できる	
 ?
…	
      …	
                                      ?? 整数,数値,配列,
0x7d	
   多次元配列	
                           1次元配列,文字
0x7e	
   ベクター	
               配列	
         列,シンボル,リス
                                           ト,リストのノード等
0x7f	
   文字列	
                                           は1回の比較で判
0x80	
   シンボル	
                            別できる	
 ?
0x81	
   構造体	
                        ?? (実際は,ベンチ
                                           マークでどの型を
…	
      …	
                                           優先するか決める)	
0xfe	
   空リスト(nil)	
0x?	
    リストのノード	
            リスト
上位ビットポインタタグの得失	
?? 32bitワード,24bitアドレスの時代には,かな
   り多くのビットが型判別に使えた	
 ?
?? オブジェクトタグよりメモリアクセスが少ないの
   は大きな利点	
 ?
?? 欠点	
 ?
 –? 上位bitを無視してくれるCPUでないと,ポインタア
    クセス毎に比較的大きなオーバーヘッドがかかる	
 ?
 –? 無視してくれるCPUでも,数年するとアドレス空間
    が足りなくなったりする(実際,そうなった)
バリエーション:ポインタの下位ビット
        にタグ	
?? たとえば32bitのバイトアドレスマシン(1ワー
   ド4バイト)で,データオブジェクトのサイズが1
   ワード以上なら,下位に2bit以上使わないビッ
   トができる	
 ?
 –? 間接アクセス時に,インデックスでタグを打ち消す
    ことにより,マスクしないでアクセス可能	
 ?
 例)	
 ?	
 ?リストのノード(CONS対)のタグが2進数01のとき
 2つの要素を読み出すには,それぞれ	
 ?p	
 ?–	
 ?1,	
 ?p	
 ?+	
 ?3	
 ?
 番地を読み出せばよい
下位ビットポインタタグの利点	
?? 小さな整数に下位	
 ?00	
 ?(2)	
 ?のタグを割り当てると	
 ?
  –? 30bit符号付き…加減算はマスクもシフトも不要	
 ?
  –? ワードのインデックスに使う際も便利	
 ?
  –? SPARCのtadcc	
 ?(tagged	
 ?add	
 ?set	
 ?condi`on	
 ?code)命令は,
     オペランドの下位2ビットが00(2)でないとトラップを引
     き起こす整数加算…check_typeの命令が不要	
 ?
?? CPUによっては,アラインされていないメモリアク
   セスをトラップできる(バスエラー等)	
 ?
  –? タグ付きポインタアクセスのcheck_typeの命令が不要
下位ビットポインタタグの得失	
?? is_type,	
 ?type_case	
 ?
   –? 下位ビットのみマスクして取り出す	
 ?
   –? 上位ビット ポインタタグより少し手間	
 ?
?? check_type	
 ?
   –? 前述のとおり,CPUによっては,事実上コスト無しで行
      える場合がある	
 ?
?? 使えるbit数が少ないのが欠点	
 ?
   –? 型判別のごく一部にしか使えない	
 ?
   –? オブジェクトタグを併用する,可変長のタグにするな
      どの工夫が必要	
 ?
下位ビットポインタタグの例	
タグの値	
 型	
             架空の処理系の下位ビットポ
  000(2)	
 小さな整数	
     インタタグの例	
 ?
  001(2)	
 その他の数	
  010(2)	
 リストのノード	
   ?? データオブジェクトは8バイ
  011(2)	
 シンボル	
         ト境界に整列して割り付け
 0100(2)	
 真理値	
          られるとする(3bitが空き)	
 ?
01100(2)	
 空リスト	
11100(2)	
 文字	
                       ?? イミディエイトデータは,3bit
  101(2)	
 文字列	
          より多くのタグを使える	
 ?
  110(2)	
 関数	
        ?? これ以外の型はオブジェクト
  111(2)	
 それ以外	
                          タグで表現	
 ?
64bit	
 ?ARMのTagged	
 ?Pointer機能	
?? ついったーでいろいろ教わったところによると	
 ?
 –? 64bit	
 ?ARMアーキテクチャのアドレス空間は48bit	
 ?
 –? しかし,通常は64bitのポインタの上位16bitに,好
    き勝手な値を入れられるわけではなく,0x0000か
    0xFFFFでないとFaultが起きる	
 ?
 –? Tagged	
 ?Pointerを設定すると,上位8bitに好きな値
    を入れられるようになる…らしい	
 ?
 –? hap://www.arm.com/ja/?les/downloads/
    ARMv8_Architecture.pdf	
 ?(p.16)
参考文献	
1.?    Fred	
 ?W.	
 ?Blair,	
 ?James	
 ?H.	
 ?Griesmer,	
 ?Joseph	
 ?Harry,	
 ?and	
 ?Mark	
 ?Pivovonsky.	
 ?
       Design	
 ?and	
 ?Development	
 ?Document	
 ?for	
 ?LISP	
 ?on	
 ?Several	
 ?S/360	
 ?Opera`ng	
 ?
       Systems.	
 ?IBM	
 ?Research,	
 ?Yorktown	
 ?Heights,	
 ?New	
 ?York,	
 ?revised	
 ?June	
 ?24,	
 ?
       1971	
 ?
      hap://www.sonwarepreserva`on.org/projects/LISP/ibm/Blair-?‐LISP360.pdf/view	
 ?
      手法1の解説がある	
 ?
2.?    M.	
 ?Nakanishi,	
 ?C.	
 ?Hishinuma,	
 ?K.	
 ?Yamashita,	
 ?and	
 ?T.	
 ?Sakai.	
 ?A	
 ?Design	
 ?of	
 ?Lisp	
 ?
       Interpreter	
 ?for	
 ?Minicomputers,	
 ?Proceedings	
 ?of	
 ?the	
 ?IFIP	
 ?TC-?‐2	
 ?Working	
 ?
       Conference	
 ?on	
 ?Sonware	
 ?for	
 ?Minicomputers,	
 ?pp.89-?‐95,	
 ?Lake	
 ?Balaton,	
 ?
       Hungary,	
 ?September	
 ?1975	
 ?
      これも手法1を使っていると伝え聞いているが,読んでいない	
 ?
3.?    Guy	
 ?Steele,	
 ?Jr.	
 ?Data	
 ?representa`on	
 ?in	
 ?PDP-?‐10	
 ?MACLISP.	
 ?MIT	
 ?AI	
 ?Memo	
 ?
       421,	
 ?Massachuseas	
 ?Ins`tute	
 ?of	
 ?Technology,	
 ?September	
 ?1977.	
 ?	
 ?
      hap://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/
      19780016892_1978016892.pdf	
 ?
      BIBOPを使った代表的処理系MacLISPのデータ表現の説明	
 ?
参考文献	
4.? R.	
 ?Kent	
 ?Dybvig,	
 ?David	
 ?Eby,	
 ?Carl	
 ?Bruggeman,	
 ?Don't	
 ?Stop	
 ?the	
 ?BIBOP:	
 ?
    Flexible	
 ?and	
 ?E?cient	
 ?Storage	
 ?Management	
 ?for	
 ?Dynamically-?‐Typed	
 ?
    Languages.	
 ?Indiana	
 ?University	
 ?Computer	
 ?Science	
 ?Department	
 ?
    Technical	
 ?Report	
 ?#400,	
 ?March	
 ?1994	
 ?
     hap://www.cs.indiana.edu/cgi-?‐bin/techreports/TRNNN.cgi?trnum=TR400	
 ?
5.? 近山 隆 U`lispシステムの開発 IPSJ	
 ?Journal	
 ?24(5),	
 ?599-?‐604,	
 ?
    1983-?‐09-?‐15	
 ?Informa`on	
 ?Processing	
 ?Society	
 ?of	
 ?Japan	
 ?
     hap://ci.nii.ac.jp/naid/110002723809	
 ?
     上位ビットポインタタグを用いたLispシステム	
 ?
6.? J.	
 ?P.	
 ?Fitch,	
 ?A.	
 ?C.	
 ?Norman	
 ?Implemen`ng	
 ?LISP	
 ?in	
 ?a	
 ?high-?‐level	
 ?
    language,	
 ?Sonware:	
 ?Prac`ce	
 ?and	
 ?ExperienceVolume	
 ?7,	
 ?Issue	
 ?6,	
 ?
    pages	
 ?713–725,	
 ?November/December	
 ?1977	
 ?
     [5]から,上位ビットポインタタグを用いた先行システムとして参照されて
     いる	
 ?
参考文献	
7.? Adele	
 ?Goldberg	
 ?and	
 ?David	
 ?Robson,	
 ?Smalltalk-?‐80:	
 ?The	
 ?Language	
 ?
    and	
 ?its	
 ?Implementa`on,	
 ?Addison	
 ?Wesley,	
 ?1983.	
 ?	
 ?
     hap://wiki.squeak.org/squeak/64	
 ?
     下位1ビットのタグを用いている	
 ?
8.? Glenn	
 ?S.	
 ?Burke,	
 ?George	
 ?J.	
 ?Carreae,	
 ?and	
 ?Christopher	
 ?R.	
 ?Eliot.	
 ?NIL	
 ?
    Reference	
 ?Manual	
 ?corresponding	
 ?to	
 ?Release	
 ?0.286.	
 ?Report	
 ?MIT/
    LCS/TR-?‐311,	
 ?January	
 ?1984	
 ?
     hap://www.sonwarepreserva`on.org/projects/LISP/MIT/Burke_et_al-?‐
     NIL_Reference_Manual_0286-?‐1984.pdf/view	
 ?
     下位2ビットのタグを用いていると[9]で解説されている処理系NIL(New	
 ?
     Implementa`on	
 ?of	
 ?Lisp)のマニュアル.データ表現の解説はない.	
 ?
9.? Richard	
 ?P.	
 ?Gabriel,	
 ?Performance	
 ?and	
 ?Evalua`on	
 ?of	
 ?Lisp	
 ?Systems,	
 ?
    The	
 ?MIT	
 ?Press,	
 ?August,	
 ?1985	
 ?
     NILを含むさまざまなLispシステムの実装の概要と,有名なGabriel	
 ?
     Benchmarkによる性能評価結果	
 ?

More Related Content

実行时のデータ型の表现手法

  • 1. 実行时のデータ型の表现手法 ? Ver. ?1.02 ? 2012-?‐11-?‐24 前田敦司
  • 2. このスライドの目的 ?? 64bit ?ARMアーキテクチャのTagged ?Pointer機 能が話題になった ? ?? よい機会なので,実行時にデータ型を判別す るためのデータ表現をまとめておこうと思った ? ?? ホットなトピックというより,大昔からの,いわ ば教科書的な話題だが,教科書にはあんまり 載ってない ? ?? 手法の選択にはGCやメモリ管理との相互作 用も絡むのだが,ほぼバッサリ省略
  • 3. 実行時になぜデータ型を判別する ? 必要があるのか? ?? 動的型付き言語 ? –? 変数に静的な(=実行前の?コンパイル時の)型 が付いていない ? –? 実行するまで,どんな型のデータが入るかわから ない ? ?? 多相型とGC ? –? 整数のリストも文字列のリストも受け取れる関数 の引数…GCが,ポインタを追跡する手がかり
  • 4. 実行時の型判別の基本操作 ?? is_type(x, ?t) ? ? –? データxの型はtか? ? –? 真偽値を返す.エラーは起きない. ? ?? typecase(x) ?case ?t1=>…; ?case ?t2=>…; ?… ? –? データxの型に応じて多方向分岐 ? –? エラーは起きない ? ?? 型エラーの動的チェック(check_type) ? –? データxが期待した型(たとえば,整数加算に対して整 数オペランド)なら正常に演算を行う ? –? そうでないならエラー
  • 5. 前提:データ表現の一様性 ?? 動的データ型や多相型では,一般に,すべて のデータが一様に表現されている必要がある ? –? 変数の記憶領域はすべて同じサイズ ? –? 配列やリストの要素も同じサイズ ? –? データ型の表現法も標準化 ? –? boxed表現などという(cf. ?boxing, ?unboxing) ? ?? 効率を考えると,サイズは1ワード(CPUが自 然に扱える特定のサイズ)に揃えるのが便利 ? ?? 1ワードに収まらないデータは?
  • 6. データサイズの一様化とポインタ ?? すべてのデータのサイズを1ワードに揃える 手法の例(仮にオブジェクトタグと呼ぶ): ? –? 変数や配列にはポインタを入れる ? –? 実際のデータ本体は,別の場所(ヒープ)に置く ? –? 本体のヘッダに,型やサイズの情報を入れる ? 型?サイズ 変数x データ 変数y 型?サイズ データ
  • 7. オブジェクトタグでの基本操作 ?? is_type(x, ?t) ? –? xのポインタをたどり,ヘッダの型コードを読みだし てtと照合 ? ?? typecase(x) ? –? xのポインタをたどり,ヘッダの型コードを読みだし て多方向分岐(テーブルジャンプ等) ? ?? check_type ? –? is_type(x, ?t)で型を確認してから演算を実行 ?
  • 8. オブジェクトタグの欠点 ?? メモリのオーバーヘッドが大きい –? ポインタとヘッダの領域がオーバーヘッドとなる ? –? 本体が1ワードなら,計3ワードが必要 ? ?? 速度的なオーバーヘッド ? –? 整数をこの形式で表すと,たとえば加算は… ? ?? 左辺のポインタをたどり,ヘッダを読んで整数であることを 確認し,本体の整数データを読み出す ? ?? 右辺も同様 ? ?? 加算命令の結果にヘッダを付けてヒープにアロケートし,そ の領域へのポインタを結果とする…ゴミが大量に出る ?
  • 9. 改良手法1:イミディエイトデータのアド レスへのマップ ?? たとえば値の小さな整数などを,ヒープ以外 のアドレスを指すポインタにマップする 例) ? ポインタ値pがboundaryより小さい時,整数 boundary boundary-?‐pを表していると見なす. ? ? ?? メモリの節約:小さい整数は1ワード ? ?? 速度の節約:整数演算は速くなる ? ヒープ ?? その他のデータの操作には「ヒープを指して いる事」を確認するオーバーヘッドがかかる
  • 10. 手法2:BIBOP ?? Big ?Bag ?of ?Pagesの略;たぶんビーバップと読む ? ?? ヒープを2のべき乗サイズ(たとえば4KiB)の ページに分ける ? ?? 1つのページには,1つの型のデータだけ入 れる ページ0 ヒープのbase ? ? ? ? ? ? ? ? ? ? ? ?1 整数データが入るページ ? ? ? ? ? ? ? ? ? ? ? ?2 浮動小数点数データが入るページ ? ? ? ? ? ? ? ? ? ? ? ?3 リストデータが入るページ ? ? ? ? ? ? ? ? ? ? ? ?4
  • 11. BIBOPでの型判別基本操作 ?? ページ管理表に型情報を入れておく ? ?? ポインタ値 ?x ?からヒープのbaseアドレスを引き, 右にシフトしてページ管理表を引く ? ヒープのbase ページ0 x ?-?‐ ?base ? ? ? ? ? ? ? ? ? ? ? ?1 ポインタx ページ番号 オフセット12bit ? ? ? ? ? ? ? ? ? ? ? ?2 ページ管理表 0 ? 1 ? 補注:文献[3]のマシンは1ワード36bit, ? ? ? ? ? ? ? ? ? ? ? ? ?3 2 ? アドレスはワード単位18bitなので, ? ? ? ? ? ? ? ? ? ? ? ? ?4 3 ? ?? 1ワードにポインタ2個が入る ? 4 ?? ポインタ中のbitは全く空きがない ? (後述のポインタタグには向かない)
  • 12. BIBOPの利点 ?? メモリ効率はオブジェクトタグよりずっとよい ? –? オブジェクトごとに型情報を保つ必要はない ? ?? 型判別操作の速度もそう遅くない ? –? メモリアクセス回数は1回のまま ? ?? 多種類の型の領域をかなり柔軟に管理できる ? ?? 速度オーバーヘッドは? ? –? 小さな整数は,あらかじめ順序良く並べて割り当てて おけばアドレスと簡単にマッピングできる(ポインタを たどって普通に本体を取り出すこともできる)
  • 13. 手法3:ポインタタグ ?? Tagged ?pointer…ポインタ内に型情報を埋め 込む ? ?? 観察:ポインタのすべてのビットが有効な情報 を表しているわけではない ? –? たとえば,最近のバイトアドレスマシンで,ワード 以上のサイズのデータを指すポインタは,下位の 2?3bitがたいていゼロ ? –? また,64bitマシンでも,アドレス空間はそんなに なかったりする(上位ビットは実際は使ってない) ? ?
  • 14. ポインタタグ(Tagged ?Pointer)とは ?? ポインタ中の,使っていないビットに型情報を 埋め込む ? ?? 残りのビットで,データの値を表す ? –? ポインタの指すアドレス ? –? 文字や小さい整数等のイミディエイトデータ ? ?? メモリアクセスなしで型を判別できる事が多い ? ?? イミディエイトデータはヒープに割り当てずに すむ…メモリ効率,速度効率の向上 ?
  • 15. バリエーション:ポインタの上位ビット にタグ ?? 例: ?IBM ?System ?360, ?Motorola ?MC68000等は, ポインタが32bitだが,アドレス空間は24bitで, 上位8bitは無視される ? → ?上位8bitに型を表すコードを入れることができる ? ? 型タグ8bit 有効なアドレス24bit ? typecase操作:シフトして型タグを取り出す ? is_type, ?check_type:比較1回?2回 ?
  • 16. 上位ビットポインタタグの比較 型タグ8bit 有効なアドレス24bit ?? 型タグが上位にあるので,シフトは不要で単 に大小比較すればよい ? ?? 符号なし,符号付き比較,型の包含関係を工 夫すれば,多くの場合1回の比較ですむ ?? たとえば「型タグが0x00か」の検査は, 「0x01000000より符号なし比較で小さいか」を 調べれば良い ?
  • 17. 上位ビットポインタタグの例 タグの値 型 0x00 小さな整数 Lisp系言語での架空の ? 0x01 Bignum 整数 タグ値の例 ? 数値 ? 0x02 Float ?? 小さな整数は(符号 0x03 複素数 なしで良いなら)変 換なしで演算できる ? … … ?? 整数,数値,配列, 0x7d 多次元配列 1次元配列,文字 0x7e ベクター 配列 列,シンボル,リス ト,リストのノード等 0x7f 文字列 は1回の比較で判 0x80 シンボル 別できる ? 0x81 構造体 ?? (実際は,ベンチ マークでどの型を … … 優先するか決める) 0xfe 空リスト(nil) 0x? リストのノード リスト
  • 18. 上位ビットポインタタグの得失 ?? 32bitワード,24bitアドレスの時代には,かな り多くのビットが型判別に使えた ? ?? オブジェクトタグよりメモリアクセスが少ないの は大きな利点 ? ?? 欠点 ? –? 上位bitを無視してくれるCPUでないと,ポインタア クセス毎に比較的大きなオーバーヘッドがかかる ? –? 無視してくれるCPUでも,数年するとアドレス空間 が足りなくなったりする(実際,そうなった)
  • 19. バリエーション:ポインタの下位ビット にタグ ?? たとえば32bitのバイトアドレスマシン(1ワー ド4バイト)で,データオブジェクトのサイズが1 ワード以上なら,下位に2bit以上使わないビッ トができる ? –? 間接アクセス時に,インデックスでタグを打ち消す ことにより,マスクしないでアクセス可能 ? 例) ? ?リストのノード(CONS対)のタグが2進数01のとき 2つの要素を読み出すには,それぞれ ?p ?– ?1, ?p ?+ ?3 ? 番地を読み出せばよい
  • 20. 下位ビットポインタタグの利点 ?? 小さな整数に下位 ?00 ?(2) ?のタグを割り当てると ? –? 30bit符号付き…加減算はマスクもシフトも不要 ? –? ワードのインデックスに使う際も便利 ? –? SPARCのtadcc ?(tagged ?add ?set ?condi`on ?code)命令は, オペランドの下位2ビットが00(2)でないとトラップを引 き起こす整数加算…check_typeの命令が不要 ? ?? CPUによっては,アラインされていないメモリアク セスをトラップできる(バスエラー等) ? –? タグ付きポインタアクセスのcheck_typeの命令が不要
  • 21. 下位ビットポインタタグの得失 ?? is_type, ?type_case ? –? 下位ビットのみマスクして取り出す ? –? 上位ビット ポインタタグより少し手間 ? ?? check_type ? –? 前述のとおり,CPUによっては,事実上コスト無しで行 える場合がある ? ?? 使えるbit数が少ないのが欠点 ? –? 型判別のごく一部にしか使えない ? –? オブジェクトタグを併用する,可変長のタグにするな どの工夫が必要 ?
  • 22. 下位ビットポインタタグの例 タグの値 型 架空の処理系の下位ビットポ 000(2) 小さな整数 インタタグの例 ? 001(2) その他の数 010(2) リストのノード ?? データオブジェクトは8バイ 011(2) シンボル ト境界に整列して割り付け 0100(2) 真理値 られるとする(3bitが空き) ? 01100(2) 空リスト 11100(2) 文字 ?? イミディエイトデータは,3bit 101(2) 文字列 より多くのタグを使える ? 110(2) 関数 ?? これ以外の型はオブジェクト 111(2) それ以外 タグで表現 ?
  • 23. 64bit ?ARMのTagged ?Pointer機能 ?? ついったーでいろいろ教わったところによると ? –? 64bit ?ARMアーキテクチャのアドレス空間は48bit ? –? しかし,通常は64bitのポインタの上位16bitに,好 き勝手な値を入れられるわけではなく,0x0000か 0xFFFFでないとFaultが起きる ? –? Tagged ?Pointerを設定すると,上位8bitに好きな値 を入れられるようになる…らしい ? –? hap://www.arm.com/ja/?les/downloads/ ARMv8_Architecture.pdf ?(p.16)
  • 24. 参考文献 1.? Fred ?W. ?Blair, ?James ?H. ?Griesmer, ?Joseph ?Harry, ?and ?Mark ?Pivovonsky. ? Design ?and ?Development ?Document ?for ?LISP ?on ?Several ?S/360 ?Opera`ng ? Systems. ?IBM ?Research, ?Yorktown ?Heights, ?New ?York, ?revised ?June ?24, ? 1971 ? hap://www.sonwarepreserva`on.org/projects/LISP/ibm/Blair-?‐LISP360.pdf/view ? 手法1の解説がある ? 2.? M. ?Nakanishi, ?C. ?Hishinuma, ?K. ?Yamashita, ?and ?T. ?Sakai. ?A ?Design ?of ?Lisp ? Interpreter ?for ?Minicomputers, ?Proceedings ?of ?the ?IFIP ?TC-?‐2 ?Working ? Conference ?on ?Sonware ?for ?Minicomputers, ?pp.89-?‐95, ?Lake ?Balaton, ? Hungary, ?September ?1975 ? これも手法1を使っていると伝え聞いているが,読んでいない ? 3.? Guy ?Steele, ?Jr. ?Data ?representa`on ?in ?PDP-?‐10 ?MACLISP. ?MIT ?AI ?Memo ? 421, ?Massachuseas ?Ins`tute ?of ?Technology, ?September ?1977. ? ? hap://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/ 19780016892_1978016892.pdf ? BIBOPを使った代表的処理系MacLISPのデータ表現の説明 ?
  • 25. 参考文献 4.? R. ?Kent ?Dybvig, ?David ?Eby, ?Carl ?Bruggeman, ?Don't ?Stop ?the ?BIBOP: ? Flexible ?and ?E?cient ?Storage ?Management ?for ?Dynamically-?‐Typed ? Languages. ?Indiana ?University ?Computer ?Science ?Department ? Technical ?Report ?#400, ?March ?1994 ? hap://www.cs.indiana.edu/cgi-?‐bin/techreports/TRNNN.cgi?trnum=TR400 ? 5.? 近山 隆 U`lispシステムの開発 IPSJ ?Journal ?24(5), ?599-?‐604, ? 1983-?‐09-?‐15 ?Informa`on ?Processing ?Society ?of ?Japan ? hap://ci.nii.ac.jp/naid/110002723809 ? 上位ビットポインタタグを用いたLispシステム ? 6.? J. ?P. ?Fitch, ?A. ?C. ?Norman ?Implemen`ng ?LISP ?in ?a ?high-?‐level ? language, ?Sonware: ?Prac`ce ?and ?ExperienceVolume ?7, ?Issue ?6, ? pages ?713–725, ?November/December ?1977 ? [5]から,上位ビットポインタタグを用いた先行システムとして参照されて いる ?
  • 26. 参考文献 7.? Adele ?Goldberg ?and ?David ?Robson, ?Smalltalk-?‐80: ?The ?Language ? and ?its ?Implementa`on, ?Addison ?Wesley, ?1983. ? ? hap://wiki.squeak.org/squeak/64 ? 下位1ビットのタグを用いている ? 8.? Glenn ?S. ?Burke, ?George ?J. ?Carreae, ?and ?Christopher ?R. ?Eliot. ?NIL ? Reference ?Manual ?corresponding ?to ?Release ?0.286. ?Report ?MIT/ LCS/TR-?‐311, ?January ?1984 ? hap://www.sonwarepreserva`on.org/projects/LISP/MIT/Burke_et_al-?‐ NIL_Reference_Manual_0286-?‐1984.pdf/view ? 下位2ビットのタグを用いていると[9]で解説されている処理系NIL(New ? Implementa`on ?of ?Lisp)のマニュアル.データ表現の解説はない. ? 9.? Richard ?P. ?Gabriel, ?Performance ?and ?Evalua`on ?of ?Lisp ?Systems, ? The ?MIT ?Press, ?August, ?1985 ? NILを含むさまざまなLispシステムの実装の概要と,有名なGabriel ? Benchmarkによる性能評価結果 ?