SlideShare a Scribd company logo
1 of 43
Download to read offline
Generic Programming Galore Using D

                             Andrei Alexandrescu, PhD

                                 Research Scientist
                                     Facebook




c 2011 Andrei Alexandrescu                              1 / 33
37% off




c 2011 Andrei Alexandrescu   2 / 33
Generic Programming




c 2011 Andrei Alexandrescu                         3 / 33
What is Generic Programming?




c 2011 Andrei Alexandrescu      4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code




c 2011 Andrei Alexandrescu                               4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code
         • Define types to implement said requirements




c 2011 Andrei Alexandrescu                               4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code
         • Define types to implement said requirements
         • Leverage the algorithm for ultimate reuse




c 2011 Andrei Alexandrescu                               4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code
         • Define types to implement said requirements
         • Leverage the algorithm for ultimate reuse
         • ...
         • Profit!




c 2011 Andrei Alexandrescu                               4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code
         • Define types to implement said requirements
         • Leverage the algorithm for ultimate reuse
         • ...
         • Profit!

                                                         ´
         • Arguably one of the noblest endeavors of our metier


c 2011 Andrei Alexandrescu                                       4 / 33
Generic Programming


         • “Write once, instantiate anywhere”
             ◦ Specialized implementations welcome
         • Prefers static type information and static expansion
           (macro style)
         • Fosters strong mathematical underpinnings
             ◦ Minimizing assumptions common theme in math
         • Tenuous relationship with binary interfaces
         • Starts with algorithms, not interfaces or objects
         • “Premature encapsulation is the root of some
           derangement”



c 2011 Andrei Alexandrescu                                        5 / 33
Warmup: the “dream min”




         • Should work at efficiency comparable to hand-written
           code
         • Take variadic arguments: min(a, b, ...)
             ◦ Avoid nonsensical calls min() and min(a)
         • Work for all ordered types and conversions
         • Decline incompatible types, without prejudice




c 2011 Andrei Alexandrescu                                       6 / 33
First prototype




       auto min(L, R)(L lhs, R rhs) {
          return rhs < lhs ? rhs : lhs;
       }
       auto a = min(x, y);
         • This function is as efficient as any specialized,
           handwritten version (true genericity)
         • Deduction for argument types and result type




c 2011 Andrei Alexandrescu                                    7 / 33
Variadic arguments


       auto min(T...)(T x) {
         static if (x.length > 2)
           return min(min(x[0], x[1]), x[2 .. $]);
         else
           return x[0] > x[1] ? x[1] : x[0];
       }
       ...
       auto m = min(a + b, 100, c);
         • x is not an array
         • This is not classic recursion


c 2011 Andrei Alexandrescu                           8 / 33
Reject nonsensical calls



       auto min(T...)(T x) if (x.length > 1) {
         ...
       }
         • Rejects calls with 0 or 1 arguments
         • Allows other overloads to take over, e.g. min element
           over a collection
         • More work needed
             ◦ Only accept types with a valid intersection
             ◦ Only accept types comparable with ”<”



c 2011 Andrei Alexandrescu                                         9 / 33
Common type

         • Task: Given a list of types, find the common type of all
       template CommonType(T...)
       {
         static if (T.length == 1)
           alias T[0] CommonType;
         else
           static if (is(typeof(1 ? T[0].init : T[1].init) U))
              alias CommonType!(U, T[2 .. $]) CommonType;
         else
           alias void CommonType;
       }
       // Usage
       static assert(is(CommonType!(int, short, long) == long));


c 2011 Andrei Alexandrescu                                           10 / 33
Using CommonType



       auto min(T...)(T x)
       if (x.length > 1
         && is(typeof(CommonType!T.init < CommonType!T.init)
               == bool))
       {
         static if (x.length > 2)
           return min(min(x[0], x[1]), x[2 .. $]);
         else
           return x[0] > x[1] ? x[1] : x[0];
       }




