Eijiro Sumii and Naoki Kobayashi University of Tokyo

Slides:



Advertisements
Similar presentations
1 高速フーリエ変換 (fast Fourier transform). 2 高速フーリエ変換とは? – 簡単に言うとフーリエ変換を効率よく計算 する方法 – アルゴリズムの設計技法は分割統治法に基 づいている 今回の目的は? – 多項式の積を求める問題を取り上げ、高速 フーリエ変換のアルゴリズムを用いた解法.
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
シーケンス図の生成のための実行履歴圧縮手法
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
(Rubyistのための) 超音速:ML入門
部分評価の紹介 An Introduction to Partial Evaluation (Neil D. Jones, ACM Computing Survey Vol.28 No.3 Sep. 1996) 発表者:神戸.
密な演算子呼び出しで実現した 内部DSLの前処理による 実行速度改善の試み
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
LMNtalからC言語への変換の設計と実装
Generating Functions (前半) B4 堺谷光.
LMNtalからC言語への変換の設計と実装
Lispとは ゲーム理論 minimaxアルゴリズム αβアルゴリズム ソースコードの一部
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
データ構造と アルゴリズム 第二回 知能情報学部 新田直也.
Semantics with Applications
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
条件式 (Conditional Expressions)
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
Tokuda Lab. NISHIMURA Taichi
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
プログラミング言語論 第12回 関数型プログラミング 情報工学科 篠埜 功.
二分探索木によるサーチ.
型付きアセンブリ言語を用いた安全なカーネル拡張
静的情報と動的情報を用いた プログラムスライス計算法
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
PROGRAMMING IN HASKELL
“Purely Functional Data Structures” セミナー
暗黙的に型付けされる構造体の Java言語への導入
関数の定義.
PROGRAMMING IN HASKELL
プログラミング言語入門.
Macro Tree Transducer の 型検査アルゴリズム
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
トーリックイデアルの グレブナ基底を求める アルゴリズム – F4およびF5 –
国立情報学研究所 ソフトウェア研究系 助教授/
通信機構合わせた最適化をおこなう並列化ンパイラ
 型推論1(単相型) 2007.
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
ソフトウェア保守のための コードクローン情報検索ツール
コンパイラ 2011年10月20日
 型推論3(MLの多相型).
Peer-to-Peerシステムにおける動的な木構造の生成による検索の高速化
2007/6/12(通信コース)2007/6/13(情報コース) 住井
Type Systems and Programming Languages
統合開発環境によって表現された 言語機構によるコードのモジュール化
``Exponentiated Gradient Algorithms for Log-Linear Structured Prediction’’ A.Globerson, T.Y.Koo, X.Carreras, M.Collins を読んで 渡辺一帆(東大・新領域)
情報工学概論 (アルゴリズムとデータ構造)
PROGRAMMING IN HASKELL
プログラミング言語論 第10回 情報工学科 篠埜 功.
~sumii/class/proenb2010/ml2/
2006/7/18(通信コース)2006/7/26(情報コース) 住井
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
2006/6/27(通信コース)2006/7/5(情報コース) 住井
~sumii/class/proenb2009/ml6/
PROGRAMMING IN HASKELL
18. Case Study : Imperative Objects
全体ミーティング 2010/05/19 渡邊 裕貴.
~sumii/class/proenb2010/ml5/
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
線形符号(10章).
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
全体ミーティング(9/15) 村田雅之.
Q q 情報セキュリティ 第7回:2005年5月27日(金) q q.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
Presentation transcript:

Eijiro Sumii and Naoki Kobayashi University of Tokyo 2019/6/4 Online Type-Directed Partial Evaluation for Dynamically-Typed Languages Eijiro Sumii and Naoki Kobayashi University of Tokyo

eval(p, (s, d)) = eval(ps, d) 2019/6/4 Partial Evaluation p: プログラム, s: 入力の一部 peval(p, s) = ps d: 残りの入力 eval(p, (s, d)) = eval(ps, d)

