the design of mezzo
play

The design of Mezzo Franois Pottier Jonathan Protzenko INRIA CMU, - PowerPoint PPT Presentation

The design of Mezzo Franois Pottier Jonathan Protzenko INRIA CMU, Sep 2013 1 / 51 Outline Motivation Design principles Algebraic data structures Extra examples Aliasing Project status 2 / 51 Premise The types of OCaml, Haskell,


  1. The design of Mezzo François Pottier Jonathan Protzenko INRIA CMU, Sep 2013 1 / 51

  2. Outline Motivation Design principles Algebraic data structures Extra examples Aliasing Project status 2 / 51

  3. Premise The types of OCaml, Haskell, Java, C#, etc.: 3 / 51 • describe the structure of data, • but do not distinguish trees and graphs , • and do not control who has permission to read or write.

  4. Question Could a more ambitious static discipline: 4 / 51 • rule out more programming errors, • and enable new programming idioms, • while remaining reasonably simple and flexible ?

  5. Goals 5 / 51 We would like to rule out : • representation exposure; • data races; • violations of object protocols; and to enable : • gradual initialization; • type changes along with state changes; • (in certain cases) explicit memory re-use.

  6. Outline Motivation Design principles Algebraic data structures Extra examples Aliasing Project status 6 / 51

  7. Principle 1. Nothing is fixed Instead, in certain ways. 7 / 51 A variable x does not have a fixed type throughout its lifetime. • at each program point in the scope of x , • one may have zero, one, or more (static) permissions to use x

  8. Layout and ownership go hand in hand and describes certain access rights for this memory. 8 / 51 As a consequence, permissions describe layout and ownership . A permission of the form “ x @ t ” allows using x at type t . It describes the shape and extent of a heap fragment, rooted at x , In short, “to know about x ” is “to have access to x ” is “to own x ”.

  9. Principle 2. Just two access modes The system imposes a global invariant: at any time, access it (for reading and writing); permissions to access it (for reading). No counting. No fractions. 9 / 51 • if x is a mutable object, there exists at most one permission to • if x is an immutable object, there may exist arbitrarily many

  10. Some syntax and examples For instance, read/write access to the elements, which are integer cells. 10 / 51 • “ x @ list int ” provides (read) access to an immutable list of integers, rooted at x . • “ x @ mlist int ” provides (exclusive, read/write) access to a mutable list of integers at x . • “ x @ list (ref int) ” offers read access to the spine and

  11. Principle 3. Any (known) alias is as good as any other No “borrowing”. 11 / 51 An equality “ x = y ” is a permission, sugar for “ x @ (=y) ”. In its presence, “ x @ t ” can be turned into “ y @ t ”, and vice-versa.

  12. Control of duplication A value can be copied (always). Can a permission be copied? copied, as they imply exclusive access to part of the heap. 12 / 51 • “ x @ list int ” can be copied: read access can be shared. • “ x = y ” can be copied: equalities are forever. • “ x @ mlist int ” and “ x @ list (ref int) ” must not be One can always tell whether a permission is duplicable or affine .

  13. Control of aliasing: the bad Aliasing of mutable data is restricted. 13 / 51 let x = 0 in let y = ref x in let z = ( y , y ) in ... We have “ x @ int ” and “ y @ ref (=x) ” and “ z @ (=y, =y) ”. Thus, we have “ x @ int ” and “ y @ ref int ” and “ z @ (=y, =y) ”. We cannot deduce “ z @ (ref int, ref int) ”, as this reasoning step would require duplicating “ y @ ref int ”.

  14. Control of aliasing: the good separation at mutable data and agreement at immutable data. 14 / 51 let z : ( ref int , ref int ) = ... in let ( x , y ) = z in ... We have “ z @ (ref int, ref int) ” and “ z @ (=x, =y) ”. I.e., “ z @ (=x, =y) ” and “ x @ ref int ” and “ y @ ref int ”. We have an exclusive access token for each of x and y . There follows that these addresses must be distinct . Technically, the word “and” above is a conjunction * that requires

  15. Summary so far: the good Why is this a useful discipline? The uniqueness of read/write permissions: 15 / 51 • rules out representation exposure and data races; • allows the type of an object to vary with time.

  16. Summary so far: the bad Isn't this a restrictive discipline? Yes, it is. In our defense, 16 / 51 • there is no restriction on the use of immutable data; • there is an escape hatch that involves dynamic checks.

  17. Outline Motivation Design principles Algebraic data structures Extra examples Aliasing Project status 17 / 51

  18. Immutable lists The algebraic data type of immutable lists is defined as in ML: 18 / 51 data list a = | Nil | Cons { head : a ; tail : list a }

  19. Mutable lists To define a type of mutable lists, one adds a keyword: 19 / 51 data mutable mlist a = | MNil | MCons { head : a ; tail : mlist a }

  20. Permission analysis & refinement . . . . ...... 20 / 51 match xs with | MNil -> ... | MCons -> let x = xs . head in ... end

  21. Permission analysis & refinement . . . . . ..... 20 / 51 xs @ mlist a match xs with | MNil -> ... | MCons -> let x = xs . head in ... end

  22. Permission analysis & refinement . .... . .. . 20 / 51 . . match xs with | MNil -> xs @ MNil ... | MCons -> let x = xs . head in ... end

  23. Permission analysis & refinement . ... . ... . 20 / 51 . . match xs with | MNil -> ... | MCons -> xs @ MCons { head: a; tail: mlist a } let x = xs . head in ... end

  24. Permission analysis & refinement . .. . .... . . . 20 / 51 match xs with | MNil -> xs @ MCons { head: (=h); tail: (=t) } ... * h @ a | MCons -> * t @ mlist a let x = xs . head in ... end

  25. Permission analysis & refinement . . . ..... . . . 20 / 51 match xs with | MNil -> xs @ MCons { head = h; tail = t } ... * h @ a | MCons -> * t @ mlist a let x = xs . head in ... end

  26. Permission analysis & refinement . . ...... . . 20 / 51 . match xs with | MNil -> ... | MCons -> let x = xs . head in ... xs @ MCons { head = h; tail = t } end * h @ a * t @ mlist a * x = h

  27. Principles This illustrates two mechanisms: structural one. conjunction of permissions for the fields. These reasoning steps are reversible. 21 / 51 • A nominal permission can be unfolded and refined to a • A structural permission can be decomposed into a This means that “ xs @ list (ref a) ” denotes a list of pairwise distinct references.

  28. A recursive function This type should be understood as follows: By convention, the permissions demanded by a function are also 22 / 51 val length : [ a ] mlist a -> int • length requires one argument xs , along with the static permission “ xs @ mlist a ”. • length returns one result n , along with the static permission “ xs @ mlist a * n @ int ”. returned, unless the “ consumes ” keyword is used.

  29. A recursive function . ........ 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . | MNil -> . accu . | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

  30. A recursive function . . . ....... 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . | MNil -> . xs @ mlist a accu . | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

  31. A recursive function . .. . ...... 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . | MNil -> . xs @ MNil accu . | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

  32. A recursive function . ... . ..... 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . | MNil -> . xs @ MNil accu . | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

  33. A recursive function . .... . .... 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . | MNil -> . xs @ mlist a accu . | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

  34. A recursive function . ... . ..... 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . xs @ MCons { head = h; tail = t } | MNil -> . h @ a accu . t @ mlist a | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

  35. A recursive function . .. . ...... 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . xs @ MCons { head = h; tail = t } | MNil -> . h @ a accu . t @ mlist a | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

  36. A recursive function . ....... . . 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . | MNil -> . xs @ MCons { head: a; tail: mlist a } accu . | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

  37. A recursive function . ........ . 23 / 51 val rec length_aux [ a ] ( accu : int , xs : mlist a ) : int = match xs with . | MNil -> . xs @ mlist a accu . | MCons -> . length_aux ( accu + 1, xs . tail ) . end val length [ a ] ( xs : mlist a ) : int = length_aux (0, xs )

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend