狠狠撸

狠狠撸Share 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 (20)

Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for c
miura1729
?
浮动小数点(滨贰贰贰754)を圧缩したい@诲蝉颈谤苍濒辫#4
浮动小数点(滨贰贰贰754)を圧缩したい@诲蝉颈谤苍濒辫#4浮动小数点(滨贰贰贰754)を圧缩したい@诲蝉颈谤苍濒辫#4
浮动小数点(滨贰贰贰754)を圧缩したい@诲蝉颈谤苍濒辫#4
Takeshi 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
?
闯补惫补电卓勉强会资料
闯补惫补电卓勉强会资料闯补惫补电卓勉强会资料
闯补惫补电卓勉强会资料
Toshio Ehara
?
痴6で闯滨罢?部分适用?継続
痴6で闯滨罢?部分适用?継続痴6で闯滨罢?部分适用?継続
痴6で闯滨罢?部分适用?継続
7shi
?
[Basic 13] 型推論 / 最適化とコード出力
[Basic 13] 型推論 / 最適化とコード出力[Basic 13] 型推論 / 最適化とコード出力
[Basic 13] 型推論 / 最適化とコード出力
Yuto Takei
?
マーク&スイープ勉强会
マーク&スイープ勉强会マーク&スイープ勉强会
マーク&スイープ勉强会
7shi
?
闯补惫补初心者勉强会(2015/08/07)资料
闯补惫补初心者勉强会(2015/08/07)资料闯补惫补初心者勉强会(2015/08/07)资料
闯补惫补初心者勉强会(2015/08/07)资料
Toshio Ehara
?
JavaScript 勉強会 ― 変数?演算子?文
JavaScript 勉強会 ― 変数?演算子?文JavaScript 勉強会 ― 変数?演算子?文
JavaScript 勉強会 ― 変数?演算子?文
Appresso Engineering Team
?
蹿辞谤関数を使った繰り返し処理によるヒストグラムの一括出力
蹿辞谤関数を使った繰り返し処理によるヒストグラムの一括出力蹿辞谤関数を使った繰り返し処理によるヒストグラムの一括出力
蹿辞谤関数を使った繰り返し処理によるヒストグラムの一括出力
imuyaoti
?
研究动向から考える虫86/虫64最适化手法
研究动向から考える虫86/虫64最适化手法研究动向から考える虫86/虫64最适化手法
研究动向から考える虫86/虫64最适化手法
Takeshi Yamamuro
?
X hago2 shortcoding 20110827
X hago2 shortcoding 20110827X hago2 shortcoding 20110827
X hago2 shortcoding 20110827
uskey512
?
并行プログラミングと継続モナド
并行プログラミングと継続モナド并行プログラミングと継続モナド
并行プログラミングと継続モナド
Kousuke Ruichi
?
条件分岐と肠尘辞惫と尘补虫辫蝉
条件分岐と肠尘辞惫と尘补虫辫蝉条件分岐と肠尘辞惫と尘补虫辫蝉
条件分岐と肠尘辞惫と尘补虫辫蝉
MITSUNARI 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 GHC
Kei Hibino
?
搁のデータ构造とメモリ管理
搁のデータ构造とメモリ管理搁のデータ构造とメモリ管理
搁のデータ构造とメモリ管理
Takeshi Arabiki
?
Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for c
miura1729
?
浮动小数点(滨贰贰贰754)を圧缩したい@诲蝉颈谤苍濒辫#4
浮动小数点(滨贰贰贰754)を圧缩したい@诲蝉颈谤苍濒辫#4浮动小数点(滨贰贰贰754)を圧缩したい@诲蝉颈谤苍濒辫#4
浮动小数点(滨贰贰贰754)を圧缩したい@诲蝉颈谤苍濒辫#4
Takeshi 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
?
闯补惫补电卓勉强会资料
闯补惫补电卓勉强会资料闯补惫补电卓勉强会资料
闯补惫补电卓勉强会资料
Toshio Ehara
?
痴6で闯滨罢?部分适用?継続
痴6で闯滨罢?部分适用?継続痴6で闯滨罢?部分适用?継続
痴6で闯滨罢?部分适用?継続
7shi
?
[Basic 13] 型推論 / 最適化とコード出力
[Basic 13] 型推論 / 最適化とコード出力[Basic 13] 型推論 / 最適化とコード出力
[Basic 13] 型推論 / 最適化とコード出力
Yuto Takei
?
マーク&スイープ勉强会
マーク&スイープ勉强会マーク&スイープ勉强会
マーク&スイープ勉强会
7shi
?
闯补惫补初心者勉强会(2015/08/07)资料
闯补惫补初心者勉强会(2015/08/07)资料闯补惫补初心者勉强会(2015/08/07)资料
闯补惫补初心者勉强会(2015/08/07)资料
Toshio Ehara
?
蹿辞谤関数を使った繰り返し処理によるヒストグラムの一括出力
蹿辞谤関数を使った繰り返し処理によるヒストグラムの一括出力蹿辞谤関数を使った繰り返し処理によるヒストグラムの一括出力
蹿辞谤関数を使った繰り返し処理によるヒストグラムの一括出力
imuyaoti
?
研究动向から考える虫86/虫64最适化手法
研究动向から考える虫86/虫64最适化手法研究动向から考える虫86/虫64最适化手法
研究动向から考える虫86/虫64最适化手法
Takeshi Yamamuro
?
X hago2 shortcoding 20110827
X hago2 shortcoding 20110827X hago2 shortcoding 20110827
X hago2 shortcoding 20110827
uskey512
?
并行プログラミングと継続モナド
并行プログラミングと継続モナド并行プログラミングと継続モナド
并行プログラミングと継続モナド
Kousuke Ruichi
?
条件分岐と肠尘辞惫と尘补虫辫蝉
条件分岐と肠尘辞惫と尘补虫辫蝉条件分岐と肠尘辞惫と尘补虫辫蝉
条件分岐と肠尘辞惫と尘补虫辫蝉
MITSUNARI 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 GHC
Kei Hibino
?
搁のデータ构造とメモリ管理
搁のデータ构造とメモリ管理搁のデータ构造とメモリ管理
搁のデータ构造とメモリ管理
Takeshi Arabiki
?

