15

Click here to load reader

About Capabilities for Uniqueness and Borrowing

Embed Size (px)

DESCRIPTION

Capabilities for Uniqueness and Borrowing, Philipp Haller, Martin Odersky についてざっくりとした解説をしたスライドです。型付け規則とかの話は全部カットしました。

Citation preview

Page 1: About Capabilities for Uniqueness and Borrowing

About  Capabili,es  for    Uniqueness  and  Borrowing  

水島 宏太  日本Scalaユーザーズグループ  

Page 2: About Capabilities for Uniqueness and Borrowing

自己紹介  •  水島 宏太    

–  Twi;er:  @kmizu  –  本日、アラサー最後の歳になりました  –  Github:  h;ps://github.com/kmizu/    

•  株式会社ユビレジ  •  愛  

•  (プログラミング|形式)言語  •  静的型付け  •  メタプログラミング  •  Scala,  Nemerle  

Page 3: About Capabilities for Uniqueness and Borrowing

Capabili,es  for  Uniqueness  and  Borrowing  

•  著者:Phillip  Haller,  Mar,n  Odersky  –  ※CSの論文ではFirst  Authorが最重要です    

•  ECOOP2010に採録  –  European  Conference  on  Object-­‐Oriented  Programming  

•  コンパイラプラグインとしてちゃんと実装がある!  –  h;p://lampwww.epfl.ch/~phaller/readme_uniqueness.html  

Page 4: About Capabilities for Uniqueness and Borrowing

Abstract  

•  動機  –  並行プログラミングでのメッセージパッシング  – Mutable  Objectがあると安全じゃない  –  既存の提案手法は制限が強過ぎる  

•  貢献  –  参照の一意性を保証するための新しい手法を提案  –  そのための型システムの健全性を証明  

•  Scalaのコンパイラプラグインとして実装  

Page 5: About Capabilities for Uniqueness and Borrowing

何が問題なのか  

•  Actorライブラリでのプログラミング  –  Actor間でのメッセージ通信  –  mutableなオブジェクトを送信すると:  

•  race  condi,on発生の可能性  •  複数Actor間でオブジェクトの共有(別名付け)  

–  immutableなオブジェクトのみを送れば安全  •  immutableオブジェクト万歳  

Page 6: About Capabilities for Uniqueness and Borrowing

待って欲しい  

•  本当にmutableなオブジェクトを送信してはだめ?  

•  Actor間でオブジェクトが共有されなければOK  –  val  buffer  =  Buffer[Int]()          buffer  ++=  (1,  2,  3,  4)          anActor  !  buffer          //  bufferに触れるな危険  

•  オブジェクトが共有されない事を静的に保証したい  –  オブジェクトの参照の一意性  

Page 7: About Capabilities for Uniqueness and Borrowing

寄り道:一意型  

•  代表的な言語:Clean  •  基本:誰にも見破れなければimmutableと同じ!  –  裏側でオブジェクトを破壊的に更新しても関係ない  

•  Scalaっぽい疑似コードで表現  –  val  oldArray:  *Array[Int]  =  Array(1,  2,  3)          /*  oldArrayへの参照を「消費」  */          val  newArray  =  oldArray(0)  =  4            //  oldArrayに触れるとコンパイルエラー  

•  変種が色々ある  

Page 8: About Capabilities for Uniqueness and Borrowing

単純な一意型があればOK?  

•  ダメダメ    •  送信できるオブジェクトの形式が制限される  –  木構造はOKだけどグラフは駄目  –  オブジェクトのシリアライズが必要になって…あれ?    

•  もうちょっと制限を緩める必要がある  

Page 9: About Capabilities for Uniqueness and Borrowing

先行研究  

•  色々ある(↓)けどばっさり略  

Page 10: About Capabilities for Uniqueness and Borrowing

External  Uniqueness  Separate  Uniqueness  

Page 11: About Capabilities for Uniqueness and Borrowing

Capability  

•  この研究における中心的な概念    •  p▷T  :  型Tはcapability  pによって守られている    •  Capabilityの二つの役割  –  ヒープ上の(disjointな)異なる領域の表現  –  領域内にあるオブジェクトへのアクセス権  

•  オブジェクトの一意性を細かく制御できる  •  次ページ以降、コード例中心の説明  

Page 12: About Capabilities for Uniqueness and Borrowing

登場人物(アノテーション)  

•  @unique  –  (参照が)一意な変数であり、capabilityを持つ  

•  @transient  –  capabilityを消費しない  

•  @peer(this)  –  thisと同じヒープ領域を指す  

Page 13: About Capabilities for Uniqueness and Borrowing

例:LogList(1)  

Page 14: About Capabilities for Uniqueness and Borrowing

例:LogList(2)  

Page 15: About Capabilities for Uniqueness and Borrowing

感想  

•  Capabilityベースの領域単位の一意性が面白い  

•  型アノテーションの型推論が弱い…  –  記述が冗長になりそう  

•  captureはad  hoc過ぎる気が…  

•  コンパイラプラグインとして実装したのは良い