the seal c++ reflection system stefan roiser (for the lcg/seal dictionary work package) chep 2004,...

20
The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

Upload: bartholomew-horn

Post on 05-Jan-2016

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

The SEAL C++ Reflection System

Stefan Roiser(for the LCG/SEAL Dictionary work package)

CHEP 2004, 27. Sept. - 1. Oct., Interlaken

Page 2: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 2

Content

• Reflection and C++

• The Model

• Use Cases

• Production of reflection information

• Packages and users

• Status and Conclusion

Page 3: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 3

Definitions

• Reflection is the ability of a language to introspect it’s own structure at runtime and interact with it in a generic way

• A dictionary provides reflection information about types of a certain language to the user

Page 4: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 4

What is Reflection?

class Particle { public: double mass(); private: double m_mass; };

Data & Instructions

Without prior

knowledge about

types

Particle p;

std::cout << p.mass();

ClassBuilder(“Particle”). addDataMember(“m_mass”). addFunctionMember(“mass”);

Dictionary

const Type* t = Type::byName(“Particle”);

Object o = t->construct();

cout << *(double*) o.invoke(“mass”);

t->destruct(o);

Page 5: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 5

Reflection and C++

• Very limited support by the language (RTTI)– Other languages do (e.g. Java, Python,…)

• Several approaches exist, but …– Tied to a system or– Instrumentation of code needed

• Stroustrup proposes XTI (eXtended Type Information) as inherent extension

Page 6: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 6

Goals

• Enhance C++ with reflection capabilities– non intrusive, automated

• Close to the C++ ISO 14882 standard

• Light and standalone system

• Small memory footprint

• Multi platform– Linux, Windows, Mac OSX, …

Page 7: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 7

Reflection Model

Type

TypeBase

Scope

ScopeBase

Member

Class

PropertyList

Function

Typedef

Reference

PointerNamespace

InstTemplate

TemplFamilyInstTFunction

InstTClass

Page 8: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 8

Reflection Use Cases

const Type * t = Type::byName(“Particle”);

size_t s = t->sizeOf();

bool t = t->isClass();

• Types– Retrieve a specific type– Introspect the actual type

Page 9: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 9

Reflection Use Cases (ctd.)

• Classes– Inspect inheritance tree – Create / delete instances

const Class * c = t->asClass();

const Base * b = c->base(0);

Object o = c->construct();c->destruct(o);

Page 10: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 10

Reflection Use Cases (ctd.)

• Data Members– Get / set values– Retrieve offset relative to beginning of class

const DataMember * dm = c->dataMember(0);

double d = *(double*) dm->get(v);

size_t s2 = dm->offset();

Page 11: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 11

Reflection Use Cases (ctd.)

const FunctionMember * fm = c->functionMember(0);

const Type * rt = fm->type()->asFunction()->returnType();

void * r = fm->invoke(o);

• Function Members– Inspect return and parameter types– Invoke a function and retrieve return values

Page 12: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 12

Reflection Use Cases (ctd.)• More Types

– Reference, Pointer, PointerToMember, Array, Enum, Union, Fundamental

• Typedefs• Scopes

– Search scopes– Retrieve Base-/

Subscopes

• Additional Properties– For Types, Scopes

and Members– Everything that does

not fit ISO standard– Any type supported

• CV qualifiers• Templates

– Inspect families– Look for instantiations

Page 13: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 13

System Overview

.h_dict.cpp

gcc_xml.xml

gendict.py

lcgdict

.xml

TypeSelection

make.so.cpp _dict.so

make

Reflex.so

UserProgram

Page 14: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 14

[lxplus]~>

Dictionary Creation<lcgdict> <class name=“Particle”/></lcgdict>

#include “Particle.h”class Particle_dict { public: Particle_dict(); };void* stubfun(void* o) { return (void*)((Particle*)o)->mass(); }Particle_dict::Particle_dict() {ClassBuilder<Particle>(“Particle”).addDataMember<double>(”m_mass”,Offset(Particle,m_mass),PRIVATE).addFunctionMember<double(void)>(”mass”,&stubfun,0,0,PUBLIC); }static Particle_dict instance;

[lxplus]~> lcgdict Particle.h -s selection.xml -I/my/include [lxplus]~> lcgdict Particle.h -s selection.xml -I/my/include Parsing File Particle.h with GCC_XML OKGenerating LCG Dictionaryclass Particle[lxplus]~>

[lxplus]~> lcgdict Particle.h -s selection.xml -I/my/include Parsing File Particle.h with GCC_XML OKGenerating LCG Dictionaryclass Particle[lxplus]~> lsParticle.h Particle.xml Particle_dict.cpp[lxplus]~>

Page 15: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 15

gcc_xml

• “[…] generate an XML description of a C++ program from GCC's internal representation.”

• Any gcc compilable program can be used as input

• lcgdict uses the XML file to produce dictionary files

Page 16: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 16

Status

• Current version - Reflection(Builder) - in production– POOL & SEAL PyLCGDict

• Prototype of new version - Reflex - released– In collaboration with the ROOT team– The idea is a common dictionary of LCG & ROOT– Several enhancements (e.g. references, enums)– Closer to ISO standard

Page 17: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 17

Users

• POOL – The LCG project for persistence of objects

• (#381, D. Duellmann, Wed. 1420-1440, Core SW)

• SEAL PyLCGDict– Python binding to the Reflection system

• (#494, W. Lavrijsen, Mon. 1500-1520, Core SW)

• SUN Microsystems– Porting to SUN forte compiler

Page 18: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 18

SW packages• Reflection library

– Current implementation • Reflection, ReflectionBuilder

– New model• Reflex

• DictionaryGenerator– Produce dictionary files for both versions

• Dictionaries CLHEP, STL, ROOT– Standard dictionaries ready to use

Page 19: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 19

Conclusion

• SEAL Dictionaries extend C++ RTTI– Light, standalone system– Non intrusive, automated code production– Dictionaries for any gcc compileable program

• New system ready for integration– In collaboration with ROOT– Several enhancements, closer to ISO std.

• Current version in production

Page 20: The SEAL C++ Reflection System Stefan Roiser (for the LCG/SEAL Dictionary work package) CHEP 2004, 27. Sept. - 1. Oct., Interlaken

27. Sept. 2004 [email protected] 20

Pointers

• The SEAL project– http://cern.ch/Seal/

• CVS repository– SEAL.cvs.cern.ch:/cvs/SEAL/Dictionary

• access: kserver, ssh, (anonymous) pserver

• gcc_xml– http://www.gccxml.org