Non-fragile ABI in D?
Michel Fortin
michel.fortin at michelf.com
Sun Feb 8 06:09:56 PST 2009
On 2009-02-08 05:41:11 -0500, Walter Bright <newshound1 at digitalmars.com> said:
> As one wag put it, the solution to all problems is another level of
> indirection. This can work here, too. Have your only field in a class
> be a reference to an opaque type, and a member function that is a
> dispatcher based on a string argument or such.
>
> The implementation of the member function dispatches to the actual
> class being opaquely referenced and the string value. This is all
> completely hidden from the user, so it can be arbitrarily extended
> without the user needing to recompile.
That's an interesting solution. But you're only solving half of the
initial problem: the library author may want to extend his class to
provide new override points. That's not really possible in your
proposed solution, as it'd change the vtable of the exposed class.
And of course, it's always possible to come with a scheme that will
work. But then you'd be inventing a new meta-language inside D, using
special dispatch functions and a special override syntax, all this for
working around the fragility of the D class ABI. The solution is worse
than the initial problem: for ABI stability you're trading clarity in
the API, something that diminish greately the interest of having an
object-oriented API.
I'm not trying to convince you to add an Objective-C-like dispatch
mecanism in D, I'm trying to convince you that there is a need, and
that it can only be satisfied adequately by the language. An idea would
be to build the vtables at runtime and update the offsets in the code
after loading or use global variables to store vtable offsets. This
way, the ABI is less fragile and you can still keep the speed advantage
over Objective-C and other dynamic languages.
But if you don't recognize there is a need, it'll be hard to convince
you to implement something for filling it.
> In dynamic languages, this is what happens anyway under the hood. It's
> how javascript works, for example.
>
> The downside is it's quite a bit slower.
Indeed, it's slower. But in JavaScript and many other dynamic
languages, you don't have the choice to use dynamic dispatch for
everything because that's all they have.
Compare to D, where when you need performace you already avoid using
classes and prefer structs, static functions, and templates. That's of
course not an excuse to make classes less performant. But it may be a
hint that performance is a little less important for classes, giving us
an opportunity to improve the design and make them more robust and
useful.
Oh, and I'm glad you replied by the way. :-)
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list