COM is not a language extension.
It is a codification of a fairly obvious but not guaranteed C++ ABI/objectmodel
decision.
Specifically given C++:
class Foo
{
public:
virtual void Abc() = 0;
virtual void Def() = 0;
};
Foo* foo;
foo->Abc(); what is the ABI in terms of C?
Note well the "virtual" and "=0". They are important.
COM declares that is this (except for old CFM Macintosh PowerPC?):
struct Foo;
typedef struct Foo Foo; struct FooFunctions
{
void (*Abc)(Foo*);
void (*Def)(Foo*);
}; struct Foo
{
FooFunctions const * Functions;
};
Foo* foo;
foo->Functions->Abc(foo);
There are other possibilities, but is what COM says.
WinRT is seemingly merely a way to encode .h files in a binary format,
that then describe things like the above. There is a string library, which
you can have the compiler deal with or not. There is COM's IUnknown, ditto.
That is really about it as I understand.
What is "system compiler"?
The OS is likely compiled with multiple compilers.
It certainly can run binaries compiled with multiple compilers.What is in
question, I guess, is what is the ABI.
The C ABI, and the C++ ABI.
C ABIs are generally smaller more obvious but not completely automatic things.
Struct passing and return being one of the less obvious aspects.
Ideally there'd be documentation and agreement on the C ABI.
C++ ABIs include lots of details -- name mangling, exception handling....That is
much more difficult to deal with.Name mangling in Visual C++ has changed through
the years.For example, years ago, template parameters were not encoded in
function names, so multiple instances of this: template <int a> int Foo()
{return a;}or this:template <typename T> T* New() {return new T;} got the
same name. Foo<1>(); Foo<2>(); New<short>();
New<long>(); and the linker would just pick one..oops.. Fixing that
required an ABI change.So it is a good thing the original name mangling
wasn't documented and copied!(Better still would be to get it right the
first time..)
- Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20130329/e97ae314/attachment.html>