runtime concepts for the c++ stl - parasol laboratorypeterp/slides/oops08.pdf · runtime concepts...

24
Runtime Concepts for the C++ STL Peter Pirkelbauer 1 Sean Parent 2 Mat Marcus 2 Bjarne Stroustrup 1 1 Texas A&M University 2 Adobe Systems Inc. 23 rd Symposium on Applied Computing 2008 - OOPS Track Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18 th , 2008 1 / 19

Upload: nguyendat

Post on 07-Jun-2018

225 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Runtime Concepts for the C++ STL

Peter Pirkelbauer1 Sean Parent2 Mat Marcus2

Bjarne Stroustrup1

1Texas A&M University

2Adobe Systems Inc.

23rd Symposium on Applied Computing 2008 - OOPS Track

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 1 / 19

Page 2: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Overview

Introduction◮ C++ Standard Template Library (STL)◮ Problem Definition◮ The Runtime Concept Idiom

Contribution◮ The Algorithms Library◮ Runtime Concepts on Container elements

Conclusion

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 2 / 19

Page 3: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The C++ Standard Template Library (STL)

Data structures (vector, list, deque, map, set, etc.)

Algorithms

Concept based (will be in C++0x; Gregor et al. [4])

Regular Semantics (Dehnert and Stepanov [3])

Iterators

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 3 / 19

Page 4: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Problem - Conventional template codeInterface + Implementation

template <class Iterator>Iteratorrandom_elem(Iterator first, Iterator last){

typename Iterator::difference_type dist = distance(first, last);return advance(first, rand() % dist);

}

User code

// v is a std::vector<int>int elem = ∗random_elem(v.begin(), v.end());

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 4 / 19

Page 5: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Our Ideal WorldInterface

ForwardIter<Proxy>random_elem(ForwardIter<Proxy> first, ForwardIter<Proxy> last);

Implementation

ForwardIter<Proxy>random_elem(ForwardIter<Proxy> first, ForwardIter<Proxy> last){

ForwardIter::difference_type dist = distance(first, last);return advance(first, rand() % dist);

}

User code

// v is a std::vector<int>int elem = ∗random_elem(v.begin(), v.end());

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 5 / 19

Page 6: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Performance vs Loose Coupling

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 6 / 19

Page 7: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Polymorphic IteratorsInterface

ForwardIter<int>random_elem(ForwardIter<int> first, ForwardIter<int> last);

Implementation

ForwardIter<int>random_elem(ForwardIter<int> first, ForwardIter<int> last){

ForwardIter::difference_type dist = distance(first, last);return advance(first, rand() % dist);

}

User code

// v is a std::vector<int>int elem = ∗random_elem(v.begin(), v.end());

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 7 / 19

Page 8: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Runtime Concept IdiomParent [7], Järvi et al. [5], Marcus et al. [6]

struct Copyable {ConceptCopyable∗ c;

template<typename T>Copyable(const T& t)

: c(new ModelCopyable<T>(t)) {}

Copyable(const Copyable& obj): c(&obj.c−>clone()) {}

~Copyable(){

delete c;}

};

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 8 / 19

Page 9: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Runtime Concept IdiomParent [7], Järvi et al. [5], Marcus et al. [6]

struct ConceptCopyable {virtual ConceptCopyable& clone() const = 0;

};

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 8 / 19

Page 10: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Runtime Concept IdiomParent [7], Järvi et al. [5], Marcus et al. [6]

template <typename T>struct ModelCopyable : ConceptCopyable {

T t;

ModelCopyable(const T& val): t(val) {}

ModelCopyable& clone() const{

return ∗new ModelCopyable(t);}

};

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 8 / 19

Page 11: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Runtime Concept IdiomParent [7], Järvi et al. [5], Marcus et al. [6]

void accept_copyables(Copyable obj){

// invoke copy constructorCopyable cpy(obj);

}

// vectorstd::vector<int> vec;accept_copyables(vec);

// integeraccept_copyables(7);

// stringsstd::string str("Hello World");accept_copyables(str);

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 8 / 19

Page 12: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Applied to Iterators

Refinements (Marcus et al. [6]), Type Erasure and Iterators (Becker [1])

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 9 / 19

Page 13: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Algorithms LibraryInterface

ForwardIter<int>random_elem(ForwardIter<int> first, ForwardIter<int> last);

Implementation

ForwardIter<int>random_elem(ForwardIter<int> first, ForwardIter<int> last){

ForwardIter::difference_type dist = distance(first, last);return advance(first, rand() % dist);

}

User code

// v is a std::vector<int>int elem = ∗random_elem(v.begin(), v.end());

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 10 / 19

Page 14: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Algorithms Library - Design Principles