(expression)p と s の式 (expression) peval peval ps の式 2019/6/4 Type-Directed PE 古典的な PE (Syntax-Directed PE) (expression)p と s の式 (expression) peval peval ps の式 Type-Directed PE [Danvy 96] p と s の式 eval + type inference eval + type inference d. p(s, d) の値 (value) と型 reify reify ps の式 fun p(s, d) = s(s(d)); val s = fn x => x; val v = fn d => p(s, d); val e = reify (T --> T) v; pp e;

Type-Directed PE 古典的な PE (Syntax-Directed PE) 2019/6/4 Type-Directed PE 古典的な PE (Syntax-Directed PE) (expression)p と s の式 (expression) peval peval ps の式 Type-Directed PE [Danvy 96] p と s の式 eval + type inference eval + type inference d. p(s, d) の値 (value) と型 reify reify ps の式 素朴な方法だと interpretive overhead が大きく遅い どちらも直接の 実行なので速い

従来の TDPE の問題点 適用できる言語(,,+)が限定 与えられた型に盲従 SDPE との関係が不明確 2019/6/4 従来の TDPE の問題点 適用できる言語(,,+)が限定  再帰型や動的型を持つ言語 与えられた型に盲従  PE の処理と結果の両方が冗長 SDPE との関係が不明確  従来の技術の応用が困難

我々の貢献 様々な関数型言語に適用でき、 冗長性のない TDPE を提案 2019/6/4 我々の貢献 様々な関数型言語に適用でき、 冗長性のない TDPE を提案 Higher-Order Abstract Syntax を用いた ある単純な SDPE から、deforestation で 我々の TDPE を導出  より複雑な SDPE からは より高度な TDPE が得られる

発表の概要 Introduction Danvy の TDPE 我々の TDPE 比較実験 SDPE との関係 関連研究 結論 2019/6/4 発表の概要 Introduction Danvy の TDPE 我々の TDPE 比較実験 SDPE との関係 関連研究 結論

Danvy の TDPE: Reification 2019/6/4 Danvy の TDPE: Reification reify = 「eval の逆」 値 v とその型   eval(e) = v なる式 e の強正規形  関数の場合が問題 (他の場合は自明) reify (  ) v := (1) 引数の「代表」となる  型の値を生成 (2) 生成した値に v を適用 (3) 適用した結果である  型の値を reify “Type-Directed PE” のスライドに戻ってから

Danvy の TDPE: Reification の例 (1) 2019/6/4 Danvy の TDPE: Reification の例 (1) 例: reify (    ) v where v = a. b. ((c. c) @ a) v @ x = b. ((c. c) @ x) v @ x @ y = (c. c) @ x = x よって reify (    ) v = x. y. x 関数適用 シンボル  抽象の syntax constructor

Danvy の TDPE: Reification の例 (2) 2019/6/4 Danvy の TDPE: Reification の例 (2) 例: reify ((int  )  ) v where v = a. (a @ (1 + 2)) v @ x = x @ (1 + 2)  Error! そこで x を b. x @ b と  展開して v @ (b. x @ b) = (b. x @ b) @ (1 + 2) = x @ 3 よって reify ((int  )  ) v = x. x @ 3 関数適用の syntax constructor

Danvy の TDPE: Reification の一般的な定義 2019/6/4 Danvy の TDPE: Reification の一般的な定義 reify : type  value  exp reify  v = v reify (  ) v = x. (reify  (v @ (reflect  x))) (where x is fresh) reflect : type  exp  value reflect  e = e reflect (  ) e = a. (reflect  (e @ (reify  a)))