c 2011 Andrei Alexandrescu                                 11 / 33
How about min over many elements?


       auto min(R)(R range)
       if (isInputRange!R &&
           is(typeof(range.front < range.front) == bool))
       {
         auto result = range.front;
         range.popFront();
         foreach (e; range) {
           if (e < result) result = e;
         }
         return result;
       }
       auto m = [ 1, 5, 2, 0, 7, 9 ].min();
         • Works over anything that can be iterated

c 2011 Andrei Alexandrescu                                  12 / 33
How about argmin now?

       auto argmin(alias fun, R)(R r)
       if (isInputRange!R &&
           is(typeof(fun(r.front) < fun(r.front)) == bool))
       {
         auto result = r.front;
         auto cache = fun(result);
         r.popFront();
         foreach (e; r) {
           auto cand = fun(e);
           if (cand > cache) continue;
           result = e;
           cache = cand;
         }
         return result;
       }

c 2011 Andrei Alexandrescu                                    13 / 33
argmin




       auto s = ["abc", "a", "xz"];
       auto m = s.argmin!((x) => x.length);
         • Works on anything iterable and any predicate
         • Predicate is passed by alias
         • No loss of efficiency




c 2011 Andrei Alexandrescu                                14 / 33
The Generative Connection




c 2011 Andrei Alexandrescu                           15 / 33
Generative programming




         • In brief: code that generates code
         • Generic programming often requires algorithm
           specialization
         • Specification often present in a DSL




c 2011 Andrei Alexandrescu                                16 / 33
Embedded DSLs




              Force into host language’s syntax?




c 2011 Andrei Alexandrescu                         17 / 33
Embedded DSLs



         •   Formatted printing?




c 2011 Andrei Alexandrescu         18 / 33
Embedded DSLs



         • Formatted printing?
         • Regular expressions?




c 2011 Andrei Alexandrescu        18 / 33
Embedded DSLs



         • Formatted printing?
         • Regular expressions?
         • EBNF?




c 2011 Andrei Alexandrescu        18 / 33
Embedded DSLs



         • Formatted printing?
         • Regular expressions?
         • EBNF?
         • PEG?




c 2011 Andrei Alexandrescu        18 / 33
Embedded DSLs



         •   Formatted printing?
         •   Regular expressions?
         •   EBNF?
         •   PEG?
         •   SQL?




c 2011 Andrei Alexandrescu          18 / 33
Embedded DSLs



         •   Formatted printing?
         •   Regular expressions?
         •   EBNF?
         •   PEG?
         •   SQL?


         •   . . . Pasta for everyone!


c 2011 Andrei Alexandrescu               18 / 33
Embedded DSLs



                    Here: use with native grammar


                             Process during compilation


                     Generate D code accordingly


c 2011 Andrei Alexandrescu                                19 / 33
Compile-Time Evaluation


         • A large subset of D available for compile-time evaluation
                 ulong factorial(uint n) {
                     ulong result = 1;
                     foreach (i; 2 .. n) result *= i;
                     return result;
                 }
                 ...
                 auto f1 = factorial(10); // run-time
                 static f2 = factorial(10); // compile-time



c 2011 Andrei Alexandrescu                                             20 / 33
Code injection with mixin



       mixin("writeln("hello, world");");
       mixin(generateSomeCode());
         • Not as glamorous as AST manipulation but darn
           effective
         • Easy to understand and debug



         • Now we have compile-time evaluation AND mixin. . .




c 2011 Andrei Alexandrescu                                      21 / 33
Wait a minute!



c 2011 Andrei Alexandrescu                    22 / 33
Example: bitfields in library


       struct A {
         int a;
         mixin(bitfields!(
           uint, "x",    2,
           int, "y",     3,
           uint, "z",    2,
           bool, "flag", 1));
       }
       A obj;
       obj.x = 2;
       obj.z = obj.x;