Algorithm selection◮ considers refinement and type information

Customizeable - without modification of library code◮ cannot assume to know all container types

Implementable in current C++◮ does not use any language extension

Minimal performance overhead

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 11 / 19

Page 15: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Algorithms Library - Implementation

Default implementation◮ defined based on more general concept in STL

Algorithm selection◮ finds best match according to a dedicated argument

Class hierarchy traversal◮ Query base class of a given type

Accessor function◮ defined in the library’s iterator namespace

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 12 / 19

Page 16: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Algorithms Library - Customization

Add generic implementation for randomaccess iterators

algolib::add_generic<algolib::advance<int>, // library nameRandomaccessIter<int> // iterator−type

>();

Unchanged library code

ForwardIter<int>random_elem(ForwardIter<int> first, ForwardIter<int> last){

ForwardIter<int>::difference_type dist = distance(first, last);return advance(first, rand() % dist);

}

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 13 / 19

Page 17: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Algorithms Library - Customization

Add specific implementation for std::list<int>

algolib::add_specific<algolib::advance<int>, // library namestd::list<int>::iterator // iterator−type

>();

Unchanged library code

ForwardIter<int>random_elem(ForwardIter<int> first, ForwardIter<int> last){

ForwardIter<int>::difference_type dist = distance(first, last);return advance(first, rand() % dist);

}

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 13 / 19

Page 18: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Algorithms Library - Results

Pentium-D

GCC 4.2 -O3-mach=prescottvector<int>

◮ reverse◮ find◮ sort◮ lower_bound

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 14 / 19

Page 19: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Algorithms Library - Reverse

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 15 / 19

Page 20: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

The Algorithms Library - Alternatives

Algorithms as virtual functions

GIL’s dispatch mechanism (Bourdev and Järvi [2])

Open Multimethods (Smith [9], Pirkelbauer et al [8])

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 16 / 19

Page 21: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Retroactive Runtime ConceptsInterface

ForwardIter<Proxy>random_elem(ForwardIter<Proxy> first, ForwardIter<Proxy> last);

Implementation

ForwardIter<Proxy>random_elem(ForwardIter<Proxy> first, ForwardIter<Proxy> last){

ForwardIter::difference_type dist = distance(first, last);return advance(first, rand() % dist);

}

User code

// v is a std::vector<int>int elem = ∗random_elem(v.begin(), v.end());

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 17 / 19

Page 22: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Conclusion

Contribution◮ The Algorithms Library◮ Runtime Concepts on Container elements

Future Work◮ Template instantiation at runtime◮ Integration with Open-Multimethods

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 18 / 19

Page 23: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

Thank you!

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 19 / 19

Page 24: Runtime Concepts for the C++ STL - Parasol Laboratorypeterp/slides/oops08.pdf · Runtime Concepts for the C++STL ... Runtime Concepts for the C++STL Mar 18th, 2008 12 / 19. ... Runtime

T. Becker.

Type erasure in C++: The glue between object oriented and generic programming.In MPOOL Workshop, July 2007.

L. Bourdev and J. Järvi.

Efficient run-time dispatching in generic programming with minimal code bloat.In Workshop of Library-Centric Software Design at OOPSLA’06, Portland Oregon, Oct. 2006.

J. C. Dehnert and A. A. Stepanov.

Fundamentals of Generic Programming.In International Seminar on Generic Programming, pages 1–11, London, UK, 2000. Springer-Verlag.

D. Gregor, J. Järvi, J. Siek, B. Stroustrup, G. Dos Reis, and A. Lumsdaine.

Concepts: linguistic support for generic programming in C++.In OOPSLA ’06, pages 291–310, New York, USA, 2006. ACM Press.

J. Järvi, M. A. Marcus, and J. N. Smith.

Library composition and adaptation using C++ concepts.In GPCE ’07, pages 73–82, New York, NY, USA, 2007. ACM Press.

M. Marcus, J. Järvi, and S. Parent.

Runtime polymorphic generic programming—mixing objects and concepts in ConceptC++.In MPOOL Workshop, July 2007.

S. Parent.

Beyond objects: Understanding the software we write.Presentation at C++ connections, November 2005.

P. Pirkelbauer, Y. Solodkyy, and B. Stroustrup.

Open multi-methods for C++.In GPCE ’07, pages 123–134, New York, NY, USA, 2007. ACM Press.

J. Smith.

Draft proposal for adding multimethods to C++.Technical Report N1463, JTC1/SC22/WG21 C++ Standards Committee, 2003.

Adobe Systems & Parasol Lab (Texas A&M) Runtime Concepts for the C++ STL Mar 18th, 2008 19 / 19