[cfe-dev] Reflection
Stuart Carnie
stuart.carnie at gmail.com
Mon Dec 13 10:37:15 PST 2010
Static reflection seems to be very limited. Reflection is a powerful
mechanism for being able to analyse a 3rd party executable or dynamic
library and interact with it at runtime, dynamically invoking APIs.
Objective C already has this, so you should be able to to leverage the same
concepts for a C++ version. You already have a great example in Clang;
Objective-C provides all it's reflection through the runtime APIs, and
therefore a C++ extension could do the same thing. No built-in's,
alterations to LLVM or changes to the C++ language.
The reflection information is merely metadata generated at compile time to
describe the symbols in a specific module. A lot of the work is around the
runtime.
I imagine some of the things you would need are:
- A runtime, similar to Objective-C's, which needs some of the following
capabilities
- collection of metadata classes which describe methods, types, etc
- APIs to read over data sections to extract metadata and generate
aforementioned classes
- Public APIs to query for this metadata, create instances of classes
via name, etc
- Changes to compiler
- Generation of metadata into special data section
- Generation of entry points / APIs to compiled libraries,
executables to allow you to do things like create instances of classes
/ types by name, etc
Cheers,
Stu
*Stuart Carnie, CTO*
*manomio <http://manomio.com/> | in retro we trust!*
2010/12/13 Aurélien Vallée <vallee.aurelien at gmail.com>
> This is actually very interesting, and I was also looking to achieve
> something similar. However, I chose to do the things differently.
>
> As C++ is statically typed, why bother with dynamic reflection, while you
> can achieve a more efficient, cleaner static reflection?
> I rather thought of kind of preprocess phase that would add traits on
> classes containing their members, methods, etc... The reflection would be
> implemented by using these generated traits. We then could add a post
> reflection processed target that would simply prints the traits, thus
> allowing to have a standard C++ code buildable with any compiler.
>
> struct Foo
> {
> void f();
> int a;
> };
>
> The generated traits may look like (very roughly):
>
> reflect_trait<Foo>::attribute::count
> reflect_trait<Foo>::attribute<1>::type
> reflect_trait<Foo>::attribute<1>::name
> reflect_trait<Foo>::method<1>::type
> reflect_trait<Foo>::method<1>::signature
> reflect_trait<Foo>::method<1>::name
> reflect_trait<Foo>::method<1>::param::count
> etc..
>
> Just my 2 cents
>
> On Mon, Dec 13, 2010 at 2:49 PM, Russell Harmon <russ at eatnumber1.com>wrote:
>
>> I'm looking to possibly add support for reflection to clang & llvm.
>> I'm thinking it would work something like the following:
>>
>> - clang inserts reflection information into the compiled bitcode
>> - does debugging symbols provide enough information already?
>> - should this be a new symbol table, or an extension of the debugging
>> symbols?
>> - I write a c library which using the symbols from the compiled
>> binary, allows you to do reflection
>> - A typeof() or similar builtin will be necessary
>> - I'll need to eventually modify llvm's optimizer somehow so that it
>> doesn't break the reflection information
>>
>> Thoughts?
>> This is going to be my introduction to the llvm & clang code base, so
>> any advice on where to start?
>>
>> -Russell Harmon
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>
>
>
> --
> Aurélien Vallée
> +33 6 47 41 70 37
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20101213/dafd207e/attachment.html>
More information about the cfe-dev
mailing list