MotivationImplementationGoing Universal
Summary
Universal Declarative ServicesA component framework for C++ and a model-driven solution to
polyglot components
Simon Chemouil1
1Global Vision Systems
OSGi Community Event, 2012
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Who am I?
Free Software enthusiast, functional programmer, interested inmodel-driven development, modularity, re-usability,maintainability. . .
�How to never have to write that piece of software again?�
Technical Architect at Global Vision Systems, Toulouse
We create data visualization software for large industries (2D,3D, tables, etc).We do both Java and C++
Java using OSGi (Felix, iPojo) for server and client side(Eclipse RCP and Android)C++ to keep a fast 3D engine-agnostic manipulation layer
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Outline
1 MotivationThe case for modularityService Components and C++
2 Implementing Declarative Services for C++Challenges in C++De�ning components
3 Going UniversalSimpler Component De�nitionsWhat's next?
4 SummaryConclusion
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Why modularity?Service Components
Native OSGi
Did you miss �Native-OSGi, Modular Software Development ina Native world� by Alexander Broekhuis and Sascha Zelzer?
�Universal OSGi�
an RFP and a blog post by Peter Kriens in 2007.
Apply OSGi techniques to native (C/C++) development.
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Why modularity?Service Components
An OSGi Architect Walks in a C++ Bar...
Our C++ project going through re-architecture / refactoring
Custom-made plugin system, limited.
Plugins can't use each other
C/C++ OSGi ports:
Celix (Alexander), CppMicroServices (Sascha), SOF, CTK,nOSGi, . . .
Yet no service component framework such as DeclarativeServices
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Why modularity?Service Components
Why a Service Component Framework?
Services: powerful primitives, unpractical programming:
Lack of structureDynamic
Service Components:
Structure the servicesA nice semantic model to reason about dynamism
Why is there no such framework for an OSGi C++ port:
1 Technical challenges2 It was just not done yet!
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Why modularity?Service Components
Why Declarative Services?
Many existing component frameworks for C++
Just as there were some for Java before DSNo modularity
Simple and matured component model
A few years of personal experience
Works with POJOs (or POCOs!)
Components do not depend on the frameworkMakes them testable and easily reusable!
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Why modularity?Service Components
Does it make sense for C++?
We use C++ for performance:
Performance hit with component frameworks?
We need extensibility and customization...
Do we need modularity?
Why use di�erent architecture between Java and C++?
What if we could talk about components, whatever theimplementation language?
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Getting started
Native OSGi implementation:
CppMicroServices is light, works with any shared libraryInspired by PojoSRFor C++!
Bundles are called Modules:
Native shared libraries: not archives.
Moving to NativeOSGi later?
Easy! Components are framework-agnostic!
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Ingredients in Declarative Services
Components are described in XML �les in the bundle
Service callbacks
De�ned in descriptionService arrival/departurePolicy, Cardinality, Target
Component callbacks
Activation, modi�cation, deactivation
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Component Descriptions in C++
XML descriptions. . .
We have native shared libraries, not JARs!
Instead, we register a ComponentDescriptor instance to theComponentManager service.
The ComponentManager service is provided by the coreDs4Cpp framework.
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Component Descriptions in C++
De�nition
c l a s s ComponentDescr ip to r {pub l i c :
const s t r i n g componentId ;const s t r i n g imp lSha r edOb j ec t ;const vec to r<s t r i n g >∗ p r o v i d e d S e r v i c e s ;v e c to r<ComponentReference>∗ r e f e r e n c e s ;const bool immediate ;const bool autoEnab l e ;
} ;
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Component Descriptions in C++
Let's see how it looks like in practice. . .
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Extensible Hello World!
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Component Descriptions in C++
De�nition
s t d : : v e c to r<ComponentReference>∗ r e f e r e n c e s = . . . ;r e f e r e n c e s −>push_back (
ComponentReference ( " greetdemo : : G r e e tP r o v i d e r " , "greetdemo : : G r e e tP r o v i d e r " ,
s t d : : s t r i n g ( ) , ComponentReference : : DYNAMIC,ComponentReference : : MULTIPLE ,ComponentReference : : OPTIONAL_REF) ) ;
s t d : : v e c to r<s td : : s t r i n g > s e r v i c e s ;s e r v i c e s . push_back ( " greetdemo : : GreetManager " ) ;
ComponentDescr iptor ∗ componentDesc =new ds4cpp : : ComponentDescr iptor (" greetdemo : : GreetManager Impl " , "" ,s e r v i c e s , ∗ r e f e r e n c e s , t rue , t r ue ) ;
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
A Component in C++
De�nition
c l a s s GreetManager Impl : p ub l i c GreetManager {p ub l i c :
GreetManager Impl ( ) ; v i r t u a l ~GreetManager Impl ( ) ;vo id a c t i v a t e ( ) ;vo id addGr e e tP rov i d e r ( G r e e tP r o v i d e r ∗) ;vo id r emoveGree tP rov i d e r ( G r e e tP r o v i d e r ∗) ;
// S e r v i c e methods .s t r i n g g e tDe f au l tTa r g e t ( const s t r i n g &) const ;s t r i n g g e tG r e e t i n g ( const s t r i n g &, const s t r i n g &)
const ;l i s t <s t r i n g > g e t A l l G r e e t i n g s ( const s t r i n g &) const ;l i s t <s t r i n g > ge tAva i l a b l e L anguag e s ( ) const ;
} ;
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Service Callbacks in C++ (1/2)
No re�ection/introspection!
There are some limited libraries (e.g Re�ex).
C++ name mangling
We can't guess the binary name
Instead, we force a convention in the C++ component:
set<RefName>, unset<RefName> for single dependenciesadd<RefName>, remove<RefName> for multipledependencies
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
Service Callbacks in C++ (2/2)
Our tools: dlopen/dlsym/dlclose (and Windows equivalents)
Against us: C++ name mangling
Solutions?
Re�ection libraries: too limited, not dynamic.C++11 attributes (≈ Java annotations): still largelyunsupportedQt meta-objects? Not bad!
Yet need a custom preprocessorStill not modular (work in progress)
How about C wrappers?
Di�cult to write manually, but provide universal ABI!
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
C Wrapper
De�nition
e x t e r n "C" {DS_ABI_EXPORT GreetManager ImplWrapper∗
__greetdemo__GreetManagerImpl__create ( ) {r e t u r n new GreetManager ImplWrapper ;
}DS_ABI_EXPORT v o i d __greetdemo__GreetManagerImpl__activate (
GreetManager ImplWrapper∗ o b j e c t ) {ob j e c t −>a c t i v a t e ( ) ;
}DS_ABI_EXPORT v o i d
__greetdemo__GreetManagerImpl__add_greetdemo__GreetProvider (GreetManager ImplWrapper∗ ob j e c t , : : us : : Base ∗ s e r v i c e ) {
greetdemo : : G r e e tP r o v i d e r ∗ l s e r v i c e = dynamic_cast<greetdemo : :G r e e tP r o v i d e r ∗>( s e r v i c e ) ;
ob j e c t −>addGre e tP rov i d e r ( l s e r v i c e ) ;}DS_ABI_EXPORT v o i d
__greetdemo__GreetManagerImpl__remove_greetdemo__GreetProvider (GreetManager ImplWrapper∗ ob j e c t , : : us : : Base ∗ s e r v i c e ) {
greetdemo : : G r e e tP r o v i d e r ∗ l s e r v i c e = dynamic_cast<greetdemo : :G r e e tP r o v i d e r ∗>( s e r v i c e ) ;
ob j e c t −>removeGree tP rov i d e r ( l s e r v i c e ) ;} } // e x t e r n "C"
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Challenges in C++De�ning components
It works! But. . .
The proof-of-concept is successful:
We have components wired dynamically
OSGi's patterns work nicely (yet a bit more tricky)
We support the use cases we need
Dynamic arrival, thread-safety planned but un�nished, serviceremoval to do.
But no one would write that wrapper code!
Are there solutions to help us here?
Simon Chemouil Universal Declarative Services
Demo Time!
MotivationImplementationGoing Universal
Summary
Simpler Component De�nitionsWhat's next?
C++ is too complex!
Automatically generating the wrappers?
Where to get the description?
Macros?Parsing C++?!
Xtext
Java tooling to de�ne DSLs and compilersGenerates an Eclipse editor!Uses EMF as backend, so more can be built upon.
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Simpler Component De�nitionsWhat's next?
Back to GreetManagerImpl!
De�nition
component greetdemo . GreetManager Impl {prov ides {
greetdemo . GreetManager}re fe rences {
dynamic se r v i c e greetdemo . G r e e tP r o v i d e r [ 0 . . n ]}
}
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Simpler Component De�nitionsWhat's next?
De�ning multiple components
De�nition
module DSDemo {name = "DS Gree t Demo"vers ion = 1 . 0 . 0i nc ludes {
greetdemo . E n g l i s hG r e e tP r o v i d e rgreetdemo . F r en chG r e e tP r o v i d e rgreetdemo . GreetManager Implgreetdemo . Con so l eG r e e t e r
}}
Simon Chemouil Universal Declarative Services
Generating C++ code
Demo Time!
MotivationImplementationGoing Universal
Summary
Simpler Component De�nitionsWhat's next?
Improving our ADL
The ADL we designed maps to Declarative Services'capabilities
What about richer component models?
Creating new target language back-ends
Java/DS, Java/iPojoMaking it extensible
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Simpler Component De�nitionsWhat's next?
Bridging Java and C++
Using Remote OSGi Services:
An idea discussed in NativeOSGi.We expose C++ services where we can generate a Javainterface
Use JNI/JNA bindings or network.
Basically, we bridge the two service registries!
It does sound like CORBA
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Simpler Component De�nitionsWhat's next?
Creating UI Tools
Textual DSLs are nice...
But component diagrams are nicer!
Up-to-date component metadata is extremely useful:
Forces high-level design (round-trips between architects anddevelopers)Allows code generation/rapid project bootstrappingStatic analysis (code conformance)Can be used for SDK documentation.
Long term project!
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Conclusion
Declarative Services for C++
We have been using Ds4Cpp for a few months!
If you want to try it. . . you can! We just open sourced it(Apache Software License 2.0)
https://github.com/Global-Vision-Systems/Ds4Cpp
(the demo is packaged with it)!
We need testers and eyes to �x my bad C++ :-)
And remove the limitations (talk to me!)
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Conclusion
Universal Components Tooling
The tooling has still some rough edges
Enough for our current needs. . .
Some clean-up required.
We have a roadmap for the improvements.
Simon Chemouil Universal Declarative Services
MotivationImplementationGoing Universal
Summary
Conclusion
Universal Declarative Services
Questions?
Twitter:
@simach
Simon Chemouil Universal Declarative Services