Fragile ABI
David Piepgrass
qwertie256 at gmail.com
Tue Aug 21 08:14:59 PDT 2012
On Monday, 20 August 2012 at 18:37:00 UTC, R Grocott wrote:
> On Monday, 20 August 2012 at 15:26:48 UTC, Kagamin wrote:
>> What you ask for sounds quite similar to COM composition with
>> delegation.
>
> Would anybody mind linking to resources which describe COM
> composition with delegation? It's been suggested twice in this
> thread as an alternative way to develop a non-fragile API, but
> anything related to COM is almost invisible to search engines
> (even moreso than D itself).
There's nothing novel about COM except aggregation, and
aggregation is just an implementation detail where a class
pretends that it implements an interface but the calls to that
interface go to another object, conceptually it's like "alias
this" except that a dynamic cast (i.e. QueryInterface) is
required to reach the second object:
http://msdn.microsoft.com/en-us/library/ms686558(v=vs.85)
For the most part COM sucks really bad: it is a very ordinary
object-oriented ABI but without numerous features that we
otherwise take for granted:
- In COM, you can't define static methods
- In COM, you can't overload functions
- In COM, constructors can't have arguments
- In COM, there are no fields, only properties
- In COM, class inheritance is not allowed (an interface IB can
inherit from IA, but if you implement a class A that implements
IA, you can't write a class B that derives from A and implements
IB. In C++/ATL a template-based workaround is possible if A and B
are in the same DLL.)
Moreover COM ABIs are fragile, in that there is almost zero
support for adding or removing methods without either breaking
everything or creating a new, independent, incompatible version
(the only exception: you can safely add a method at the end of an
interface, if you can be certain that no other interface inherits
from it.)
Finally, it's Windows-only (although it has been reimplemented on
Linux, e.g. for WINE) and modules must be registered in the
Windows Registry.
I think the only reason we still use COM today is that, sadly,
there is no other OO standard interoperable with all languages.
C++ vtables are the closest competitor; I guess their fatal flaw
is that there is no standard for memory management across C++
DLLs.
More information about the Digitalmars-d
mailing list