Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
scheme処理系の実装
のぶさん@bobuhiro11
だれ??
• のぶさん@bobuhiro11
• 大学3回
• security camp 2013
• Linux Security Module
• UNIX V6読書会
• 7回目で止まってる
• 参加者の方々ごめんなさい

2
話の内容
• schemeの処理系
• 昨年12月頃

• 第一弾を作った
• 純粋なインタプリタ
• マクロなし,GCなし,継続なし
• もうこれschemeちゃうやん
• 現在
• 第二弾を作った
• VM型インタプリタ
• 伝統的マクロあ...
構成
• コンパイラ

• schemeで実装
• 字句解析 → マクロ展開 → CPS変換・クロージャ変換
→ バイトコード生成
• VM

• C言語で実装
• スタックマシン

4
CPS変換
(if E1 E2 E3)
C

→

E1
(lambda (r1)
(if r1 E2 E3))
C C

5
VM
• 6つレジスタ

stack pointer →

arg pointer
closure pointer

• accumulator

return address

• program counter

TAG: end-of-f...
データ表現
• プリミティブ
• 整数,文字,定数
• 1 wordで表現
• typedef intptr_t vm_data;
• 下位2bitにタグ情報を入れる

number

00

char

00001

true

00101
...
バイトコード
>>(disasm ((lambda (x) (* x 2)) 10))
=== code ===
0 0x12000002 ;FRAME

14 0x01000002 ;REFER_LOCAL

1 0x00000060 ;24...
GC...の前に
シンボルテーブル
x
y

スタック

100
200

:

*

20

+

10
end-of-frame

cons

:

コード

ヒープ
:

:
:
NUATE
:
:
:

レジスタ

nil

2

23...
GC
• cheney's copy GCを採用
• cheney → copy GCの中で,幅優先のもの

allocate
FROM

TO

allocate
TO

FROM

GC
TO

FROM
10
cheney's copy GC
• 良いとこ
• デフラグがいらない
• 幅優先のため,うまくやるとマシンスタックを余計に使わない
• 悪いとこ
• 幅優先なので,キャッシュが効きにくい
• 近似的に深さ優先にする手法もあるみたい

• 保守...
残りのトピック
• 末尾呼び出し最適化
• 不必要にフレームを作らない
• 代わりにSHIFT命令で,引数を調節する
• 末尾再帰は問題なし
• マクロ
• Gaucheの力を使って,コンパイル時に展開
• 伝統的マクロ(展開ルールを素直に記述...
デモ
参考
• Three Implementation Models for Scheme
• http://www.cs.indiana.edu/~dyb/papers/3imp.pdf
• The 90 Minute Scheme to C c...
Upcoming SlideShare
Loading in …5
×

scheme処理系の実装

2,265 views

Published on

VM型schemeインタプリタ処理系の実装

Published in: Technology
  • Be the first to comment

scheme処理系の実装

  1. 1. scheme処理系の実装 のぶさん@bobuhiro11
  2. 2. だれ?? • のぶさん@bobuhiro11 • 大学3回 • security camp 2013 • Linux Security Module • UNIX V6読書会 • 7回目で止まってる • 参加者の方々ごめんなさい 2
  3. 3. 話の内容 • schemeの処理系 • 昨年12月頃 • 第一弾を作った • 純粋なインタプリタ • マクロなし,GCなし,継続なし • もうこれschemeちゃうやん • 現在 • 第二弾を作った • VM型インタプリタ • 伝統的マクロあり,GCあり,継続あり • それっぽい 3
  4. 4. 構成 • コンパイラ • schemeで実装 • 字句解析 → マクロ展開 → CPS変換・クロージャ変換 → バイトコード生成 • VM • C言語で実装 • スタックマシン 4
  5. 5. CPS変換 (if E1 E2 E3) C → E1 (lambda (r1) (if r1 E2 E3)) C C 5
  6. 6. VM • 6つレジスタ stack pointer → arg pointer closure pointer • accumulator return address • program counter TAG: end-of-frame • frame pointer arg pointer → • arg pointer : • closure pointer • stack pointer arg1 argn frame pointer → frame pointer arg pointer closure pointer 成長 return address TAG: end-of-frame arg1' arg2' frame pointer' 6
  7. 7. データ表現 • プリミティブ • 整数,文字,定数 • 1 wordで表現 • typedef intptr_t vm_data; • 下位2bitにタグ情報を入れる number 00 char 00001 true 00101 false 01001 nil 01101 eof 10001 undef 10101 object 11 • オブジェクト • ペア,クロージャ,文字列,ボックス • ヒープへ 7
  8. 8. バイトコード >>(disasm ((lambda (x) (* x 2)) 10)) === code === 0 0x12000002 ;FRAME 14 0x01000002 ;REFER_LOCAL 1 0x00000060 ;24 15 0x00000000 ;0 2 0x25000002 ;CONSTNUM 16 0x13000002 ;ARGUMEMT 3 0x00000028 ;10 17 0x03000002 ;REFER_GLOBAL 4 0x13000002 ;ARGUMEMT 18 0x095b5313 ;* 5 0x06000002 ;CLOSE 19 0x14000002 ;SHIFT 6 0x00000000 ;0 20 0x00000008 ;2 7 0x0000002c ;11 21 0x00000004 ;1 8 0x0000005c ;23 22 0x15000002 ;APPLY 9 0x15000002 ;APPLY 23 0x00000008 ;2 10 0x00000004 ;1 24 0x27000002 ;DISASM 11 0x25000002 ;CONSTNUM 25 0x00000002 ;HALT 12 0x00000008 ;2 13 0x13000002 ;ARGUMEMT 8
  9. 9. GC...の前に シンボルテーブル x y スタック 100 200 : * 20 + 10 end-of-frame cons : コード ヒープ : : : NUATE : : : レジスタ nil 2 23 30 9
  10. 10. GC • cheney's copy GCを採用 • cheney → copy GCの中で,幅優先のもの allocate FROM TO allocate TO FROM GC TO FROM 10
  11. 11. cheney's copy GC • 良いとこ • デフラグがいらない • 幅優先のため,うまくやるとマシンスタックを余計に使わない • 悪いとこ • 幅優先なので,キャッシュが効きにくい • 近似的に深さ優先にする手法もあるみたい • 保守的GCと相性が悪い • 今回はオブジェクトかどうかexactに判定できるから問題無し 11
  12. 12. 残りのトピック • 末尾呼び出し最適化 • 不必要にフレームを作らない • 代わりにSHIFT命令で,引数を調節する • 末尾再帰は問題なし • マクロ • Gaucheの力を使って,コンパイル時に展開 • 伝統的マクロ(展開ルールを素直に記述したもの)のみ • 多値 • やってない • Gaucheからの自立 • コンパイラ自身をセルフコンパイルすればおk • でも大変 12
  13. 13. デモ
  14. 14. 参考 • Three Implementation Models for Scheme • http://www.cs.indiana.edu/~dyb/papers/3imp.pdf • The 90 Minute Scheme to C compiler • http://www.iro.umontreal.ca/~boucherd/mslug/meetings/20041020/9 0-min-scc/90-min-scc.pdf • Mona OS developers Wiki • http://wiki.monaos.org/ 14

×