c 2011 Andrei Alexandrescu      23 / 33
Parser

       import pegged.grammar; // by Philippe Sigaud
       mixin(grammar("
         Expr     <    Factor AddExpr*
         AddExpr <     (’+’/’-’) Factor
         Factor   <    Primary MulExpr*
         MulExpr <     (’*’/’/’) Primary
         Primary <     Parens / Number / Variable
                       / ’-’ Primary
         Parens   <    ’(’ Expr ’)’
         Number   <~ [0-9]+
         Variable <- Identifier
       "));

c 2011 Andrei Alexandrescu                        24 / 33
Usage




       // Parsing at compile-time:
       static parseTree1 = Expr.parse(
         "1 + 2 - (3*x-5)*6");
       pragma(msg, parseTree1.capture);
       // Parsing at run-time:
       auto parseTree2 = Expr.parse(readln());
       writeln(parseTree2.capture);




c 2011 Andrei Alexandrescu                       25 / 33
Scaling up




       1000 lines of D grammar →
          3000 lines D parser



c 2011 Andrei Alexandrescu         26 / 33
Highly integrated lex+yacc



c 2011 Andrei Alexandrescu           27 / 33
What about regexen?



c 2011 Andrei Alexandrescu              28 / 33
Compile-time regular expressions



         • GSoC project by Dmitry Olshansky: FReD
         • Fully UTF capable, no special casing for ASCII
         • Two modes sharing the same backend:
                 auto r1 = regex("^.*/([^/]+)/?$");
                 static r2 = ctRegex!("^.*/([^/]+)/?$");
         • Run-time version uses intrinsics in a few places
         • Static version generates specialized automaton, then
           compiles it




c 2011 Andrei Alexandrescu                                        29 / 33
Summary




c 2011 Andrei Alexandrescu             31 / 33
Summary




         • Generic/generative programming—long unattained
           promise
         • D’s angle
             ◦ Powerful base language
             ◦ Type manipulation
             ◦ Compile-time evaluation
             ◦ Code generation




c 2011 Andrei Alexandrescu                                  32 / 33
Grill the Speaker!



   More about ranges? • Thought the talk was
   boring • Intriguing! • He lost me at mixin •
   Awesome • Went over my head • Meh • I wonder
   how I can implement binary search • What’s for
   dinner? • Accent is bothersome • Real
   programmers use C • Must. . . control. . . fist. . .
   of. . . death. . .



c 2011 Andrei Alexandrescu                               33 / 33

More Related Content

What's hot

Dynamic Type Inference for Gradual Hindley–Milner Typing
Dynamic Type Inference for Gradual Hindley–Milner TypingDynamic Type Inference for Gradual Hindley–Milner Typing
Dynamic Type Inference for Gradual Hindley–Milner TypingYusuke Miyazaki
 
Temporal logic and functional reactive programming
Temporal logic and functional reactive programmingTemporal logic and functional reactive programming
Temporal logic and functional reactive programmingSergei Winitzki
 
Being Expressive in Code
Being Expressive in CodeBeing Expressive in Code
Being Expressive in CodeEamonn Boyle
 
EdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for JavaEdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for JavaLisa Hua
 
what engineers don't know (but probably mathematicians do)
what engineers don't know (but probably mathematicians do)what engineers don't know (but probably mathematicians do)
what engineers don't know (but probably mathematicians do)budi rahardjo
 

What's hot (8)

Symbolic Execution And KLEE
Symbolic Execution And KLEESymbolic Execution And KLEE
Symbolic Execution And KLEE
 
C language
C languageC language
C language
 
Introduction to HDLs
Introduction to HDLsIntroduction to HDLs
Introduction to HDLs
 
Dynamic Type Inference for Gradual Hindley–Milner Typing
Dynamic Type Inference for Gradual Hindley–Milner TypingDynamic Type Inference for Gradual Hindley–Milner Typing
Dynamic Type Inference for Gradual Hindley–Milner Typing
 
Temporal logic and functional reactive programming
Temporal logic and functional reactive programmingTemporal logic and functional reactive programming
Temporal logic and functional reactive programming
 
Being Expressive in Code
Being Expressive in CodeBeing Expressive in Code
Being Expressive in Code
 
EdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for JavaEdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for Java
 
what engineers don't know (but probably mathematicians do)
what engineers don't know (but probably mathematicians do)what engineers don't know (but probably mathematicians do)
what engineers don't know (but probably mathematicians do)
 

Similar to Generic Programming Galore Using D

iterators-must-go
iterators-must-goiterators-must-go
iterators-must-goHiroshi Ono
 
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...Frank Nielsen
 
Contest Tips and Tricks
Contest Tips and TricksContest Tips and Tricks
Contest Tips and Tricksmbuzdalov
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to Elixirbrien_wankel
 
Global DSL workshop slides
Global DSL workshop slidesGlobal DSL workshop slides
Global DSL workshop slidesericupnorth
 
On being a professional software developer
On being a professional software developerOn being a professional software developer
On being a professional software developerAnton Kirillov
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)Ary Borenszweig
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)Ary Borenszweig
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)Crystal Language
 