Danvy の TDPE: 問題点 適用できる言語が限定されている 特化時も実行時も効率が悪い 整数型や再帰型には「代表」となる値がない 2019/6/4 Danvy の TDPE: 問題点 適用できる言語が限定されている 整数型や再帰型には「代表」となる値がない reflect int x = ??? reflect ( list) y = ??? 特化時も実行時も効率が悪い 型が冗長だと、無駄な reflection が発生して 結果も冗長になる reify ((  )    ) (a. a) = x. y. (x @ y)

我々の TDPE: Basic Idea (1) Reflection を行わない! 2019/6/4 我々の TDPE: Basic Idea (1) Reflection を行わない! reify(x. t) = y. reify((x. t) @ y) (where y is fresh) reify(t1 @ t2) = reify(t1) @ reify(t2) reify(y) = y

我々の TDPE: Basic Idea (2) primitive な value destructor たちを、 2019/6/4 我々の TDPE: Basic Idea (2) primitive な value destructor たちを、 「式に対しては式を返す」 ように拡張する。 例:関数適用 e1 @ e2 = e1 @ e2 (e1 が関数の場合) e1 @ e2 = e1 @ (reify e2) (e1 が式の場合) “Danvy の TDPE: Reification の例 (2)” に戻ってから

p: プログラム, s: 入力の一部, d: 残りの入力 2019/6/4 我々の TDPE: 全体像 p: プログラム, s: 入力の一部, d: 残りの入力 p と s の式 eval eval d. p(s, d) の値 reify reify ps の式

我々の TDPE: 全体像 p: プログラム, s: 入力の一部, d: 残りの入力 p と s の式 2019/6/4 我々の TDPE: 全体像 p: プログラム, s: 入力の一部, d: 残りの入力 p と s の式 preprocess preprocess d. p(s, d) の式 eval eval d. p(s, d) の値 reify reify ps の式 ・@ や + などを ・@ や + などで ・おきかえる ・静的に型つけ ・された言語では ・tag をつける

