SlideShare a Scribd company logo
Delimited Dynamic Binding
yuyuchazuke
December 6, 2015
Dynamic binding と delimited control
dynamic binding と delimited control を一緒に使いたい
モバイルコード
Web アプリケーション
データベースカーソル
たくさんある dynamic binding のうち、一部だけを含む
限定継続を捕捉したい
しかし、dynamic binding と delimited control の相互作
用はまだ議論されていない
Contributions
dynamic variable と delimited control をともに含む言語
の意味論を形式化
delimited-control prompt を使って dynamic variable を
macro-express
Moreau (1998) に対して sound な型システムを導入
Scheme, OCaml, and Haskell で実装
mutable dynamic variables や stack inspection にも対応
Static binding と dynamic binding
static な変数は、プログラムの lexical な構造から値が
決まる
let x = 0 in
let f () = x in
let x = 1 in
f () ;; → 0
dynamic な変数は、それを含む関数などが呼び出され
たときの環境から値が決まる
dlet x = 0 in
let f () = x in
dlet x = 1 in
f () ;; → 1
Dynamic binding の言語 DB
Dynamic binding の言語 DB
OCaml での実装
τ dynvar
τ 型のパラメータに対する abstract type constructor
dnew : unit -> ’a dynvar
Σ から τ 型のパラメータを選んでくる
dref : ’a dynvar -> ’a
パラメータの現在の値にアクセスする
dlet : ’a dynvar -> ’a -> (unit -> ’b) -> ’b
dlet p = V in M を表す
プログラムの例
let p = dnew () in
dlet p 0 (fun () ->
let f = fun () -> dref p in
let x = f () in
let y = dlet p 1 (fun () -> f ()) in
let z = f () in (x, y, z))
→ (0, 1, 0)
プログラムの例
let p = dnew () in
dlet p 0 (fun () ->
let f = fun () -> dref p in
let x = f () in
let y = dlet p 1 (fun () -> f ()) in
let z = f () in (x, y, z))
限定継続の言語 DC
限定継続の言語 DC
OCaml での実装
τ prompt
τ 型のプロンプトに対する abstract type constructor
new prompt : unit -> ’a prompt
新しいプロンプトを作る
push prompt : ’a prompt -> (unit -> ’a) -> ’a
reset p in M を表す
shift : ’a prompt -> ((’b -> ’a) -> ’a) -> ’b
shift p as f in M を表す
プログラムの例
let p = new prompt () in
push prompt p (fun () ->
1 + shift p (fun f -> f (f 2)))
f = push prompt p (fun () -> 1 + [ . ])
プログラムの例
let p = new prompt () in
push prompt p (fun () ->
1 + shift p (fun f -> f (f 2)))
プログラムの例
let p = new prompt () in
push prompt p (fun () ->
1 + shift p (fun f -> f (f 2)))
従来の実装の問題
dlet p = 1 in reset in p
→ 1?
dlet p = 1 in reset in dlet p = 2 in shift as f in p
→ 1?
(λf. dlet p = 2 in dlet r = 20 in f(0))
(dlet p = 1 in reset in dlet r = 10 in
(λx. p + r)(shift p as f in f))
→ 12?
DB から DC への翻訳: Ver. 1
問題点
dlet p = V in M の型は p の型と無関係
reset p in M と p はともに M と同じ型を持つ
問題点
let p = dnew () in
dlet p 0 (fun () ->
let f = fun () -> dref p in
let x = f () in
let y = dlet p 1 (fun () -> f ()) in
let z = f () in (x, y, z))
→ (0, 1, 0)
dlet に対する push prompt :
int -> int
dlet に対する push prompt :
int -> (int * int * int)
DB から DC への翻訳: Ver. 2
dlet p = V in ... が値 z になったら、delimited
context を abort し、プロンプト q までジャンプする
ignore = λx. Ω : τ1 → τ2 は、reset p in ... が値を
返さないことを保障
OCaml では
let ignore x = failwith "cannot happen".
OCaml での実装
type ’a dynvar = (’a -> ’a) prompt
let dnew () = new prompt ()
let dref p = shift p (fun x -> fun v -> x v v)
let dlet p v body =
let q = new prompt () in
push prompt q (fun () ->
ignore ((push prompt p (fun () ->
(fun z -> shift q (fun -> z))
(body ())))
v))
発展:mutable dynamic variables
現在の環境における p の値を返す
同じ環境における p の値を V ′
に更新
発展:stack inspection
関数 V を p の現在の値に適用
関数適用が行われるのは dlet p = V ′
in ... の外側
過去の binding にアクセスできる
実装の戦略
Deep binding
dynamic environment を binding のリストで表す
binding: O(1), lookup: O(n)
一番素直な方法
Shallow binding
各パラメータの現在の値を mutable cell に格納する
binding: O(1), lookup: O(1)
control facility がないときに効率的
Acquaintance vectors
immutable table を使ってパラメータを値に map する
binding: O(n), lookup: O(1)
lookup が多く、パラメータが少ない場合に効率的
まとめ
dynamic binding と delimited control をともに含む言語
を形式化
execution context と dynamic environment は同じもの
delimited dynamic binding という新たな概念を提案
限定継続は dynamic environment の一部を含む
それを reinstantiate するのは、dynamic environment を
supplement することにあたる

