a type system for dynamic layer composition
play

A Type System for Dynamic Layer Composition Atsushi Igarashi - PowerPoint PPT Presentation

A Type System for Dynamic Layer Composition Atsushi Igarashi (Kyoto Univ.) Joint work with Robert Hirschfeld (HPI) Hidehiko Masuhara (Univ. of Tokyo) Background Context-oriented Programming (COP) [Hirschfeld, Costanza, Nierstrasz JOT08]


  1. A Type System for Dynamic Layer Composition Atsushi Igarashi (Kyoto Univ.) Joint work with Robert Hirschfeld (HPI) Hidehiko Masuhara (Univ. of Tokyo)

  2. Background Context-oriented Programming (COP) [Hirschfeld, Costanza, Nierstrasz JOT08] ● Goal: modularizing behavioral variations depending on the dynamic context of execution ● e.g., editor key binding depending on buffer modes ● Several COP extensions of existing (OOP) langs ● Common language features ● Layers of partial methods ● Dynamic layer activation mechanism

  3. Dynamic Layer Activation in COP Layer of partial methods Base class hiearchy C C + m1 + m2 + m2 D E D E + m3 + m1 F F + m4 + m5

  4. Dynamic Layer Activation in COP Layer of partial methods Base class hiearchy ● Layer activation C C + m1 changes behavior of + m2 + m2 objects that have been already instantiated D D E E + m1 + m3 ● Partial methods can call the original behavior by F F proceed() + m4 + m5

  5. This Work Type system to prevent “NoSuchMethod” incl. dangling proceed calls

  6. “Sounds like an old problem. What is a challenge?” ● Object interfaces can change as layers are C C + m1 (de)activated! + m2 + m2 Overriding partial method D E + m3 + m1 “Layer-introduced” method, which can dynamically change the object interface! F + m4 + m5

  7. This Work Type system to prevent “NoSuchMethod” incl. dangling proceed calls ● By keeping track of which layers are activated at each program point ● Using declaration of dependency between layers Restriction: ● Activation/deactivation constructs are (slightly) different from the original

  8. Technical Contributions ● Formal type system for (a variant of) ContextFJ [Hirschfeld, I., Masuhara @FOAL'11] ● FJ-style calculus modeling COP features ● Proof of type soundness

  9. Plan of the Talk ● COP Language Constructs ● Type System ● Discussion ● Conclusion and Future Work

  10. COP Language Constructs Considered in This Work ● Partial methods ● Smallest unit to describe behavioral variations ● Comparable to advice in AOP ● Layers ● A bunch of partial methods ● Unit of modularity/cross-cutting concerns ● Block-structured global layer activation ● ensure statements (a variant of with)

  11. Example: Telecom simulation class Connection { Connection(Customer a, Customer b) { … } void complete() { … } void drop() { … } } Connection simulate() { Customer robert = …, hidehiko = …; Connection c = new Connection(robert, hidehiko); // Robert calls Hidehiko c.complete(); // Hidehiko accepts c.drop(); // and hangs up return c; }

  12. Example: Telecom simulation class Connection { Connection(Customer a, Customer b) { … } layer Timing { void complete() { … } class Connection { void drop() { … } Timer timer; } void complete() { proceed(); timer.start(); } void drop() { timer.stop(); proceed(); } int getTime() { return timer.getTime(); } } } ensure (Timing) { // layer activation! Connection c = simulate(); System.out.println(c.getTime()); } ● Layer activation is valid inside simulate()

  13. Example: Telecom simulation class Connection { layer Billing { Connection(Customer a, Customer b) { … } class Connection { layer Timing { void complete() { … } void drop() { proceed(); charge(); } class Connection { void drop() { … } void charge() { … getTime(); … } Timer timer; } } } void complete() { proceed(); timer.start(); } void drop() { timer.stop(); proceed(); } int getTime() { return timer.getTime(); } } } ensure (Timing) { ensure (Timing) { // layer activation! Connection c = simulate(); ensure (Billing) { System.out.println(c.getTime()); Connection c = simulate(); } } } ● Layer activation is valid inside simulate() ● Recently activated layer has priority

  14. Plan of the Talk ● COP Language Constructs ● Type System ● Discussion ● Conclusion and Future Work

  15. Main Problem and Key Ideas Main Problem: ● Layer activation can change object interface Key Ideas: ● Approximation of activated layers at each program point ● With the help of explicit “requires” declarations to specify inter-layer dependency

  16. Telecom example, revisited layer Billing { layer Timing { class Connection { class Connection { class Connection { Timer timer; Connection(Customer a, Customer b) { … } void complete() { proceed(); timer.start(); } void complete() { … } void drop() { proceed(); charge(); } void drop() { timer.stop(); proceed(); } void drop() { … } int getTime() { return timer.getTime(); } } void charge() { … getTime(); … } } } } } ● For charge() in Billing to work, layer- introduced base method getTime() defined in Timing should be active beforehand

  17. Telecom example, revisited layer Billing { requires Timing layer Timing { class Connection { class Connection { class Connection { Timer timer; Connection(Customer a, Customer b) { … } void complete() { proceed(); timer.start(); } void complete() { … } void drop() { proceed(); charge(); } void drop() { timer.stop(); proceed(); } void drop() { … } int getTime() { return timer.getTime(); } } void charge() { … getTime(); … } } } } } ● For charge() in Billing to work, layer- introduced base method getTime() defined in Timing should be active beforehand ● In other words, Billing requires Timing

  18. Meaning of requires When layer L requires L 1 , ..., L n ● Partial method in L can invoke methods defined in any of L 1 , ..., L n (or base) ● Partial method m in L can proceed when m is defined in any of L 1 , ..., L n (or base) ● All of L 1 , ..., L n must have been already activated before activating L

  19. A Bit of Formalism ContextFJ calculu s [Hirschfeld, I., Masuhara @FOAL'11] L ::= class C extends C { ~C ~f ; ~M } L ::= class C extends C { ~C ~f ; ~M } M ::= C m ( ~C ~x ){ return e ; } M ::= C m ( ~C ~x ){ return e ; } e ::= x | e . f | e . m ( ~e ) | new C ( ~e ) e ::= x | e . f | e . m ( ~e ) | new C ( ~e ) | ensure L e | proceed( ~e ) | super. m ( ~e ) | ensure L e | proceed( ~e ) | super. m ( ~e ) ● A ContextFJ program is ( CT , PT , e) , where ● Class table: CT ( C ) = L ● Partial method table: PT ( m,C,L ) = M

  20. Type Judgment Λ ; Γ ├ e : C Λ ; Γ ├ e : C “Under set Λ of activated layers and type env. Γ , exp e is given type C ” ● {}; c : Conn. ├ c.getTime() : int ● { Timing }; c : Conn. ├ c.getTime() : int ● {}; c : Conn. ├ ensure Timing c.getTime() : int ● {}; c : Conn. ├ ensure Billing c.drop() : void ● { Timing }; c : Conn. ├ ensure Billing c.drop() : void

  21. Main Typing Rules ● Typing rule for method invocation Λ ; Γ ├ e 0 : C 0 mtype ( m , C 0 , Λ ) = ~ D → C Λ ; Γ ├ ~ e : ~ C ~ C <: ~ D Λ ; Γ ├ e 0 . m ( ~e ) : C ● Typing rule for layer activation L req Λ' ⊆ Λ Λ ∪ L }; Γ ├ e : C Λ' { Λ ; Γ ├ ensure L e : C

  22. Main Typing Rules Method lookup takes Method lookup takes activated layers activated layers into account ● Typing rule for method invocation into account Λ ; Γ ├ e 0 : C 0 mtype ( m , C 0 , Λ ) = ~ D → C Λ ; Γ ├ ~ e : ~ C ~ C <: ~ D Λ ; Γ ├ e 0 . m ( ~e ) : C ● Typing rule for layer activation L req Λ' ⊆ Λ Λ ∪ L }; Γ ├ e : C Λ' { Λ ; Γ ├ ensure L e : C

  23. Main Typing Rules Method lookup takes Method lookup takes activated layers activated layers into account ● Typing rule for method invocation into account Λ ; Γ ├ e 0 : C 0 mtype ( m , C 0 , Λ ) = ~ D → C Body of ensure is typed Λ ; Γ ├ ~ e : ~ C ~ C <: ~ D Body of ensure is typed Layers that L requires Layers that L requires under additional assumption under additional assumption are already activated are already activated Λ ; Γ ├ e 0 . m ( ~e ) : C ● Typing rule for layer activation L req Λ' ⊆ Λ Λ ∪ L }; Γ ├ e : C Λ' { Λ ; Γ ├ ensure L e : C

  24. Sequence of Type Soundness active layers ● Reduction: L 1 ;...; L n ├ e → e' ● Thm. (Subject Reduction): ● If { L 1 ,..., L n }; Γ ├ e : C and L 1 ;...; L n ├ e → e' and L 1 ;...; L n is well formed, then ∃ D . { L 1 ,..., L n }; Γ ├ e' : D and D <: C ● Thm. (Progress) ● If { L 1 ,..., L n }; ・├ e : C , then e is a value or ∃ e' . e → e'

  25. Sequence of Type Soundness ● Empty seq. is wf. active layers ● L 1 ;...; L n is wf. ● Reduction: if L 1 ;...; L n -1 is wf. L 1 ;...; L n ├ e → e' and L n ( req ; ) { L 1 ,..., L n -1 } ⊆ ● Thm. (Subject Reduction): ● If { L 1 ,..., L n }; Γ ├ e : C and L 1 ;...; L n ├ e → e' and L 1 ;...; L n is well formed, then ∃ D . { L 1 ,..., L n }; Γ ├ e' : D and D <: C ● Thm. (Progress) ● If { L 1 ,..., L n }; ・├ e : C , then e is a value or ∃ e' . e → e'

  26. Plan of the Talk ● COP Language Constructs ● Type System ● Discussion ● Activation constructs ● Related work ● Conclusion and Future Work

  27. Constructs for (de)activation The original version of ContextFJ, as well as implementation (ContextJ, JCOP) has different constructs for (de)activation ● with for activation ● without for (block-structured) deactivation

  28. Comparing ensure and with ● Difference emerges when the same layer is to be activated twice ensure Timing { with Timing { ensure Billing { with Billing { ensure Timing { with Timing { Billing Billing Timing Timing Billing Timing ... ... ... ... ... ...

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