Lightweight Session Programming in...
Transcript of Lightweight Session Programming in...
![Page 1: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/1.jpg)
Lightweight SessionProgramming in Scala
Alceste ScalasNobuko Yoshida
Univerzitet u Novom SaduMarch 27th, 2017
Consist
ent *Complete *
Well D
ocumented*EasytoR
euse* *
Evaluated
*ECOOP*
Artifact
*AEC
![Page 2: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/2.jpg)
![Page 3: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/3.jpg)
http://mrg.doc.ic.ac.uk/
Us ∈ Mobility Research Group
![Page 4: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/4.jpg)
![Page 5: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/5.jpg)
www.scribble.org
![Page 6: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/6.jpg)
Online tool : http://scribble.doc.ic.ac.uk/
![Page 7: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/7.jpg)
Interactions with Industries
![Page 8: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/8.jpg)
Interactions with Industries
![Page 9: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/9.jpg)
![Page 10: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/10.jpg)
Selected Publications 2016/2017• [FoSSaCS’17] Julien Lange , NY : On the Undecidability of Asynchronous
Session Subtyping. • [FASE’17] Raymond Hu , NY : Explicit Connection Actions in Multiparty Session
Types. • [CC’17] Rumyana Neykova , NY: Let It Recover: Multiparty Protocol-Induced
Recovery. • [POPL’17] Julien Lange , Nicholas Ng , Bernardo Toninho , NY: Fencing off Go:
Liveness and Safety for Channel-based Programming. • [FPL’16] Xinyu Niu , Nicholas Ng , Tomofumi Yuki , Shaojun Wang , NY, Wayne Luk
: EURECA Compilation: Automatic Optimisation of Cycle-Reconfigurable Circuits. • [ECOOP’16] Alceste Scala, NY: Lightweight Session Programming in Scala • [CC’16] Nicholas Ng, NY: Static Deadlock Detection for Concurrent Go by Global
Session Graph Synthesis. • [FASE’16] Raymond Hu, NY: Hybrid Session Verification through Endpoint API
Generation. • [TACAS’16] Julien Lange, NY: Characteristic Formulae for Session Types. • [ESOP’16] Dimitrios Kouzapas, Jorge A. Pérez, NY: On the Relative
Expressiveness of Higher-Order Session Processes. • [POPL’16] Dominic Orchard, NY: Effects as sessions, sessions as effects .
![Page 11: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/11.jpg)
Selected Publications 2016/2017• [FoSSaCS’17] Julien Lange , NY : On the Undecidability of Asynchronous
Session Subtyping. • [FASE’17] Raymond Hu , NY : Explicit Connection Actions in Multiparty
Session Types. • [CC’17] Rumyana Neykova , NY: Let It Recover: Multiparty Protocol-Induced
Recovery. • [POPL’17] Julien Lange , Nicholas Ng , Bernardo Toninho , NY: Fencing off
Go: Liveness and Safety for Channel-based Programming.• [FPL’16] Xinyu Niu , Nicholas Ng , Tomofumi Yuki , Shaojun Wang , NY,
Wayne Luk: EURECA Compilation: Automatic Optimisation of Cycle-Reconfigurable Circuits.
• [ECOOP’16] Alceste Scala, NY: Lightweight Session Programming in Scala • [CC’16] Nicholas Ng, NY: Static Deadlock Detection for Concurrent Go by
Global Session Graph Synthesis. • [FASE’16] Raymond Hu, NY: Hybrid Session Verification through Endpoint
API Generation. • [TACAS’16] Julien Lange, NY: Characteristic Formulae for Session Types.• [ESOP’16] Dimitrios Kouzapas, Jorge A. Pérez, NY: On the Relative
Expressiveness of Higher-Order Session Processes. • [POPL’16] Dominic Orchard, NY: Effects as Sessions, Sessions as Effects.
![Page 12: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/12.jpg)
Lightweight SessionProgramming in Scala
![Page 13: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/13.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Troubles with session programming
Consider a simple “greeting” client/server session protocol:
1. the client can ask to greet someone, or quit
2. if asked to greet, the server can either:
2.1 say hello, and go back to 12.2 say bye, and end the session
Typical approach:
▸ describe the protocol informally
▸ develop ad hoc protocol APIs to avoid protocol violations
▸ find bugs via runtime testing/monitoring
Impact on software evolution and maintenance
![Page 14: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/14.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Troubles with session programming
Consider a simple “greeting” client/server session protocol:
1. the client can ask to greet someone, or quit
2. if asked to greet, the server can either:
2.1 say hello, and go back to 12.2 say bye, and end the session
Typical approach:
▸ describe the protocol informally
▸ develop ad hoc protocol APIs to avoid protocol violations
▸ find bugs via runtime testing/monitoring
Impact on software evolution and maintenance
![Page 15: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/15.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Troubles with session programming
Consider a simple “greeting” client/server session protocol:
1. the client can ask to greet someone, or quit
2. if asked to greet, the server can either:
2.1 say hello, and go back to 12.2 say bye, and end the session
Typical approach:
▸ describe the protocol informally
▸ develop ad hoc protocol APIs to avoid protocol violations
▸ find bugs via runtime testing/monitoring
Impact on software evolution and maintenance
![Page 16: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/16.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Lightweight Session Programming in Scala
This talk: we show how in Scala + lchannels we can write:
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val c2 = c !! Greet("Alice")_
c2 ? {
case m @ Hello(name) => client(m.cont)
case Bye(name) => ()
}
} else {
c ! Quit()
}
}
. . . with a clear theoretical basis, giving a general API withstatic protocol checks and message transport abstraction
![Page 17: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/17.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
▸ Object-oriented and functional
▸ Declaration-site variance
▸ Case classes for OO pattern matching
sealed abstract class Pet
case class Cat(name: String) extends Pet
case class Dog(name: String) extends Pet
def says(pet: Pet) = {
pet match {
case Cat(name) => name + " says: meoow"
case Dog(name) => name + " says: woof"
}
}
![Page 18: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/18.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
▸ Object-oriented and functional
▸ Declaration-site variance
▸ Case classes for OO pattern matching
sealed abstract class Pet
case class Cat(name: String) extends Pet
case class Dog(name: String) extends Pet
def says(pet: Pet) = {
pet match {
case Cat(name) => name + " says: meoow"
case Dog(name) => name + " says: woof"
}
}
![Page 19: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/19.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session types
Consider again our “greeting” client/server session protocol:
1. the client can ask to greet someone, or quit
2. if asked to greet, the server can either:
2.1 say hello, and go back to 12.2 say bye, and end the session
![Page 20: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/20.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session types
Consider again our “greeting” client/server session protocol:
1. the client can ask to greet someone, or quit
2. if asked to greet, the server can either:
2.1 say hello, and go back to 12.2 say bye, and end the session
We can formalise the client viewpoint as a session typefor the session π-calculus: (Honda et al., 1993, 1994, 1998, . . . )
Sh = µX.⎛⎜⎜⎜⎝
!Greet(String).⎛⎜⎝
?Hello(String).X&?Bye(String).end
⎞⎟⎠⊕
!Quit.end
⎞⎟⎟⎟⎠
![Page 21: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/21.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session types
Consider again our “greeting” client/server session protocol:
1. the client can ask to greet someone, or quit
2. if asked to greet, the server can either:
2.1 say hello, and go back to 12.2 say bye, and end the session
We can formalise the server viewpoint as a (dual) session typefor the session π-calculus: (Honda et al., 1993, 1994, 1998, . . . )
Sh = µX.⎛⎜⎜⎜⎝
?Greet(String).⎛⎜⎝
!Hello(String).X⊕!Bye(String).end
⎞⎟⎠&
?Quit.end
⎞⎟⎟⎟⎠
![Page 22: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/22.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Mixing the ingredients
Desiderata:
▸ find a formal link between Scala types and session types▸ represent sessions in a language without session primitives
▸ lightweight: no language extensions, minimal dependencies
Inspiration (from concurrency theory):
▸ encoding of session types into linear types for π-calculus(Dardha, Giachino & Sangiorgi, PPDP’12)
Result: Lightweight Session Programming in Scala
![Page 23: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/23.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Mixing the ingredients
Desiderata:
▸ find a formal link between Scala types and session types▸ represent sessions in a language without session primitives
▸ lightweight: no language extensions, minimal dependencies
Inspiration (from concurrency theory):
▸ encoding of session types into linear types for π-calculus(Dardha, Giachino & Sangiorgi, PPDP’12)
Result: Lightweight Session Programming in Scala
![Page 24: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/24.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session vs. linear types (in pseudo-Scala)
Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
“Session Scala”
def client(c: S_h): Unit = {
if (...) {
c ! Greet("Alice")
c ? {
Hello(name) => client(c)
Bye(name) => ()
}
} else {
c ! Quit()
}
}
“Linear Scala”
def client(c: LinOutChannel[?]): Unit = {
if (...) {
val (c2in, c2out) = createLinChannels[?]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}
Goals:
▸ define and implement linear in/out channels
▸ instantiate the “?” type parameter
▸ automate continuation channel creation
![Page 25: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/25.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session vs. linear types (in pseudo-Scala)
Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
“Session Scala”
def client(c: S_h): Unit = {
if (...) {
c ! Greet("Alice")
c ? {
Hello(name) => client(c)
Bye(name) => ()
}
} else {
c ! Quit()
}
}
“Linear Scala”
def client(c: LinOutChannel[?]): Unit = {
if (...) {
val (c2in, c2out) = createLinChannels[?]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}
Goals:
▸ define and implement linear in/out channels
▸ instantiate the “?” type parameter
▸ automate continuation channel creation
![Page 26: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/26.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session vs. linear types (in pseudo-Scala)
Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
“Session Scala”
def client(c: S_h): Unit = {
if (...) {
c ! Greet("Alice")
c ? {
Hello(name) => client(c)
Bye(name) => ()
}
} else {
c ! Quit()
}
}
“Linear Scala”
def client(c: LinOutChannel[?]): Unit = {
if (...) {
val (c2in, c2out) = createLinChannels[?]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}
Goals:
▸ define and implement linear in/out channels
▸ instantiate the “?” type parameter
▸ automate continuation channel creation
![Page 27: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/27.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session vs. linear types (in pseudo-Scala)
Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
“Session Scala”
def client(c: S_h): Unit = {
if (...) {
c ! Greet("Alice")
c ? {
Hello(name) => client(c)
Bye(name) => ()
}
} else {
c ! Quit()
}
}
“Linear Scala”
def client(c: LinOutChannel[?]): Unit = {
if (...) {
val (c2in, c2out) = createLinChannels[?]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}
Goals:
▸ define and implement linear in/out channels
▸ instantiate the “?” type parameter
▸ automate continuation channel creation
![Page 28: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/28.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
lchannels: interfaceabstract class In[+A] {
def receive(implicit d: Duration): A
}
abstract class Out[-A] {
def send(msg: A): Unit
}
API reminds standard Promises/Futures▸ similar runtime linearity checks and error handling
Note input/output co/contra-variance
![Page 29: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/29.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
lchannels: interfaceabstract class In[+A] {
def receive(implicit d: Duration): A
def ?[B](f: A => B)(implicit d: Duration): B = {
f(receive)
}
}
abstract class Out[-A] {
def send(msg: A): Unit
def !(msg: A) = send(msg)
}
API reminds standard Promises/Futures▸ similar runtime linearity checks and error handling
Note input/output co/contra-variance
![Page 30: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/30.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
lchannels: interfaceabstract class In[+A] {
def future: Future[A]
def receive(implicit d: Duration): A = {
Await.result[A](future, d)
}
def ?[B](f: A => B)(implicit d: Duration): B = {
f(receive)
}
}
abstract class Out[-A] {
def promise[B <: A]: Promise[B] // Impl. must be constant
def send(msg: A): Unit = promise.success(msg)
def !(msg: A) = send(msg)
}
API reminds standard Promises/Futures▸ similar runtime linearity checks and error handling
Note input/output co/contra-variance
![Page 31: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/31.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
lchannels: interfaceabstract class In[+A] {
def future: Future[A]
def receive(implicit d: Duration): A = {
Await.result[A](future, d)
}
def ?[B](f: A => B)(implicit d: Duration): B = {
f(receive)
}
}
abstract class Out[-A] {
def promise[B <: A]: Promise[B] // Impl. must be constant
def send(msg: A): Unit = promise.success(msg)
def !(msg: A) = send(msg)
def create[B](): (In[B], Out[B]) // Used to continue a session
}
API reminds standard Promises/Futures▸ similar runtime linearity checks and error handling
Note input/output co/contra-variance
![Page 32: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/32.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session programming= In[⋅]/Out[⋅]+CPSprotocols
How do we instantiate the In[⋅]/Out[⋅] type parameters?
S
In[?] or Out[?]
S
Out[?] or In[?]
ServerClient
Session types
Scala types
![Page 33: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/33.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session programming= In[⋅]/Out[⋅]+CPSprotocols
How do we instantiate the In[⋅]/Out[⋅] type parameters?
S
In[A] or Out[A]
S
Out[A] or In[A]
ServerClient
CPS protocol classesA1,A2, . . . ,An
Session types
Scala types
![Page 34: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/34.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Session programming= In[⋅]/Out[⋅]+CPSprotocols
How do we instantiate the In[⋅]/Out[⋅] type parameters?
Linear I/O types
S
?(U) or !(U)
In[A] or Out[A]
S
!(U) or ?(U)
Out[A] or In[A]
ServerClient
U
CPS protocol classesA1,A2, . . . ,An
Session types
Scala types
![Page 35: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/35.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 36: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/36.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
// Top-level internal choicecase class Greet(p: String)case class Quit(p: Unit)
// Inner external choicecase class Hello(p: String)case class Bye(p: String)
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 37: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/37.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String) extends Greetingcase class Bye(p: String) extends Greeting
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 38: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/38.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 39: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/39.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 40: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/40.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 41: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/41.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 42: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/42.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}
Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 43: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/43.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (I)Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
⟪Sh⟫N = Out[Start]
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val (c2in, c2out) = c.create[Greeting]()
c.send( Greet("Alice", c2out) )
c2in.receive match {
case Hello(name, c3out) => client(c3out)
case Bye(name) => ()
}
} else {
c.send( Quit() )
}
}Goals:
▸ define and implement linear in/out channels 3▸ instantiate the “?” type parameter 3▸ automate continuation channel creation 7
![Page 44: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/44.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
The “create-send-continue” patternWe can observe that In/Out channel pairs are usually created forcontinuing a session after sending a message
Let us add the !! method to Out[⋅]:
abstract class Out[-A] {
...
def !![B](h: Out[B] => A): In[B] = {
val (cin, cout) = this.create[A]() // Create...
this ! h(cout) // ...send...
cin // ...continue
}
def !![B](h: In[B] => A): Out[B] = {
val (cin, cout) = this.create[A]() // Create...
this ! h(cin) // ...send...
cout // ...continue
}
}
![Page 45: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/45.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
The “create-send-continue” patternWe can observe that In/Out channel pairs are usually created forcontinuing a session after sending a message
Let us add the !! method to Out[⋅]:
abstract class Out[-A] {
...
def !![B](h: Out[B] => A): In[B] = {
val (cin, cout) = this.create[A]() // Create...
this ! h(cout) // ...send...
cin // ...continue
}
def !![B](h: In[B] => A): Out[B] = {
val (cin, cout) = this.create[A]() // Create...
this ! h(cin) // ...send...
cout // ...continue
}
}
![Page 46: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/46.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (II)
Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
“Session Scala” (pseudo-code)
def client(c: S_h): Unit = {
if (...) {
c ! Greet("Alice")
c ? {
Hello(name) => client(c)
Bye(name) => ()
}
} else {
c ! Quit()
}
}
Scala + lchannels
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val c2 = c !! Greet("Alice")_
c2 ? {
case m @ Hello(name) => client(m.cont)
case Bye(name) => ()
}
} else {
c ! Quit()
}
}
![Page 47: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/47.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (II)
Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
“Session Scala” (pseudo-code)
def client(c: S_h): Unit = {
if (...) {
c ! Greet("Alice")
c ? {
Hello(name) => client(c)
Bye(name) => ()
}
} else {
c ! Quit()
}
}
Scala + lchannels
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val c2 = c !! Greet("Alice")_
c2 ? {
case m @ Hello(name) => client(m.cont)
case Bye(name) => ()
}
} else {
c ! Quit()
}
}
![Page 48: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/48.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (II)
Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
“Session Scala” (pseudo-code)
def client(c: S_h): Unit = {
if (...) {
c ! Greet("Alice")
c ? {
Hello(name) => client(c)
Bye(name) => ()
}
} else {
c ! Quit()
}
}
Scala + lchannels
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val c2 = c !! Greet("Alice")_
c2 ? {
case m @ Hello(name) => client(m.cont)
case Bye(name) => ()
}
} else {
c ! Quit()
}
}
![Page 49: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/49.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Programming with lchannels (II)
Sh = µX.(!Greet(String).(?Hello(String).X & ?Bye(String).end) ⊕ !Quit.end)
prot⟪Sh⟫N =
sealed abstract class Startcase class Greet(p: String)(val cont: Out[Greeting]) extends Startcase class Quit(p: Unit) extends Start
sealed abstract class Greetingcase class Hello(p: String)(val cont: Out[Start]) extends Greetingcase class Bye(p: String) extends Greeting
“Session Scala” (pseudo-code)
def client(c: S_h): Unit = {
if (...) {
c ! Greet("Alice")
c ? {
Hello(name) => client(c)
Bye(name) => ()
}
} else {
c ! Quit()
}
}
Scala + lchannels
def client(c: Out[Start]): Unit = {
if (Random.nextBoolean()) {
val c2 = c !! Greet("Alice")_
c2 ? {
case m @ Hello(name) => client(m.cont)
case Bye(name) => ()
}
} else {
c ! Quit()
}
}
![Page 50: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/50.jpg)
Demo
![Page 51: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/51.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Run-time and compile-time checks
Well-typed output / int. choice Compile-timeExhaustive input / ext. choice Compile-time
Double use of linear output endp. Run-timeDouble use of linear input endp. Run-time
“Forgotten” output Run-time (timeout on input side)
“Forgotten” input Unchecked
![Page 52: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/52.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Run-time and compile-time checks
Well-typed output / int. choice Compile-timeExhaustive input / ext. choice Compile-time
Double use of linear output endp. Run-timeDouble use of linear input endp. Run-time
“Forgotten” output Run-time (timeout on input side)
“Forgotten” input Unchecked
![Page 53: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/53.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Run-time and compile-time checks
Well-typed output / int. choice Compile-timeExhaustive input / ext. choice Compile-time
Double use of linear output endp. Run-timeDouble use of linear input endp. Run-time
“Forgotten” output Run-time (timeout on input side)
“Forgotten” input Unchecked
![Page 54: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/54.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Formal properties
Theorem (Preservation of duality).
⟪S⟫N = ⟪S⟫N (where In[A] = Out[A] and Out[A] = In[A]).
Theorem (Dual session types have the same CPS protocol classes).
prot⟪S⟫N = prot⟪S⟫N .
Theorem (Scala subtyping implies session subtyping).
For all S,N :
▸ if ⟪S⟫N = In[A] and B <∶ In[A],then ∃S ′,N ′ such that B = ⟪S ′⟫N ′ and S ′ ⩽ S;
▸ if ⟪S⟫N = Out[A] and Out[A]<∶ B,then ∃S ′,N ′ such that B = ⟪S ′⟫N ′ and S ⩽ S ′.
![Page 55: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/55.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Formal properties
Theorem (Preservation of duality).
⟪S⟫N = ⟪S⟫N (where In[A] = Out[A] and Out[A] = In[A]).
Theorem (Dual session types have the same CPS protocol classes).
prot⟪S⟫N = prot⟪S⟫N .
Theorem (Scala subtyping implies session subtyping).
For all S,N :
▸ if ⟪S⟫N = In[A] and B <∶ In[A],then ∃S ′,N ′ such that B = ⟪S ′⟫N ′ and S ′ ⩽ S;
▸ if ⟪S⟫N = Out[A] and Out[A]<∶ B,then ∃S ′,N ′ such that B = ⟪S ′⟫N ′ and S ⩽ S ′.
![Page 56: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/56.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Formal properties
Theorem (Preservation of duality).
⟪S⟫N = ⟪S⟫N (where In[A] = Out[A] and Out[A] = In[A]).
Theorem (Dual session types have the same CPS protocol classes).
prot⟪S⟫N = prot⟪S⟫N .
Theorem (Scala subtyping implies session subtyping).
For all S,N :
▸ if ⟪S⟫N = In[A] and B <∶ In[A],then ∃S ′,N ′ such that B = ⟪S ′⟫N ′ and S ′ ⩽ S;
▸ if ⟪S⟫N = Out[A] and Out[A]<∶ B,then ∃S ′,N ′ such that B = ⟪S ′⟫N ′ and S ⩽ S ′.
![Page 57: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/57.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Conclusions
We presented a lightweight integration of session types in Scalabased on a formal link between CPS protocols and session types
We leveraged standard Scala features (from its type system andlibrary) with a thin abstraction layer (lchannels)
▸ low cognitive overhead, integration and maintenance costs
▸ naturally supported by modern IDEs (e.g. Eclipse)
We validated our session-types-based programming approach withcase studies (from literature and industry) and benchmarks
![Page 58: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/58.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Ongoing and future work
Automatic generation of CPS protocol classesfrom session types, using Scala macros
▸ B. Joseph. “Session Metaprogramming in Scala”. MSc Thesis, 2016
Extend to multiparty session types, using Scribble
▸ A. Scalas, O. Dardha, R. Hu, N. Yoshida.
“A Linear Decomposition of Multiparty Sessions”.https://www.doc.ic.ac.uk/~ascalas/mpst-linear/
Generalise the approach to other frameworks beyondlchannels, and study its properties.Natural candidates: Akka Typed, Reactors.IO
Investigate other programming languages. Possible candidate:C# (declaration-site variance and FP features)
![Page 59: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/59.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Ongoing and future work
Automatic generation of CPS protocol classesfrom session types, using Scala macros
▸ B. Joseph. “Session Metaprogramming in Scala”. MSc Thesis, 2016
Extend to multiparty session types, using Scribble
▸ A. Scalas, O. Dardha, R. Hu, N. Yoshida.
“A Linear Decomposition of Multiparty Sessions”.https://www.doc.ic.ac.uk/~ascalas/mpst-linear/
Generalise the approach to other frameworks beyondlchannels, and study its properties.Natural candidates: Akka Typed, Reactors.IO
Investigate other programming languages. Possible candidate:C# (declaration-site variance and FP features)
![Page 60: Lightweight Session Programming in Scalamrg.doc.ic.ac.uk/talks/2017/03/novisad/novi-sad-2017-slides.pdf · Introduction Background lchannels Demo Formal properties Conclusions Mixing](https://reader033.fdocuments.net/reader033/viewer/2022060906/60a1316cb5fdd373714cf676/html5/thumbnails/60.jpg)
Introduction Background lchannels Demo Formal properties Conclusions
Try lchannels!
http://alcestes.github.io/lchannels
Consist
ent *Complete *
Well D
ocumented*Easyt
oR
euse* *
Evaluated
*ECOOP*
Artifact
*AEC