More Related Content

What's hot

Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for cmiura1729
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4Takeshi Yamamuro
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮JAVA DM
 
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
CODE BLUE
 
Java電卓勉強会資料
Java電卓勉強会資料Java電卓勉強会資料
Java電卓勉強会資料Toshio Ehara
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続
7shi
 
[Basic 13] 型推論 / 最適化とコード出力
[Basic 13] 型推論 / 最適化とコード出力[Basic 13] 型推論 / 最適化とコード出力
[Basic 13] 型推論 / 最適化とコード出力
Yuto Takei
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
7shi
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
Toshio Ehara
 
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
Appresso Engineering Team
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力
imuyaoti
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
X hago2 shortcoding 20110827
X hago2 shortcoding 20110827X hago2 shortcoding 20110827
X hago2 shortcoding 20110827
uskey512
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日nukaemon
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHCKei Hibino
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 

What's hot (20)

Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for c
 
llvm入門
llvm入門llvm入門
llvm入門
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮
 
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
 
Java電卓勉強会資料
Java電卓勉強会資料Java電卓勉強会資料
Java電卓勉強会資料
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続
 
[Basic 13] 型推論 / 最適化とコード出力
[Basic 13] 型推論 / 最適化とコード出力[Basic 13] 型推論 / 最適化とコード出力
[Basic 13] 型推論 / 最適化とコード出力
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
 
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
前期講座09
前期講座09前期講座09
前期講座09
 
X hago2 shortcoding 20110827
X hago2 shortcoding 20110827X hago2 shortcoding 20110827
X hago2 shortcoding 20110827
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHC
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 

Similar to Delimited Dynamic Binding

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂
 
R intro
R introR intro
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装する
Shuhei Iitsuka
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
Shiqiao Du
 
Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用
Seiya Tokui
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
bleis tift
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
Masaki Hara
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
Masaki Hara
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
SatoYu1ro
 
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
Takeshi Takaishi
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
Shiqiao Du
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
Shin-ya Koga
 
181107 06
181107 06181107 06
181107 06
openrtm
 
大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter
maruyama097
 

Similar to Delimited Dynamic Binding (20)

Rの高速化
Rの高速化Rの高速化
Rの高速化
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
R intro
R introR intro
R intro
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装する
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
 
181107 06
181107 06181107 06
181107 06
 
大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter
 

