区点コード表 - jp.onkyo. · PDF file区点コードの見かた 文字の左側の3桁の数に、文字の上側の1桁の数を組み合わせた4桁の数が、その文字の区点コード番号と
移動コードのための言語機構 Code Mobility Support for Stock Programming Languages
description
Transcript of 移動コードのための言語機構 Code Mobility Support for Stock Programming Languages
9/12/1998 SMAF Workshop 1
移動コードのための言語機構Code Mobility Support for Stock Programming Languages
渡部卓雄JAIST
9/12/1998 SMAF Workshop 2
バックグラウンド
• オブジェクト,高階関数や再帰記述とも直交できる移動コード機構– reasoning 可能な記述を支援– 現在の計算状態を含めて移動させる– 既存の ( 逐次的な)プログラムに入れるだ
けで移動コードにできる,簡単な機構
9/12/1998 SMAF Workshop 3
“go” によるマイグレーション
• スレッドの全状態(=継続)の転送• 通常,移動する範囲は制限された範囲
で十分では? → 部分継続
9/12/1998 SMAF Workshop 4
call/ppc ( call-with-placed-partial-continuation )
• (call/ppc place function)– 現時点における部分継続を place に置き,
それに function を適用する.– function の適用自体は call/ppc の呼び出
しと同じ場所において行われる.
9/12/1998 SMAF Workshop 5
% : 同期プロンプト
(f (g a))
(f (% (g (call/ppc p
(lambda (k) (k a))))))
f
g
f
ga
9/12/1998 SMAF Workshop 6
& : 非同期プロンプト
(f (& (g (call/ppc p
(lambda (k) (k a))))))
f
gadummy
9/12/1998 SMAF Workshop 7
go
(define (go place)
(call/ppc place
(lambda (k) (k (current-place)))))
• (% (begin A (go p1) B (go p2) C))
• (& (begin A (go p1) B (go p2) C))
9/12/1998 SMAF Workshop 8
A : (f (% (g (call/ppc B (lambda (k1) (& (k1 (h (call/ppc C (lambda (k2) (k2 a))))))))))
f
g
h
A B C
9/12/1998 SMAF Workshop 9
(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))))) )))))))))))
9/12/1998 SMAF Workshop 10
@ マクロ
(@ 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))))
9/12/1998 SMAF Workshop 11
(% (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 の使い方との違いは?
9/12/1998 SMAF Workshop 12
f
g
h
A B C
go の場合
9/12/1998 SMAF Workshop 13
f
g
h
A B C
@ の場合
9/12/1998 SMAF Workshop 14
(# (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))))
9/12/1998 SMAF Workshop 15
9/12/1998 SMAF Workshop 16
9/12/1998 SMAF Workshop 17
9/12/1998 SMAF Workshop 18
9/12/1998 SMAF Workshop 19
実装 !?
• λ クロージャのある言語– 引数フレームは無限エクステントを持つ.– 制御スタックの増減と同期しない.– Java の場合, inner class で代用できる.
• call/cc (call/pc)– 制御フレームも無限エクステントを持つの
で, setjmp などでは代用できない.– プログラム変換によって消去可能
9/12/1998 SMAF Workshop 20
実装 !?
• 制御フレーム・引数フレーム– オブジェクトとして実現 → Actor
• 制御フレームから辿れるオブジェクトをシリアライズして転送 (HORB)
• CPS 変換もどきで Java のクラスを生成– 高階関数 → 無名クラス– 関数呼び出し → メッセージ送信
9/12/1998 SMAF Workshop 21
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))
9/12/1998 SMAF Workshop 22
プロトタイプ
• Java -> Java のソースコード変換– 継続・部分継続をオブジェクトにする
• serialize して転送
– 現在は手で変換– 自動化:
• 素直に CPS 変換を行うと変換後のコードが莫大になる.そこで Friedman, Haynes, Danvy らによる最適化手法を用いる.
9/12/1998 SMAF Workshop 23
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); }}
継続・部分継続オブジェクト
9/12/1998 SMAF Workshop 24
(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); }});}
9/12/1998 SMAF Workshop 25
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())); }}); } }
9/12/1998 SMAF Workshop 26
(+ 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))))
9/12/1998 SMAF Workshop 27
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));
9/12/1998 SMAF Workshop 28
動的な名前空間の実現
• 一級環境オブジェクト(クロージャ)– ライブラリ・位置に依存するコード– 疑似静的スコープ (Lee & Friedman) ,動的
環境 (Queinnec) ,一級文脈 (Lee, 橋本)• 移動先で未定義
– 代用品( disconnected operation)– 移動元に要求
9/12/1998 SMAF Workshop 29
関連研究
• Sekiguchi & Yonezawa (semantics)• Communication Passing Style (CmPS)
– Jagganathan (NEC Research) 1997– Linda 風の Cooordination Language
• put/read/get するたびにスレッドが移動• 移動の範囲をプロンプトで指定
• Facile (ECRC) 1995
9/12/1998 SMAF Workshop 30
他の研究テーマ
• 移動コードの形式的仕様• フォールトトレランスのためのアブス
トラクション– エージェントを監視するレベル(デーモ
ン)の導入– AgentSpace 上に実装(しようとしてい
る)• 動的コード生成による高速化