copy and paste redeemed
play

Copy-and-Paste Redeemed Towards Adapting Abstractions Christoph - PowerPoint PPT Presentation

Copy-and-Paste Redeemed Towards Adapting Abstractions Christoph Reichenbach Goethe University Frankfurt 09 November 2015 based on our ASE 2015 paper with Krishna Narasimhan Extending DSLs PQL/Java : Parallel Query Language for Java


  1. Copy-and-Paste Redeemed Towards Adapting Abstractions Christoph Reichenbach Goethe University Frankfurt 09 November 2015 based on our ASE 2015 paper with Krishna Narasimhan

  2. Extending DSLs ◮ PQL/Java : Parallel Query Language for Java ◮ PQL-ESL : Extension Specification Language for PQL/Java 2 / 14

  3. Extending DSLs ◮ PQL/Java : Parallel Query Language for Java ◮ PQL-ESL : Extension Specification Language for PQL/Java ◮ Student Project: Add SQL support via PQL-ESL 2 / 14

  4. Extending DSLs ◮ PQL/Java : Parallel Query Language for Java ◮ PQL-ESL : Extension Specification Language for PQL/Java ◮ Student Project: Add SQL support via PQL-ESL ◮ BSc student: “Using PQL-ESL abstractions was challenging” ◮ SQL support still not optimal: Differences in SQL implementations would require multiple backends 2 / 14

  5. Extending DSLs ◮ PQL/Java : Parallel Query Language for Java ◮ PQL-ESL : Extension Specification Language for PQL/Java ◮ Student Project: Add SQL support via PQL-ESL ◮ BSc student: “Using PQL-ESL abstractions was challenging” ◮ SQL support still not optimal: Differences in SQL implementations would require multiple backends ◮ Can we help introduce new abstractions? ◮ Can we help extend existing abstractions? 2 / 14

  6. Duplication vs. Abstraction int dist(coord a, coord b) { int dx = abs(a.x - b.x); int dy = abs(a.y - b.y); return std::max(dx, dy); } 3 / 14

  7. Duplication vs. Abstraction int dist(coord a, coord b) { int dx = abs(a.x - b.x); int dy = abs(a.y - b.y); return std::max(dx, dy); } int dist2(coord a, coord b) { int dx = abs(a.x - b.x); int dy = abs(a.y - b.y); return std::hypot(dx, dy); } 3 / 14

  8. Duplication vs. Abstraction int dist(coord a, coord b) { Alternative: Abstraction int dx = abs(a.x - b.x); int dy = abs(a.y - b.y); int distG(coord a, coord b, return std::max(dx, dy); int (*f)(int, int)) } { int dist2(coord a, coord b) int dx = abs(a.x - b.x); { int dy = abs(a.y - b.y); int dx = abs(a.x - b.x); return f(dx, dy); int dy = abs(a.y - b.y); } return std::hypot(dx, dy); } 3 / 14

  9. A Small User Study ◮ We took a number of near-clones from existing programs ◮ We removed one of the clones from each program ◮ We asked five C++ programmers (graduate students) to reimplement missing functionality ◮ Experience: 2, 3, 12, 48, 120 months ◮ Abstraction : ◮ Copy-Paste : 4 / 14

  10. A Small User Study ◮ We took a number of near-clones from existing programs ◮ We removed one of the clones from each program ◮ We asked five C++ programmers (graduate students) to reimplement missing functionality ◮ Experience: 2, 3, 12, 48, 120 months ◮ Abstraction : ◮ Users tend to prefer abstraction ◮ Copy-Paste : 4 / 14

  11. A Small User Study ◮ We took a number of near-clones from existing programs ◮ We removed one of the clones from each program ◮ We asked five C++ programmers (graduate students) to reimplement missing functionality ◮ Experience: 2, 3, 12, 48, 120 months ◮ Abstraction : ◮ Users tend to prefer abstraction ◮ 7 /10 tasks completed in time ◮ Copy-Paste : ◮ 15/15 tasks completed in time 4 / 14

  12. A Small User Study ◮ We took a number of near-clones from existing programs ◮ We removed one of the clones from each program ◮ We asked five C++ programmers (graduate students) to reimplement missing functionality ◮ Experience: 2, 3, 12, 48, 120 months ◮ Abstraction : ◮ Users tend to prefer abstraction ◮ 12/15 tasks completed in time ◮ Copy-Paste : ◮ 15/15 tasks completed in time 4 / 14

  13. A Small User Study ◮ We took a number of near-clones from existing programs ◮ We removed one of the clones from each program ◮ We asked five C++ programmers (graduate students) to reimplement missing functionality ◮ Experience: 2, 3, 12, 48, 120 months ◮ Abstraction : ◮ Users tend to prefer abstraction ◮ 12/15 tasks completed in time ◮ Factor 2-3 slower than abstraction ◮ Copy-Paste : ◮ 15/15 tasks completed in time ◮ Universally faster (except for a single tie) 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 2 4 6 0 0 0 10 20 30 0 0 5 10 15 0 0 10 20 0 0 20 40 60 4 / 14

  14. The Best of Both Worlds ◮ Hypothesis: More abstractions ⇒ slower programmers ◮ However: ◮ Literature on clone research mostly agrees that clones are maintenance problem ◮ Practitioner literature strongly advocates abstraction ◮ Choice between: ◮ Fast development with copy-paste programming ◮ Maintainability with abstraction 5 / 14

  15. The Best of Both Worlds ◮ Hypothesis: More abstractions ⇒ slower programmers ◮ However: ◮ Literature on clone research mostly agrees that clones are maintenance problem ◮ Practitioner literature strongly advocates abstraction ◮ Choice between: ◮ Fast development with copy-paste programming ◮ Maintainability with abstraction ◮ Generative Programming perspective: ◮ Fast development with generation + manual edits ◮ Maintainability by evolving code generators 5 / 14

  16. The Best of Both Worlds ◮ Hypothesis: More abstractions ⇒ slower programmers ◮ However: ◮ Literature on clone research mostly agrees that clones are maintenance problem ◮ Practitioner literature strongly advocates abstraction ◮ Choice between: ◮ Fast development with copy-paste programming ◮ Maintainability with abstraction ◮ Generative Programming perspective: ◮ Fast development with generation + manual edits ◮ Maintainability by evolving code generators Why not both? 5 / 14

  17. An Example void function1() { fake_db_init(&fakedb, true ); run_mode = MODE_DEBUG; start(&service); } void function2() { fake_db_init(&fakedb, false ); run_mode = MODE_INFO; start(&service); } void function3() { db_init(); db_sanity_check(); run_mode = MODE_REGULAR; start(&service); } 6 / 14

  18. An Example void function1() { b(c,d); y = f1; x(z); } void function2() { b(c,e); y = f2; x(z); } void function3() { b2(); n(); y = f3; x(z); } 6 / 14

  19. An Example a void function1() { y x b f1 b(c,d); y = f1; c z d x(z); } void function2() { a b(c,e); y x y = f2; b f2 x(z); c e z } void function3() { b2(); a n(); y b2 n x y = f3; f3 x(z); z } 6 / 14

  20. Automating Abstraction a a a y y y x x b2 n x b f1 b f2 f3 c z c e z z d 7 / 14

  21. Automating Abstraction a a a y y y x x b2 n x b f1 b f2 f3 c z c e z z d merge a y M(12,3) M(3) M(1,2,3) x n z b b2 f1 f2 f3 c M(1,2) e d 7 / 14

  22. Automating Abstraction a a a y y y x x b2 n x b f1 b f2 f3 c z c e z z d merge a y M(12,3) M(3) M(1,2,3) x n z b b2 f1 f2 f3 c M(1,2) e d 7 / 14

  23. An Example void function1() { b(c,d); y = f1; x(z); } void function2() { b(c,e); y = f2; x(z); } void function3() { b2(); n(); y = f3; x(z); } 8 / 14

  24. An Example void fnMerged(int functionId, void function1() { int fValue, bool bParam) b(c,d); { y = f1; if (functionId == 1 x(z); || functionId == 2) { } b(c, bParam); void function2() } { if (functionId == 3) { b(c,e); b2(); y = f2; x(z); n(); } } void function3() y = fValue; { x(z); b2(); } n(); y = f3; x(z); } 8 / 14

  25. An Example void fnMerged(int functionId, void function1() { int fValue, bool bParam) b(c,d); { y = f1; if (functionId == 1 x(z); || functionId == 2) { } b(c, bParam); void function2() } { if (functionId == 3) { b(c,e); b2(); y = f2; x(z); n(); } } void function3() y = fValue; { x(z); b2(); } n(); void function1() { y = f3; fnMerged(1,f1,d); x(z); } } 8 / 14

  26. Realising Merge Points ◮ Merge Points (M) realised via abstraction ◮ Different forms of abstraction: ◮ C++ : ◮ Parameters ◮ Template parameters ◮ Fields ◮ Delegate patterns ◮ Subclasses ◮ Function pointers . . . 9 / 14

  27. Realising Merge Points ◮ Merge Points (M) realised via abstraction ◮ Different forms of abstraction: ◮ C++ : ◮ Parameters ◮ Template parameters ◮ Fields ◮ Delegate patterns ◮ Subclasses ◮ Function pointers . . . ◮ We leave choice of abstraction to user 9 / 14

  28. Realising Merge Points ◮ Merge Points (M) realised via abstraction ◮ Different forms of abstraction: ◮ C++ : ◮ Parameters ◮ Template parameters ◮ Fields ◮ Delegate patterns ◮ Subclasses ◮ Function pointers . . . ◮ We leave choice of abstraction to user ◮ Implemented as Eclipse plugin for C++ (based on CDT) 9 / 14

  29. Implementing Merges int f1() { return 1; } int f(int k) { switch (k) { int f2() { case 1: return 1; return 2; case 2: return 2; } } } void main() { void main() { cout << f1() << endl; cout << f(1) << endl; } } 10 / 14

  30. Implementing Merges int f1() { selector channel return 1; formal selector } int f(int k) { switch (k) { int f2() { case 1: return 1; selection mechanism return 2; case 2: return 2; } } actual selector } void main() { void main() { cout << f1() << endl; cout << f(1) << endl; } } ◮ Selector : encodes the variant to choose ◮ Selection Mechanism : translates selector to alternative 10 / 14

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