Invited Talk Interpreting the Data Rob Pike Google
Invited Talk: Interpreting the Data Rob Pike (Google)
一目でわかる Map & Reduce proto "document. proto" max_pagerank_url: table maximum(1) [domain: string] of url: string weight pagerank: int; doc: Document = input; url: string = doc. url; emit max_pagerank_url[domain(url)] <- url weight doc. pagerank;
一目でわかる Map & Reduce proto "querylog. proto" static RESOLUTION: int = 60; # in minutes log_record: Query. Log. Proto = input; query: string = log_record. query; datum: table sum[t: time][lat: int][lon: int] of int; loc: location = locationinfo(log_record. ip); if (def(loc)) { t: time = log_record. time_usec; m: int = minutesof(t); m = m - m % RESOLUTION; t = trunctohour(t) + time(m * int(MINUTE)); emit datum[t][int(loc. lat)][int(loc. lon)] <- 1; }
Rob Pike 氏よりのお言葉 • Good – make it easier to express yourself • Better – hide stuff you don’t care about • Best – hide stuff you do care about • Give the language a purpose
A Simple Typed Intermediate Language for Object-Oriented Languages J. Chen and D. Tardi (Microsoft Research)
LILc で表現できること(の一部) • クラス間の継承関係 • ダウンキャスト (例) Object obj = “Test”; String str = (String)obj; • Covariant array (例) Integer[] ints = new Integer[10]; Object[] objs = ints; objs[0] = “Hello, World!”;
A Bisimulation for Type Abstraction and Recursion E. Sumii and B. C. Pierce (University of Pennsylvania)
Mutatis Mutandis: Safe and Predictable Dynamic Software Updating G. Stoyle (University of Cambridge), M. Hicks (University of Maryland), G. Bierman (Microsoft Research), P. Sewell (University of Cambridge) and I. Neamtiu (University of Maryland)
From Sequential Programs to Multi-Tier Applications by Program Transformations M. Newbauer and P. Thiemann. . (Universitat Freiburg)
(例) 以下のプログラムを Multi-Tier な形に変換する void show_messages() { string query = GUI_get_query(); string[] messages = DB_query(query); GUI_show_messages(messages); }
手順1: 関数や値に注釈をつける void show_messages() { C string query = GUI_get_query(); string[] messages = DB_query(query); GUI_show_messages(messages); S C } C クライアント S サーバー
手順2: 注釈が衝突する場所に ‘trans’ を入れる void show_messages() { C string query = GUI_get_query(); query = trans[C->S] query; S string[] messages = DB_query(query); messages = trans[S->C] messages; GUI_show_messages(messages); C } trans[A->B] : 場所Aから場所Bへデータを移す
手順3: プログラムを分割する S void show_messages() { string query = recv(); string[] messages = DB_query(query); send(messages); } C void show_messages() { string query = GUI_get_query(); send(query); connectや listen string[] messages = recv(); などは後述 GUI_show_messages(messages); }
ここまでのやり方の問題 • 効率が良くない場合がある – ‘trans’ ごとにコネクションを張る必要がある S open close void show_messages(Messages i) { bool b = i. has. Next(); b = trans[S->C] b; if (b) { string message = i. next(); message = trans[S->C] message; GUI_show_message(message); C show_messages(i); } }
この論文の提案する解決方法 • コネクションのスコープをできるだけ大きくする open S void show_messages(Messages i) { bool b = i. has. Next(); b = trans[S->C] b; if (b) { string message = i. next(); message = trans[S->C] message; GUI_show_message(message); C show_messages(i); } close }
最適化の結果 C void show_messages(Channel chan) { bool b = recv(chan); if (b) { string message = recv(chan); GUI_show_message(message); show_messages(chan); } } S void show_messages(Messages i, Channel chan) { bool b = i. has. Next(); send(chan, b); if (b) { string message = i. next(); send(chan, message); show_messages(i, chan); } } 最適化の結果、 connectや listen などはこの関数内で する必要はないことが 分かった
Invited Talk: How should we program graphics hardware? P. Hanrahan (Stanford University)
Graphics ハードウェアの特徴 • 並列度が高い 出典: Stream Programming Environments, P. Hanrahan, GP^2 Workshop, 2004
一目で分かる Brook kernel void foo(float a<>, float b<>, output float result<>) { result = a + b; } void reduce sum(float a<>, reduce float result<>) { result = result + a; }
- Slides: 47