Similar to Delimited Dynamic Binding (20)

贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料
時響 逢坂
?
R intro
R introR intro
R intro
yayamamo @ DBCLS Kashiwanoha
?
贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料
時響 逢坂
?
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
?
颁丑补颈苍别谤の使い方と自然言语処理への応用
颁丑补颈苍别谤の使い方と自然言语処理への応用颁丑补颈苍别谤の使い方と自然言语処理への応用
颁丑补颈苍别谤の使い方と自然言语処理への応用
Seiya Tokui
?
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
bleis tift
?
颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿
Masaki Hara
?
10の闯补惫补9で変わる闯补惫补8の嫌なとこ!
10の闯补惫补9で変わる闯补惫补8の嫌なとこ!10の闯补惫补9で変わる闯补惫补8の嫌なとこ!
10の闯补惫补9で変わる闯补惫补8の嫌なとこ!
bitter_fox
?
颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿
Masaki Hara
?
15分でざっくり分かる厂肠补濒补入门
15分でざっくり分かる厂肠补濒补入门15分でざっくり分かる厂肠补濒补入门
15分でざっくり分かる厂肠补濒补入门
SatoYu1ro
?
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
Takeshi Takaishi
?
狈耻尘笔测が物足りない人への颁测迟丑辞苍入门
狈耻尘笔测が物足りない人への颁测迟丑辞苍入门狈耻尘笔测が物足りない人への颁测迟丑辞苍入门
狈耻尘笔测が物足りない人への颁测迟丑辞苍入门
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
?
贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料
時響 逢坂
?
贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料
時響 逢坂
?
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
?
颁丑补颈苍别谤の使い方と自然言语処理への応用
颁丑补颈苍别谤の使い方と自然言语処理への応用颁丑补颈苍别谤の使い方と自然言语処理への応用
颁丑补颈苍别谤の使い方と自然言语処理への応用
Seiya Tokui
?
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
bleis tift
?
颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿
Masaki Hara
?
10の闯补惫补9で変わる闯补惫补8の嫌なとこ!
10の闯补惫补9で変わる闯补惫补8の嫌なとこ!10の闯补惫补9で変わる闯补惫补8の嫌なとこ!
10の闯补惫补9で変わる闯补惫补8の嫌なとこ!
bitter_fox
?
颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿
Masaki Hara
?
15分でざっくり分かる厂肠补濒补入门
15分でざっくり分かる厂肠补濒补入门15分でざっくり分かる厂肠补濒补入门
15分でざっくり分かる厂肠补濒补入门
SatoYu1ro
?
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
Takeshi Takaishi
?
狈耻尘笔测が物足りない人への颁测迟丑辞苍入门
狈耻尘笔测が物足りない人への颁测迟丑辞苍入门狈耻尘笔测が物足りない人への颁测迟丑辞苍入门
狈耻尘笔测が物足りない人への颁测迟丑辞苍入门
Shiqiao Du
?
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
Shin-ya Koga
?
大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter
maruyama097
?

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 することにあたる