SlideShare a Scribd company logo
scheme処理系の実装
のぶさん@bobuhiro11
だれ??
• のぶさん@bobuhiro11
• 大学3回
• security camp 2013
• Linux Security Module
• UNIX V6読書会
• 7回目で止まってる
• 参加者の方々ごめんなさい

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

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

• 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-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
データ表現
• プリミティブ
• 整数,文字,定数
• 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
バイトコード
>>(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
GC...の前に
シンボルテーブル
x
y

スタック

100
200

:

*

20

+

10
end-of-frame

cons

:

コード

ヒープ
:

:
:
NUATE
:
:
:

レジスタ

nil

2

23

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

allocate
FROM

TO

allocate
TO

FROM

GC
TO

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

• 保守的GCと相性が悪い
• 今回はオブジェクトかどうかexactに判定できるから問題無し

11
残りのトピック
• 末尾呼び出し最適化
• 不必要にフレームを作らない
• 代わりにSHIFT命令で,引数を調節する
• 末尾再帰は問題なし
• マクロ
• Gaucheの力を使って,コンパイル時に展開
• 伝統的マクロ(展開ルールを素直に記述したもの)のみ
• 多値
• やってない
• Gaucheからの自立
• コンパイラ自身をセルフコンパイルすればおk
• でも大変
12
デモ
参考
• 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

More Related Content

PDF
Rx入門
PDF
MmapScanner
PDF
Rx Showcase
PDF
OSSの敵になるのもいいじゃない
PDF
Rubyで実はwritev(2) が使われているはなし
PPTX
UniRx勉強会 reactive extensions inside(公開用)
PDF
いまさら聞けないselectあれこれ
PDF
Using xvim with macvim
Rx入門
MmapScanner
Rx Showcase
OSSの敵になるのもいいじゃない
Rubyで実はwritev(2) が使われているはなし
UniRx勉強会 reactive extensions inside(公開用)
いまさら聞けないselectあれこれ
Using xvim with macvim

What's hot (20)

PDF
async/await不要論
PDF
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
PDF
Presentation on your terminal
PDF
Kotlin vs TypeScript
PPTX
Maglica - A Simple Internal Cloud Tool at #techkayac
PPTX
Web socket and gRPC
PDF
LT#7 Hello coffeeしてきた
PPTX
Gitlab-CIを活かして自動化してみよう
PPTX
Typescriptの中のこと(浅め)
PPTX
Rubyで.netを扱う
PDF
Introduction pp.js
PDF
TravisCI Nightに行ってきたので情報展開
PDF
組み込みLinuxでのGolangのススメ
PDF
ちゃんとWeb会議スライド『Coffee script』
PDF
Linuxのユーザーランドをinitから全てまるごとgolangで書く
PDF
Nc3開発環境(vagrant)構築(Windows編)
PPT
20090121 J QueryからはじめるJava Script~初級編~
PDF
最速で最速のRuby擴張を作る
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
PDF
Engine Yardで作る NetCommons3のクラウド環境
async/await不要論
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Presentation on your terminal
Kotlin vs TypeScript
Maglica - A Simple Internal Cloud Tool at #techkayac
Web socket and gRPC
LT#7 Hello coffeeしてきた
Gitlab-CIを活かして自動化してみよう
Typescriptの中のこと(浅め)
Rubyで.netを扱う
Introduction pp.js
TravisCI Nightに行ってきたので情報展開
組み込みLinuxでのGolangのススメ
ちゃんとWeb会議スライド『Coffee script』
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Nc3開発環境(vagrant)構築(Windows編)
20090121 J QueryからはじめるJava Script~初級編~
最速で最速のRuby擴張を作る
ng-japan 2015 TypeScript+AngularJS 1.3
Engine Yardで作る NetCommons3のクラウド環境
Ad

Similar to scheme処理系の実装 (20)

PDF
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
PPTX
高速な暗号実装のためにしてきたこと
PDF
うわ…私のEmacs力、低すぎ...?
PPTX
WebRTC mediasoup on raspberrypi3
PPTX
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
PDF
Visual Studioで始めるTypeScript開発入門
PDF
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
PDF
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
PDF
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
PDF
コンテナ型仮想化とはなんだったのか
PDF
Spring3.1概要x di
PDF
Observability, Service Mesh and Microservices
PDF
DXライブラリでMMO作ったよ!
PDF
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
PDF
20191120 beyondstudy#21 kitaoka
PPTX
JAZUG クラウドデザインパターンのコードを覗く
PDF
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
PDF
Firefoxの開発プロセス
PDF
20160728 hyperscale #03
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
高速な暗号実装のためにしてきたこと
うわ…私のEmacs力、低すぎ...?
WebRTC mediasoup on raspberrypi3
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Visual Studioで始めるTypeScript開発入門
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
コンテナ型仮想化とはなんだったのか
Spring3.1概要x di
Observability, Service Mesh and Microservices
DXライブラリでMMO作ったよ!
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
20191120 beyondstudy#21 kitaoka
JAZUG クラウドデザインパターンのコードを覗く
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
Firefoxの開発プロセス
20160728 hyperscale #03
Ad

scheme処理系の実装

  • 2. だれ?? • のぶさん@bobuhiro11 • 大学3回 • security camp 2013 • Linux Security Module • UNIX V6読書会 • 7回目で止まってる • 参加者の方々ごめんなさい 2
  • 3. 話の内容 • schemeの処理系 • 昨年12月頃 • 第一弾を作った • 純粋なインタプリタ • マクロなし,GCなし,継続なし • もうこれschemeちゃうやん • 現在 • 第二弾を作った • VM型インタプリタ • 伝統的マクロあり,GCあり,継続あり • それっぽい 3
  • 4. 構成 • コンパイラ • schemeで実装 • 字句解析 → マクロ展開 → CPS変換・クロージャ変換 → バイトコード生成 • VM • C言語で実装 • スタックマシン 4
  • 5. CPS変換 (if E1 E2 E3) C → E1 (lambda (r1) (if r1 E2 E3)) C C 5
  • 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. データ表現 • プリミティブ • 整数,文字,定数 • 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. バイトコード >>(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
  • 10. GC • cheney's copy GCを採用 • cheney → copy GCの中で,幅優先のもの allocate FROM TO allocate TO FROM GC TO FROM 10
  • 11. cheney's copy GC • 良いとこ • デフラグがいらない • 幅優先のため,うまくやるとマシンスタックを余計に使わない • 悪いとこ • 幅優先なので,キャッシュが効きにくい • 近似的に深さ優先にする手法もあるみたい • 保守的GCと相性が悪い • 今回はオブジェクトかどうかexactに判定できるから問題無し 11
  • 12. 残りのトピック • 末尾呼び出し最適化 • 不必要にフレームを作らない • 代わりにSHIFT命令で,引数を調節する • 末尾再帰は問題なし • マクロ • Gaucheの力を使って,コンパイル時に展開 • 伝統的マクロ(展開ルールを素直に記述したもの)のみ • 多値 • やってない • Gaucheからの自立 • コンパイラ自身をセルフコンパイルすればおk • でも大変 12
  • 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