A Replay Approach to Software Validation
A Replay Approach to Software ValidationA Replay Approach to Software Validation
A Replay Approach to Software ValidationJames Pascoe
 
Skiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DSkiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DMithun Hunsur
 
Антон Кириллов, ZeptoLab
Антон Кириллов, ZeptoLabАнтон Кириллов, ZeptoLab
Антон Кириллов, ZeptoLabDiana Dymolazova
 
Parallel Optimization in Machine Learning
Parallel Optimization in Machine LearningParallel Optimization in Machine Learning
Parallel Optimization in Machine LearningFabian Pedregosa
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to ElixirDiacode
 

Similar to Generic Programming Galore Using D (20)

Logic Programming and ILP
Logic Programming and ILPLogic Programming and ILP
Logic Programming and ILP
 
Interm codegen
Interm codegenInterm codegen
Interm codegen
 
iterators-must-go
iterators-must-goiterators-must-go
iterators-must-go
 
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...
 
Contest Tips and Tricks
Contest Tips and TricksContest Tips and Tricks
Contest Tips and Tricks
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to Elixir
 
Global DSL workshop slides
Global DSL workshop slidesGlobal DSL workshop slides
Global DSL workshop slides
 
1 cc
1 cc1 cc
1 cc
 
IN4308 1
IN4308 1IN4308 1
IN4308 1
 
On being a professional software developer
On being a professional software developerOn being a professional software developer
On being a professional software developer
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)
 
A Replay Approach to Software Validation
A Replay Approach to Software ValidationA Replay Approach to Software Validation
A Replay Approach to Software Validation
 
Skiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DSkiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in D
 
Clojure intro
Clojure introClojure intro
Clojure intro
 
Introduction to Prolog
Introduction to PrologIntroduction to Prolog
Introduction to Prolog
 
Антон Кириллов, ZeptoLab
Антон Кириллов, ZeptoLabАнтон Кириллов, ZeptoLab
Антон Кириллов, ZeptoLab
 
Parallel Optimization in Machine Learning
Parallel Optimization in Machine LearningParallel Optimization in Machine Learning
Parallel Optimization in Machine Learning
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to Elixir
 

Recently uploaded

Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 

Recently uploaded (20)

Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 

