C++ Template Metaprogramming Why, When and How? Zoltán Porkoláb Dept. of Programming Languages and Compilers, Faculty of Informatics Eötvös.

Slides:



Advertisements
Similar presentations
1 An anomaly of subtype relations at component refinement and a generative solution in C++ Zoltán Porkoláb, István Zólyomi {gsd | Eötvös.
Advertisements

Template. 2 Using templates, it is possible to create generic functions and classes. In a generic function or class, the type of data upon which the function.
Semantic Analysis Chapter 6. Two Flavors  Static (done during compile time) –C –Ada  Dynamic (done during run time) –LISP –Smalltalk  Optimization.
Programming Languages and Paradigms
5th MaCS Debrecen On the Turing-Completeness of Generative Metaprograms Zoltán Porkoláb, István Zólyomi Dept. of Programming.
1 Introduction to Data Types (Section 7.1) CSCI 431 Programming Languages Fall 2003 A compilation of material developed by Felix Hernandez-Campos and Michael.
INF 212 ANALYSIS OF PROG. LANGS Type Systems Instructors: Crista Lopes Copyright © Instructors.
6/10/2015C++ for Java Programmers1 Pointers and References Timothy Budd.
Copyright © 2006 The McGraw-Hill Companies, Inc. Programming Languages 2nd edition Tucker and Noonan Chapter 5 Types Types are the leaven of computer programming;
CS-341 Dick Steflik Introduction. C++ General purpose programming language A superset of C (except for minor details) provides new flexible ways for defining.
Maya: Multiple-Dispatch Syntax Extension in Java Jason Baker and Wilson C. Hsieh University of Utah.
1Genericity  C++ Templates. 2 Parametric Polymorphism Allows definitions to be parametrized at compile-time Such a definition is actually a “function”
 2006 Pearson Education, Inc. All rights reserved. Templates (again)CS-2303, C-Term Templates (again) CS-2303 System Programming Concepts (Slides.
Templates. Objectives At the conclusion of this lesson, students should be able to Explain how function templates are used Correctly create a function.
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Java Software Solutions Foundations of Program Design Sixth Edition by Lewis.
CSE 332: C++ templates and generic programming I Motivation for Generic Programming in C++ We’ve looked at procedural programming –Reuse of code by packaging.
CSE 332: C++ Overloading Overview of C++ Overloading Overloading occurs when the same operator or function name is used with different signatures Both.
LECTURE LECTURE 17 More on Templates 20 An abstract recipe for producing concrete code.
CSE 332: C++ templates This Week C++ Templates –Another form of polymorphism (interface based) –Let you plug different types into reusable code Assigned.
CS 403: Programming Languages Lecture 2 Fall 2003 Department of Computer Science University of Alabama Joel Jones.
Polymorphism, Inheritance Pt. 1 COMP 401, Fall 2014 Lecture 7 9/9/2014.
Bindings and scope  Bindings and environments  Scope and block structure  Declarations Programming Languages 3 © 2012 David A Watt, University.
Compiler Support for Profiling C++ Template Metaprograms József Mihalicza, Norbert Pataki, Zoltán Porkoláb Eötvös Loránd University Faculty of Informatics.
Concordia University Department of Computer Science and Software Engineering Click to edit Master title style ADVANCED PROGRAM DESIGN WITH C++ Templates.
Object Oriented Programming Elhanan Borenstein copyrights © Elhanan Borenstein.
CNS  Executive Overview  Template Parameters  Function Template Issues 2 CNS Templates.
Rossella Lau Lecture 1, DCO10105, Semester B, DCO10105 Object-Oriented Programming and Design  Lecture 1: Introduction What this course is about:
Metaprogramming from University to Industry Zoltán Porkoláb Dept. of Programming Languages and Compilers, Faculty of.
Programming Language Support for Generic Libraries Jeremy Siek and Walid Taha Abstract The generic programming methodology is revolutionizing the way we.
GPCE'04, Vancouver 1 Towards a General Template Introspection Library in C++ István Zólyomi, Zoltán Porkoláb Department of Programming Languages and Compilers.
C++ History C++ was designed at AT&T Bell Labs by Bjarne Stroustrup in the early 80's Based on the ‘C’ programming language C++ language standardised in.
Copyright © Curt Hill Generic Classes Template Classes or Container Classes.
Meta IFL 2007 Freiburg1 Meta - Towards a Functional-Style Interface for C++ Template Metaprograms * Ádám Sipos, Zoltán Porkoláb, Norbert Pataki, Viktória.
COP4020 Programming Languages Names, Scopes, and Bindings Prof. Xin Yuan.
Object Oriented Programming Elhanan Borenstein Lecture #10 copyrights © Elhanan Borenstein.
Types(1). Lecture 52 Type(1)  A type is a collection of values and operations on those values. Integer type  values..., -2, -1, 0, 1, 2,...  operations.
Templates L. Grewe. 2 Goals Often want to do basically the same thing w/diff things –functions work on variables only types specified –  algorithmic.
Overview of C++ Templates
3C-1 Purity Typing Language semantics Inheritance model  Single vs. Multiple inheritance  Common root Modular mechanisms Generics Object Oriented Languages.
Functions Sujana Jyothi C++ Workshop Day 2. Functions 3 Parameter transmission modes pass by value (default) pass by reference (&) pass by const reference.
Concordia University Department of Computer Science and Software Engineering Click to edit Master title style ADVANCED PROGRAM DESIGN WITH C++ Templates.
 In the java programming language, a keyword is one of 50 reserved words which have a predefined meaning in the language; because of this,
Fall 2015CISC/CMPE320 - Prof. McLeod1 CISC/CMPE320 Assignment 4 is due Nov. 20 (next Friday). After today you should know everything you need for assignment.
Concepts in C++. Templates in current C++ C++ template is typeless No language support for constrained generics Accidental errors found in instantiation.
CS 152: Programming Language Paradigms March 19 Class Meeting Department of Computer Science San Jose State University Spring 2014 Instructor: Ron Mak.
CSC 143A 1 CSC 143 Introduction to C++ [Appendix A]
How to execute Program structure Variables name, keywords, binding, scope, lifetime Data types – type system – primitives, strings, arrays, hashes – pointers/references.
CSE 374 Programming Concepts & Tools Hal Perkins Fall 2015 Lecture 12 – C: structs, linked lists, and casts.
Semantic Analysis II Type Checking EECS 483 – Lecture 12 University of Michigan Wednesday, October 18, 2006.
CS212: Object Oriented Analysis and Design Lecture 22: Generic Class Design.
LECTURE LECTURE 17 Templates 19 An abstract recipe for producing concrete code.
Fall 2015CISC/CMPE320 - Prof. McLeod1 CISC/CMPE320 Assignment 4 is due Nov. 20 (this Friday). Today: –Templates. –STL –Smart Pointers.
Copyright © 2012 Pearson Education, Inc. Chapter 10 Advanced Topics.
CSE 332: C++ templates and generic programming II Review: Concepts and Models Templates impose requirements on type parameters –Types that are plugged.
Copyright 2006 Pearson Addison-Wesley, 2008, 2012 Joey Paquet 1 Concordia University Department of Computer Science and Software Engineering SOEN6441 –
CS 342: C++ Overloading Copyright © 2004 Dept. of Computer Science and Engineering, Washington University Overview of C++ Overloading Overloading occurs.
CSE 332: C++ Overloading Overview of C++ Overloading Overloading occurs when the same operator or function name is used with different signatures Both.
C++ REVIEW – TEMPLATES. GENERIC PROGRAMMING Programming/developing algorithms with the abstraction of types Algorithms/data is expressed “without type”
Semantic Analysis Chapter 6. Two Flavors  Static (done during compile time) –C –Ada  Dynamic (done during run time) –LISP –Smalltalk  Optimization.
Dr. M. Al-Mulhem Introduction 1 Chapter 6 Type Systems.
5th MaCS Debrecen On the Turing-Completeness of Generative Metaprograms Zoltán Porkoláb, István Zólyomi Dept. of Programming.
Programming Introduction to C++.
Semantic Analysis Chapter 6.
11/10/2018.
CMSC 202 Lesson 22 Templates I.
Govt. Polytechnic,Dhangar
Prof. Bhushan Trivedi Director GLS Institute of Computer Technology
Semantic Analysis Chapter 6.
Templates I CMSC 202.
Presentation transcript:

C++ Template Metaprogramming Why, When and How? Zoltán Porkoláb Dept. of Programming Languages and Compilers, Faculty of Informatics Eötvös Loránd University, Budapest

2CEEPUS Kosice 2007 Agenda I always knew C++ templates were the work of the Devil, and now I'm sure... - Cliff Click cited by Todd Veldhuisen Generative program constructions Metaprograms Power of generative metaprograms Sample usages Open questions

3CEEPUS Kosice 2007 Generative constructions Widely used in modern programming languages: Smalltalk, Lisp, other functional langs. Eiffel ADA generics C++ templates Java generics: Pizza, GJ, Java 1.5 C#: soon

4CEEPUS Kosice 2007 Why generics? Conventional techniques are working only for complete types. int max( int a, int b) { if ( a > b ) return a; else return b; if ( a > b ) return a; else return b;} double max( double a, double b) { if ( a > b ) return a; else return b; if ( a > b ) return a; else return b;}Etc… class date { //… //… }; date d = max ( d1, d2);

5CEEPUS Kosice 2007 Preprocessor Macro? Ada generics : "a restricted form of context-sensitive macro facility" C++ templates: "a clever kind of macro that obeys the scope, naming, and type rules of C++" #define MAX(a,b) a > b ? a : b Works, because a macro is - typeless. Processed not by the compiler, therefore there are a number of "secondary effect": MAX( x, y)*2 x > y ? x : y*2 x > y ? x : y*2 MAX( ++x, y) ++x > y ? ++x : y

6CEEPUS Kosice 2007 Generative constructions void swap( int& x, int& y) void swap( int& x, int& y) { int temp = x; // !! how to detect type of x? int temp = x; // !! how to detect type of x? x = y; y = temp; x = y; y = temp; } Does not works: a macro is - typeless. We need a facility to use type parameters. template void swap( T& x, T& y) { T temp = x; x = y; y = temp; } Template depends only on the properties that is actually used Does not require different types used as arguments to be explicitly related. In particular, the argument types used as a template need not be from a single inheritance hierarchy.

7CEEPUS Kosice 2007 C++ Function Templates 1. Template is not a single function Rather a schema to instantiate functions on request template T max( T a, T b) { if ( a > b ) return a; if ( a > b ) return a; else return b; else return b;} int i = 3, j = 6, k; k = max(i,j); double x = 3.14, y = 4.15, z; z = max(x,y); Parameter deduction Template instantiation

8CEEPUS Kosice 2007 C++ Function Templates 2. Instantiation in compile-time Then strong type system rules are applied int i = 3; double y = 3.14, z; z = max(i,y); template T max( T a, S b) { if ( a > b ) return a; if ( a > b ) return a; else return b; else return b;} z == 3; No deduction on return type No runtime information could be used

9CEEPUS Kosice 2007 C++ Function Templates 3. Explicit specialization int i = 3; double y = 3.14, z; template template R max( T a, S b) { if ( a > b ) return a; if ( a > b ) return a; else return b; else return b;} z = max (i,y); Template overloading

10CEEPUS Kosice 2007 C++ Function Templates 4. User specialization const char *s1 = “Hello”; const char *s2 = “world”; template <> const char * max( const char *a, const char *b) { if ( strcmp(a,b) < 0 ) return a; if ( strcmp(a,b) < 0 ) return a; else return b; else return b;} The compiler selects the most specific matching type cout << max (4,5); cout (3.14,’6’); cout << max (“this”, “greater”);

11CEEPUS Kosice 2007 C++ Class Templates 1. Similar way template class matrix { public: matrix( int i, int j ); matrix( int i, int j ); matrix( const matrix &other) matrix( const matrix &other) ~matrix(); ~matrix(); matrix& operator=( const matrix &other); matrix& operator=( const matrix &other);private: vector v; vector v;}; Created always with explicit specialisation matrix m(4,5);

12CEEPUS Kosice 2007 C++ Class Templates 2. User specialization template <> class matrix template <> class matrix { public: matrix( int i, int j ); matrix( int i, int j ); matrix( const matrix &other) matrix( const matrix &other) ~matrix(); ~matrix(); matrix& operator=( const matrix &other); matrix& operator=( const matrix &other);private: a_better_representation v; a_better_representation v;}; Used the same way matrix m(4,5);

13CEEPUS Kosice 2007 C++ Templates The C++ templates were first implemented in the early ’90s Accepted as part of the ANSI/ISO in 1994 Erwin Unruh: 1994 unruh.cpp 30: conversion from enum to D requested

14CEEPUS Kosice 2007 Power of C++ templates The C++ templates are Turing-complete The Compiler “executes” template metaprograms The result is a non-templated program executed in “run-time” In 1966 Böhm and Jacopini proved: Turing machine implementation conditional and looping constructions Turing machine implementation conditional and looping constructions

15CEEPUS Kosice 2007 The Factorial example int factorial( int n) { return (n==0) ? 1 : n*factorial(n-1); return (n==0) ? 1 : n*factorial(n-1);} int main() { cout << factorial(15) << endl; cout << factorial(15) << endl; return 0; return 0;} template struct Factorial { enum { value = N * Factorial ::value }; enum { value = N * Factorial ::value };}; template <> struct Factorial { enum { value = 1 }; enum { value = 1 };}; int main() { const int fact5 = Factorial ::value; const int fact5 = Factorial ::value; std::cout << fact5 << endl; std::cout << fact5 << endl; return 0; return 0;}

16CEEPUS Kosice 2007 Conditional statement template template struct IF { typedef Then RET; typedef Then RET;}; template template struct IF struct IF { typedef Else RET; typedef Else RET;}; template template IF ::RET max(T t, S s) { if (t > s) return t; if (t > s) return t; else return s; else return s;}

17CEEPUS Kosice 2007 Programs vs. Metaprograms Function (runtime) Data VariableAssignmentConditionLoopClass Type and constant Symbolic names Const initialization enumerated values enumerated valuesRecursion

18CEEPUS Kosice 2007 Motivation int main() { const unsigned int di = 12; const unsigned int di = 12; const unsigned int oi = 014; const unsigned int oi = 014; const unsigned int hi = 0xc; const unsigned int hi = 0xc; const unsigned int bi0 = binary_value("1101"); const unsigned int bi0 = binary_value("1101"); const unsigned int bi1 = binary ::value; const unsigned int bi1 = binary ::value;}

19CEEPUS Kosice 2007 Motivation template template struct binary { static unsigned const value static unsigned const value = binary ::value * 2 // prepend higher bits = binary ::value * 2 // prepend higher bits + N%10; // to lowest bit + N%10; // to lowest bit}; template <> // specialization struct binary // terminates recursion { static unsigned const value = 0; static unsigned const value = 0;};

20CEEPUS Kosice 2007 Main areas Expression templates Static interface checking Regular expression library Concept cheking Extend existing type system ???

21CEEPUS Kosice 2007 Expression templates Improve efficiency of programs Save space and / or time Keep the code correctly organized Supercomputing, numerical computing

22CEEPUS Kosice 2007 Expression templates Array a, b, c, d, e; // Object-oriented way of a = b + c + d + e double* _t1 = new double[N]; for ( int i=0; i<N; ++i) _t1[i] = b[i] + c[i]; double* _t2 = new double[N]; for ( int i=0; i<N; ++i) _t2[i] = _t1[i] + d[i]; double* _t3 = new double[N*M]; for ( int i=0; i<N; ++i) _t3[i] = _t2[i] + e[i]; for ( int i=0; i<N; ++i) a[i] = _t3[i]; delete [] _t3; delete [] _t2; delete [] _t1; // Fortran like solution: for ( int i=0; i<N; ++i) a[i] = b[i] + c[i] + d[i] + e[i];

23CEEPUS Kosice 2007 Concept checking interface Cloneable { T* T::Clone() const; T* T::Clone() const;} template class C { // T must provide T* T::Clone() const... // T must provide T* T::Clone() const...} template class C {public: void SomeFunc( const T* t) { t->Clone(); } void SomeFunc( const T* t) { t->Clone(); }};

24CEEPUS Kosice 2007 Extendig type system Family polymorphism Eric Ernst Eric Ernst Generic-Beta Generic-Beta Structural subtyping

25CEEPUS Kosice 2007 Structural subtyping Example from Harold Osher Example from Harold Osher OpEval PlusCheckPlusEval Operator Plus OpCheckOpDisplay PlusDisplay

26CEEPUS Kosice 2007 Open questions The real expressive power Standard tools but: Loki from Andrei Alexandrescu but: Loki from Andrei AlexandrescuGarantee How to design How to debug

C++ Template Metaprogramming Why, When and How? Zoltán Porkoláb Dept. of Programming Languages and Compilers, Faculty of Informatics Eötvös Loránd University, Budapest Thank you! Questions?