Delimited Dynamic Binding

  • 2. Dynamic binding と delimited control dynamic binding と delimited control を一緒に使いたい モバイルコード Web アプリケーション データベースカーソル たくさんある dynamic binding のうち、一部だけを含む 限定継続を捕捉したい しかし、dynamic binding と delimited control の相互作 用はまだ議論されていない
  • 3. Contributions dynamic variable と delimited control をともに含む言語 の意味論を形式化 delimited-control prompt を使って dynamic variable を macro-express Moreau (1998) に対して sound な型システムを導入 Scheme, OCaml, and Haskell で実装 mutable dynamic variables や stack inspection にも対応
  • 4. Static binding と dynamic binding static な変数は、プログラムの lexical な構造から値が 決まる let x = 0 in let f () = x in let x = 1 in f () ;; → 0 dynamic な変数は、それを含む関数などが呼び出され たときの環境から値が決まる dlet x = 0 in let f () = x in dlet x = 1 in f () ;; → 1
  • 7. OCaml での実装 τ dynvar τ 型のパラメータに対する abstract type constructor dnew : unit -> ’a dynvar Σ から τ 型のパラメータを選んでくる dref : ’a dynvar -> ’a パラメータの現在の値にアクセスする dlet : ’a dynvar -> ’a -> (unit -> ’b) -> ’b dlet p = V in M を表す
  • 8. プログラムの例 let p = dnew () in dlet p 0 (fun () -> let f = fun () -> dref p in let x = f () in let y = dlet p 1 (fun () -> f ()) in let z = f () in (x, y, z)) → (0, 1, 0)
  • 9. プログラムの例 let p = dnew () in dlet p 0 (fun () -> let f = fun () -> dref p in let x = f () in let y = dlet p 1 (fun () -> f ()) in let z = f () in (x, y, z))
  • 12. OCaml での実装 τ prompt τ 型のプロンプトに対する abstract type constructor new prompt : unit -> ’a prompt 新しいプロンプトを作る push prompt : ’a prompt -> (unit -> ’a) -> ’a reset p in M を表す shift : ’a prompt -> ((’b -> ’a) -> ’a) -> ’b shift p as f in M を表す
  • 13. プログラムの例 let p = new prompt () in push prompt p (fun () -> 1 + shift p (fun f -> f (f 2))) f = push prompt p (fun () -> 1 + [ . ])
  • 14. プログラムの例 let p = new prompt () in push prompt p (fun () -> 1 + shift p (fun f -> f (f 2)))
  • 15. プログラムの例 let p = new prompt () in push prompt p (fun () -> 1 + shift p (fun f -> f (f 2)))
  • 16. 従来の実装の問題 dlet p = 1 in reset in p → 1? dlet p = 1 in reset in dlet p = 2 in shift as f in p → 1? (λf. dlet p = 2 in dlet r = 20 in f(0)) (dlet p = 1 in reset in dlet r = 10 in (λx. p + r)(shift p as f in f)) → 12?
  • 17. DB から DC への翻訳: Ver. 1
  • 18. 問題点 dlet p = V in M の型は p の型と無関係 reset p in M と p はともに M と同じ型を持つ
  • 19. 問題点 let p = dnew () in dlet p 0 (fun () -> let f = fun () -> dref p in let x = f () in let y = dlet p 1 (fun () -> f ()) in let z = f () in (x, y, z)) → (0, 1, 0) dlet に対する push prompt : int -> int dlet に対する push prompt : int -> (int * int * int)
  • 20. DB から DC への翻訳: Ver. 2 dlet p = V in ... が値 z になったら、delimited context を abort し、プロンプト q までジャンプする ignore = λx. Ω : τ1 → τ2 は、reset p in ... が値を 返さないことを保障 OCaml では let ignore x = failwith "cannot happen".
  • 21. OCaml での実装 type ’a dynvar = (’a -> ’a) prompt let dnew () = new prompt () let dref p = shift p (fun x -> fun v -> x v v) let dlet p v body = let q = new prompt () in push prompt q (fun () -> ignore ((push prompt p (fun () -> (fun z -> shift q (fun -> z)) (body ()))) v))
  • 22. 発展:mutable dynamic variables 現在の環境における p の値を返す 同じ環境における p の値を V ′ に更新
  • 23. 発展:stack inspection 関数 V を p の現在の値に適用 関数適用が行われるのは dlet p = V ′ in ... の外側 過去の binding にアクセスできる
  • 24. 実装の戦略 Deep binding dynamic environment を binding のリストで表す binding: O(1), lookup: O(n) 一番素直な方法 Shallow binding 各パラメータの現在の値を mutable cell に格納する binding: O(1), lookup: O(1) control facility がないときに効率的 Acquaintance vectors immutable table を使ってパラメータを値に map する binding: O(n), lookup: O(1) lookup が多く、パラメータが少ない場合に効率的
  • 25. まとめ dynamic binding と delimited control をともに含む言語 を形式化 execution context と dynamic environment は同じもの delimited dynamic binding という新たな概念を提案 限定継続は dynamic environment の一部を含む それを reinstantiate するのは、dynamic environment を supplement することにあたる