Generic Programming Galore Using D

  • 1. Generic Programming Galore Using D Andrei Alexandrescu, PhD Research Scientist Facebook c 2011 Andrei Alexandrescu 1 / 33
  • 2. 37% off c 2011 Andrei Alexandrescu 2 / 33
  • 3. Generic Programming c 2011 Andrei Alexandrescu 3 / 33
  • 4. What is Generic Programming? c 2011 Andrei Alexandrescu 4 / 33
  • 5. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code c 2011 Andrei Alexandrescu 4 / 33
  • 6. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code • Define types to implement said requirements c 2011 Andrei Alexandrescu 4 / 33
  • 7. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code • Define types to implement said requirements • Leverage the algorithm for ultimate reuse c 2011 Andrei Alexandrescu 4 / 33
  • 8. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code • Define types to implement said requirements • Leverage the algorithm for ultimate reuse • ... • Profit! c 2011 Andrei Alexandrescu 4 / 33
  • 9. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code • Define types to implement said requirements • Leverage the algorithm for ultimate reuse • ... • Profit! ´ • Arguably one of the noblest endeavors of our metier c 2011 Andrei Alexandrescu 4 / 33
  • 10. Generic Programming • “Write once, instantiate anywhere” ◦ Specialized implementations welcome • Prefers static type information and static expansion (macro style) • Fosters strong mathematical underpinnings ◦ Minimizing assumptions common theme in math • Tenuous relationship with binary interfaces • Starts with algorithms, not interfaces or objects • “Premature encapsulation is the root of some derangement” c 2011 Andrei Alexandrescu 5 / 33
  • 11. Warmup: the “dream min” • Should work at efficiency comparable to hand-written code • Take variadic arguments: min(a, b, ...) ◦ Avoid nonsensical calls min() and min(a) • Work for all ordered types and conversions • Decline incompatible types, without prejudice c 2011 Andrei Alexandrescu 6 / 33
  • 12. First prototype auto min(L, R)(L lhs, R rhs) { return rhs < lhs ? rhs : lhs; } auto a = min(x, y); • This function is as efficient as any specialized, handwritten version (true genericity) • Deduction for argument types and result type c 2011 Andrei Alexandrescu 7 / 33
  • 13. Variadic arguments auto min(T...)(T x) { static if (x.length > 2) return min(min(x[0], x[1]), x[2 .. $]); else return x[0] > x[1] ? x[1] : x[0]; } ... auto m = min(a + b, 100, c); • x is not an array • This is not classic recursion c 2011 Andrei Alexandrescu 8 / 33
  • 14. Reject nonsensical calls auto min(T...)(T x) if (x.length > 1) { ... } • Rejects calls with 0 or 1 arguments • Allows other overloads to take over, e.g. min element over a collection • More work needed ◦ Only accept types with a valid intersection ◦ Only accept types comparable with ”<” c 2011 Andrei Alexandrescu 9 / 33
  • 15. Common type • Task: Given a list of types, find the common type of all template CommonType(T...) { static if (T.length == 1) alias T[0] CommonType; else static if (is(typeof(1 ? T[0].init : T[1].init) U)) alias CommonType!(U, T[2 .. $]) CommonType; else alias void CommonType; } // Usage static assert(is(CommonType!(int, short, long) == long)); c 2011 Andrei Alexandrescu 10 / 33
  • 16. Using CommonType auto min(T...)(T x) if (x.length > 1 && is(typeof(CommonType!T.init < CommonType!T.init) == bool)) { static if (x.length > 2) return min(min(x[0], x[1]), x[2 .. $]); else return x[0] > x[1] ? x[1] : x[0]; } c 2011 Andrei Alexandrescu 11 / 33
  • 17. How about min over many elements? auto min(R)(R range) if (isInputRange!R && is(typeof(range.front < range.front) == bool)) { auto result = range.front; range.popFront(); foreach (e; range) { if (e < result) result = e; } return result; } auto m = [ 1, 5, 2, 0, 7, 9 ].min(); • Works over anything that can be iterated c 2011 Andrei Alexandrescu 12 / 33
  • 18. How about argmin now? auto argmin(alias fun, R)(R r) if (isInputRange!R && is(typeof(fun(r.front) < fun(r.front)) == bool)) { auto result = r.front; auto cache = fun(result); r.popFront(); foreach (e; r) { auto cand = fun(e); if (cand > cache) continue; result = e; cache = cand; } return result; } c 2011 Andrei Alexandrescu 13 / 33
  • 19. argmin auto s = ["abc", "a", "xz"]; auto m = s.argmin!((x) => x.length); • Works on anything iterable and any predicate • Predicate is passed by alias • No loss of efficiency c 2011 Andrei Alexandrescu 14 / 33
  • 20. The Generative Connection c 2011 Andrei Alexandrescu 15 / 33
  • 21. Generative programming • In brief: code that generates code • Generic programming often requires algorithm specialization • Specification often present in a DSL c 2011 Andrei Alexandrescu 16 / 33
  • 22. Embedded DSLs Force into host language’s syntax? c 2011 Andrei Alexandrescu 17 / 33
  • 23. Embedded DSLs • Formatted printing? c 2011 Andrei Alexandrescu 18 / 33
  • 24. Embedded DSLs • Formatted printing? • Regular expressions? c 2011 Andrei Alexandrescu 18 / 33
  • 25. Embedded DSLs • Formatted printing? • Regular expressions? • EBNF? c 2011 Andrei Alexandrescu 18 / 33
  • 26. Embedded DSLs • Formatted printing? • Regular expressions? • EBNF? • PEG? c 2011 Andrei Alexandrescu 18 / 33
  • 27. Embedded DSLs • Formatted printing? • Regular expressions? • EBNF? • PEG? • SQL? c 2011 Andrei Alexandrescu 18 / 33
  • 28. Embedded DSLs • Formatted printing? • Regular expressions? • EBNF? • PEG? • SQL? • . . . Pasta for everyone! c 2011 Andrei Alexandrescu 18 / 33
  • 29. Embedded DSLs Here: use with native grammar Process during compilation Generate D code accordingly c 2011 Andrei Alexandrescu 19 / 33
  • 30. Compile-Time Evaluation • A large subset of D available for compile-time evaluation ulong factorial(uint n) { ulong result = 1; foreach (i; 2 .. n) result *= i; return result; } ... auto f1 = factorial(10); // run-time static f2 = factorial(10); // compile-time c 2011 Andrei Alexandrescu 20 / 33
  • 31. Code injection with mixin mixin("writeln("hello, world");"); mixin(generateSomeCode()); • Not as glamorous as AST manipulation but darn effective • Easy to understand and debug • Now we have compile-time evaluation AND mixin. . . c 2011 Andrei Alexandrescu 21 / 33
  • 32. Wait a minute! c 2011 Andrei Alexandrescu 22 / 33
  • 33. Example: bitfields in library struct A { int a; mixin(bitfields!( uint, "x", 2, int, "y", 3, uint, "z", 2, bool, "flag", 1)); } A obj; obj.x = 2; obj.z = obj.x; c 2011 Andrei Alexandrescu 23 / 33
  • 34. Parser import pegged.grammar; // by Philippe Sigaud mixin(grammar(" Expr < Factor AddExpr* AddExpr < (’+’/’-’) Factor Factor < Primary MulExpr* MulExpr < (’*’/’/’) Primary Primary < Parens / Number / Variable / ’-’ Primary Parens < ’(’ Expr ’)’ Number <~ [0-9]+ Variable <- Identifier ")); c 2011 Andrei Alexandrescu 24 / 33
  • 35. Usage // Parsing at compile-time: static parseTree1 = Expr.parse( "1 + 2 - (3*x-5)*6"); pragma(msg, parseTree1.capture); // Parsing at run-time: auto parseTree2 = Expr.parse(readln()); writeln(parseTree2.capture); c 2011 Andrei Alexandrescu 25 / 33
  • 36. Scaling up 1000 lines of D grammar → 3000 lines D parser c 2011 Andrei Alexandrescu 26 / 33
  • 37. Highly integrated lex+yacc c 2011 Andrei Alexandrescu 27 / 33
  • 38. What about regexen? c 2011 Andrei Alexandrescu 28 / 33
  • 39. Compile-time regular expressions • GSoC project by Dmitry Olshansky: FReD • Fully UTF capable, no special casing for ASCII • Two modes sharing the same backend: auto r1 = regex("^.*/([^/]+)/?$"); static r2 = ctRegex!("^.*/([^/]+)/?$"); • Run-time version uses intrinsics in a few places • Static version generates specialized automaton, then compiles it c 2011 Andrei Alexandrescu 29 / 33
  • 40.
  • 41. Summary c 2011 Andrei Alexandrescu 31 / 33
  • 42. Summary • Generic/generative programming—long unattained promise • D’s angle ◦ Powerful base language ◦ Type manipulation ◦ Compile-time evaluation ◦ Code generation c 2011 Andrei Alexandrescu 32 / 33
  • 43. Grill the Speaker! More about ranges? • Thought the talk was boring • Intriguing! • He lost me at mixin • Awesome • Went over my head • Meh • I wonder how I can implement binary search • What’s for dinner? • Accent is bothersome • Real programmers use C • Must. . . control. . . fist. . . of. . . death. . . c 2011 Andrei Alexandrescu 33 / 33