300 likes | 379 Views
移動コードのための言語機構 Code Mobility Support for Stock Programming Languages. 渡部卓雄 JAIST. バックグラウンド. オブジェクト,高階関数や再帰記述とも直交できる移動コード機構 reasoning 可能な記述を支援 現在の計算状態を含めて移動させる 既存の ( 逐次的な)プログラムに入れるだけで移動コードにできる,簡単な機構. “ go ” によるマイグレーション. スレッドの全状態(=継続)の転送 通常,移動する範囲は制限された範囲で十分では? → 部分継続.
E N D
移動コードのための言語機構Code Mobility Support for Stock Programming Languages 渡部卓雄 JAIST SMAF Workshop
バックグラウンド • オブジェクト,高階関数や再帰記述とも直交できる移動コード機構 • reasoning可能な記述を支援 • 現在の計算状態を含めて移動させる • 既存の(逐次的な)プログラムに入れるだけで移動コードにできる,簡単な機構 SMAF Workshop
“go”によるマイグレーション • スレッドの全状態(=継続)の転送 • 通常,移動する範囲は制限された範囲で十分では? → 部分継続 SMAF Workshop
call/ppc (call-with-placed-partial-continuation) • (call/ppc placefunction) • 現時点における部分継続を placeに置き,それに functionを適用する. • functionの適用自体は call/ppc の呼び出しと同じ場所において行われる. SMAF Workshop
% : 同期プロンプト g f (f (g a)) (f (% (g (call/ppc p (lambda (k) (k a)))))) a g f SMAF Workshop
& : 非同期プロンプト (f (& (g (call/ppc p (lambda (k) (k a)))))) dummy a g f SMAF Workshop
go • (% (begin A (go p1) B (go p2) C)) • (& (begin A (go p1) B (go p2) C)) (define (go place) (call/ppc place (lambda (k) (k (current-place))))) SMAF Workshop
A : (f (% (g (call/ppc B (lambda (k1) (& (k1 (h (call/ppc C (lambda (k2) (k2 a)))))))))) B C A h g f SMAF Workshop
(f (g (h a))) (% (f (call/ppc A (lambda (k) (& (k (g (call/ppc B (lambda (k) (& (k (h (call/ppc C (lambda (k) (& (k a))))) ))))))))))) SMAF Workshop
@マクロ (@ p e) ||| (call/ppc p (lambda (k) (& (k e))))) (f (g (h a))) ↓ (% (f (@ p1 (g (@ p2 (h (@ p3 a))))))) ∥ (% (f@p1 (g@p2 (h@p3 a)))) SMAF Workshop
(% (f@A (g@B (h@C a)))) (% (begin (set! tmp a) (go C) (set! tmp (h tmp)) (go B) (set! tmp (g tmp)) (go A) (f tmp))) (% (f (prog1 (g (prog1 (h (prog1 a (go C))) (go B))) (go A))) 上のような go の使い方との違いは? SMAF Workshop
goの場合 B C A h g f SMAF Workshop
h g f @の場合 B C A SMAF Workshop
(# (f@A (g@B (h (call/ppc C (lambda (k) (ntimes n k a))))))) (define (ntimes n f a) (if (= n 0) a (ntimes (- n 1) f (f a)))) SMAF Workshop
実装!? • λクロージャのある言語 • 引数フレームは無限エクステントを持つ. • 制御スタックの増減と同期しない. • Java の場合,inner classで代用できる. • call/cc (call/pc) • 制御フレームも無限エクステントを持つので,setjmpなどでは代用できない. • プログラム変換によって消去可能 SMAF Workshop
実装!? • 制御フレーム・引数フレーム • オブジェクトとして実現 → Actor • 制御フレームから辿れるオブジェクトをシリアライズして転送(HORB) • CPS変換もどきで Java のクラスを生成 • 高階関数 → 無名クラス • 関数呼び出し → メッセージ送信 SMAF Workshop
CPS変換 f(x) = x+1 → f’(x,k) = k(x+1) f(x,y) = g(h(x),y) → f’(x,y,k) = h’(x, λv.g’(v,y,k)) f(x) = begin g(x); h(x) end → f’(x,k) = g(x,λv.h(x,k)) SMAF Workshop
プロトタイプ • Java -> Java のソースコード変換 • 継続・部分継続をオブジェクトにする • serializeして転送 • 現在は手で変換 • 自動化: • 素直にCPS変換を行うと変換後のコードが莫大になる.そこでFriedman, Haynes, Danvyらによる最適化手法を用いる. SMAF Workshop
継続・部分継続オブジェクト interface Continuation { public void fire (Object value); } interface PartialContinuation { public Continuation compose (Continuation cont); } class FinalCont implements Continuation { public void fire (Object value) { System.out.println("value = " + value); } } SMAF Workshop
(define (fact n k) (if (< n 1) (k 1) (fact (- n 1) (lambda (value) (k (* n value)))))) public void fact (int n, Continuation k) { if (n < 1) k.fire(new Integer(1)); else this.fact (n-1, new Continuation () { public void fire (Object value) { k.fire(n * (int)value); }}); } SMAF Workshop
public void fact (int n, Continuation k) { if (n < 1) k.fire(new Integer(1)); else { final int nn = n; final Continuation kk = k; this.fact (n-1, new Continuation () { public void fire (Object value) { kk.fire(new Integer(nn * ((Integer)value).intValue())); }}); } } SMAF Workshop
(+ 1 #(* 2 (call/pc (lambda (k) (k (k 3)))))) = (+ 1 (* 2 (* 2 3))) => ((k (k c0)) 3) where c0 = (lambda (v) (+ 1 v)) k = (lambda (c) (lambda (v) (c (* 2 v)))) SMAF Workshop
PartialContinuation k = new PartialContinuation () { public Continuation compose (Continuation cont) { final Continuation _cont = cont; return (new Continuation () { public void fire (Object value) { _cont.fire(new Integer(2 * ((Integer)value).intValue())); }}); } }; final Continuation _cont0 = cont0; Continuation c0 = new Continuation () { public void fire (Object value) { _cont0.fire(new Integer(1 + ((Integer)value).intValue())); } }; (k.compose(k.compose(c0))).fire(new Integer(3)); SMAF Workshop
動的な名前空間の実現 • 一級環境オブジェクト(クロージャ) • ライブラリ・位置に依存するコード • 疑似静的スコープ(Lee & Friedman),動的環境(Queinnec),一級文脈(Lee,橋本) • 移動先で未定義 • 代用品(disconnected operation) • 移動元に要求 SMAF Workshop
関連研究 • Sekiguchi & Yonezawa (semantics) • Communication Passing Style (CmPS) • Jagganathan (NEC Research) 1997 • Linda 風の Cooordination Language • put/read/get するたびにスレッドが移動 • 移動の範囲をプロンプトで指定 • Facile (ECRC) 1995 SMAF Workshop
他の研究テーマ • 移動コードの形式的仕様 • フォールトトレランスのためのアブストラクション • エージェントを監視するレベル(デーモン)の導入 • AgentSpace上に実装(しようとしている) • 動的コード生成による高速化 SMAF Workshop