我々の TDPE: 例 元のプログラム: f @ (n + (s + 2)) 静的な入力: s = 1 動的な入力: f と n  2019/6/4 我々の TDPE: 例 元のプログラム: f @ (n + (s + 2)) 静的な入力: s = 1 動的な入力: f と n  f. n. f @ (n + (1 + 2)) を強正規化したい f. n. f @’ (n +’ (1 +’ 2)) を eval して reify する

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2)))

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = x. reify((f. n. f @ (n + (1 + 2))) @ x) (関数に対する reify の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = x. reify((f. n. f @ (n + (1 + 2))) @ x) = x. reify(n. x @ (n + (1 + 2))) ( 簡約)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = x. reify((f. n. f @ (n + (1 + 2))) @ x) = x. reify(n. x @ (n + (1 + 2))) = x. y. reify((n. x @ (n + (1 + 2))) @ y) (関数に対する reify の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = x. reify((f. n. f @ (n + (1 + 2))) @ x) = x. reify(n. x @ (n + (1 + 2))) = x. y. reify((n. x @ (n + (1 + 2))) @ y) = x. y. reify(x @ (y + (1 + 2))) ( 簡約)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = x. reify((f. n. f @ (n + (1 + 2))) @ x) = x. reify(n. x @ (n + (1 + 2))) = x. y. reify((n. x @ (n + (1 + 2))) @ y) = x. y. reify(x @ (y + (1 + 2))) = x. y. reify(x @ (y + 3)) (整数に対する + の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = x. reify((f. n. f @ (n + (1 + 2))) @ x) = x. reify(n. x @ (n + (1 + 2))) = x. y. reify((n. x @ (n + (1 + 2))) @ y) = x. y. reify(x @ (y + (1 + 2))) = x. y. reify(x @ (y + 3)) = x. y. reify(x @ (y + 3)) (式に対する + の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = x. reify((f. n. f @ (n + (1 + 2))) @ x) = x. reify(n. x @ (n + (1 + 2))) = x. y. reify((n. x @ (n + (1 + 2))) @ y) = x. y. reify(x @ (y + (1 + 2))) = x. y. reify(x @ (y + 3)) = x. y. reify(x @ (y + 3)) = x. y. reify(x @ (y + 3)) (式に対する @ の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = ... = x. y. reify(x @ (y + 3)) = x. y. reify(x) @ reify(y + 3) (@ に対する reify の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = ... = x. y. reify(x @ (y + 3)) = x. y. reify(x) @ reify(y + 3) = x. y. x @ reify(y + 3) (シンボルに対する reify の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = ... = x. y. reify(x @ (y + 3)) = x. y. reify(x) @ reify(y + 3) = x. y. x @ reify(y + 3) = x. y. x @ (reify(y) + reify(3)) (+ に対する reify の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = ... = x. y. reify(x @ (y + 3)) = x. y. reify(x) @ reify(y + 3) = x. y. x @ reify(y + 3) = x. y. x @ (reify(y) + reify(3)) = x. y. x @ (y + reify(3)) (シンボルに対する reify の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = ... = x. y. reify(x @ (y + 3)) = x. y. reify(x) @ reify(y + 3) = x. y. x @ reify(y + 3) = x. y. x @ (reify(y) + reify(3)) = x. y. x @ (y + reify(3)) = x. y. x @ (y + 3) (整数に対する reify の定義)

2019/6/4 我々の TDPE: 例 = reify(f. n. f @ (n + (1 + 2))) = ... = x. y. reify(x @ (y + 3)) = x. y. reify(x) @ reify(y + 3) = x. y. x @ reify(y + 3) = x. y. x @ (reify(y) + reify(3)) = x. y. x @ (y + reify(3)) = x. y. x @ (y + 3)

我々の TDPE: 効率の比較 Danvy 我々 Reflection 必要 不要 Destructor の拡張 不要 必要 どちらのほうが効率が良いのか? Reflection は、Destructor の拡張と違って PE の処理だけでなく結果も悪化させる。 実験によれば、Destructor の拡張は Reflection よりオーバーヘッドが小さい。  我々の TDPE のほうが効率が良い

2019/6/4 比較実験: 特化にかかる時間

2019/6/4 比較実験: 実行にかかる時間

発表の概要 Introduction Danvy の TDPE 我々の TDPE 比較実験 SDPE との関係 関連研究 結論 2019/6/4 発表の概要 Introduction Danvy の TDPE 我々の TDPE 比較実験 SDPE との関係 関連研究 結論

単純な SDPE with HOAS & deforestation 2019/6/4 SDPE との関係: 全体像 単純な SDPE with HOAS & deforestation + HOAS から FOAS への変換  我々の TDPE

SDPE との関係: HOAS Higher-Order Abstract Syntax [Pfenning & Elliott 88]: 2019/6/4 SDPE との関係: HOAS Higher-Order Abstract Syntax [Pfenning & Elliott 88]: object level の binding を meta level の binding であらわす 例: x. y. (x @ y)  (a. (b. (a @ b)))

SDPE との関係: HOAS を用いた SDPE 2019/6/4 SDPE との関係: HOAS を用いた SDPE R((x. t)) = (y. R((x. t) @ y)) R(t1 @ t2) = (x. t) @ R(t2) (if R(t1) = (x. t)) R(t1 @ t2) = R(t1) @ R(t2) (otherwise)

SDPE との関係: HOAS を用いた SDPE 2019/6/4 SDPE との関係: HOAS を用いた SDPE R((x. t)) = (y. R((x. t) @ y)) R(t1 @ t2) = (x. t) @ R(t2) (if R(t1) = (x. t)) R(t1 @ t2) = R(t1) @ R(t2) (otherwise)  (x. t) = (y. (x. t) @ y) t1 @ t2 = (x. t) @ t2 (if t1 = (x. t)) t1 @ t2 = t1 @ t2 (otherwise)

SDPE との関係: HOAS を用いた SDPE 2019/6/4 SDPE との関係: HOAS を用いた SDPE R((x. t)) = (y. R((x. t) @ y)) R(t1 @ t2) = (x. t) @ R(t2) (if R(t1) = (x. t)) R(t1 @ t2) = R(t1) @ R(t2) (otherwise)  (x. t) = (y. (x. t) @ y) t1 @ t2 = (x. t) @ t2 (if t1 = (x. t)) t1 @ t2 = t1 @ t2 (otherwise)

SDPE との関係: HOAS を用いた SDPE 2019/6/4 SDPE との関係: HOAS を用いた SDPE R((x. t)) = (y. R((x. t) @ y)) R(t1 @ t2) = (x. t) @ R(t2) (if R(t1) = (x. t)) R(t1 @ t2) = R(t1) @ R(t2) (otherwise)  (x. t) = (x. t) t1 @ t2 = (x. t) @ t2 (if t1 = (x. t)) t1 @ t2 = t1 @ t2 (otherwise)

SDPE との関係: HOAS を用いた SDPE 2019/6/4 SDPE との関係: HOAS を用いた SDPE R((x. t)) = (y. R((x. t) @ y)) R(t1 @ t2) = (x. t) @ R(t2) (if R(t1) = (x. t)) R(t1 @ t2) = R(t1) @ R(t2) (otherwise)  (x. t) = (x. t) t1 @ t2 = (x. t) @ t2 (if t1 = (x. t)) t1 @ t2 = t1 @ t2 (otherwise)

SDPE との関係: HOAS を用いた SDPE 2019/6/4 SDPE との関係: HOAS を用いた SDPE R(x. t) = y. R((x. t) @ y) R(t1 @ t2) = (x. t) @ R(t2) (if R(t1) = x. t) R(t1 @ t2) = R(t1) @ R(t2) (otherwise)  (x. t) = x. t t1 @ t2 = (x. t) @ t2 (if t1 = x. t) t1 @ t2 = t1 @ t2 (otherwise)  @ の定義と一致する!

SDPE との関係: HOAS から FOAS への変換 2019/6/4 SDPE との関係: HOAS から FOAS への変換 F(x. t) = y. F((x. t) @ y) (where y is fresh) F(t1 @ t2) = F(t1) @ F(t2) F(y) = y  reify の定義と一致する!

単純な SDPE with HOAS & deforestation 2019/6/4 SDPE との関係: まとめ より複雑な SDPE を用いれば より高度な TDPE が得られる 単純な SDPE with HOAS & deforestation + HOAS から FOAS への変換  我々の TDPE

発表の概要 Introduction Danvy の TDPE 我々の TDPE 比較実験 SDPE との関係 関連研究 結論 2019/6/4 発表の概要 Introduction Danvy の TDPE 我々の TDPE 比較実験 SDPE との関係 関連研究 結論

関連研究 [Danvy 96 & 97] [Sheard 97]: reflection のできない型には ad hoc に対応 2019/6/4 関連研究 [Danvy 96 & 97] [Sheard 97]: reflection のできない型には ad hoc に対応  複雑で効率が悪い [Thiemann 96 & 99]: HOAS を用いた offline SDPE から 我々と同様の変換で offline PGG を導出 [Helsen & Thiemann 98]: 上の offline PGG と Danvy の TDPE の 類似性を指摘

結論 TDPE の改良を提案 改良された TDPE と SDPE の関係を明確化 今後の課題 広く適用できる 単純で効率が良い 2019/6/4 結論 TDPE の改良を提案 広く適用できる 単純で効率が良い 改良された TDPE と SDPE の関係を明確化  TDPE と SDPE の技術を融合できる 今後の課題 PE の停止性の保証 副作用を複雑に用いたプログラムの特化 例: コードや計算の重複や消滅がなく、 任意の副作用について健全な SDPE [Lawall & Thiemann 97]