API changing, possible low lying fruit, random thought

Chad J gamerChad at _spamIsBad_gmail.com
Mon Apr 30 12:31:26 PDT 2007


Hi folks,

First, I'm shooting from the hip, so if you don't have time to sit and 
sift through these ramblings, maybe you shouldn't try.  You have been 
warned.

So I was driving to college this weekend while recalling some d ng 
conversation about memory management and how it was a "low lying fruit" 
which was plucked by writing a garbage collector, and how cool it would 
be if D could find another such "low lying fruit" to leverage on.  At 
about the same time, I was thinking about how much it freaking sucks 
that libraries and APIs in general are one-shot deals and can't have 
their interfaces rewritten at a later date without severe consequences. 
  It made me think - perhaps API interfaces are such a low lying fruit.

There are a couple problems with API interfaces:
1.)  People learn them.  There is a time investment.
2.)  Interface changes can cause code to need to be rewritten.  A LOT of 
code.

D addresses (1) a little bit.  There is the deprecated keyword.  It 
helps a little, but all it does is tell the lib user that a function, 
class, member, or whatnot is deprecated.  There is no way to tell the 
lib user what to use instead of why this thing was deprecated.  So there 
needs to be some way to deprecate old interface junk and give meaningful 
information to someone who is just now trying to compile with the new 
version of a library.  It would be impossible to infuse the user with 
all sorts of new knowledge at no cost, but when an API change should 
happen it would be nice if the user gets the information they need, when 
they need it, and as easily as possible.

It seems that D doesn't address (2).  I don't think very many languages, 
if any, address (2) at all.  But it can be handled, and perhaps using 
mostly language features that already exist in D.  It can be handled by 
creating some intuitive way for library/API writers to define changes or 
patches to their interface.  These changes would do stuff like rewrite 
writefln( "Hello World!" ); to Stdout( "Hello World!" ).newline;.  Even 
if this only handles trivial cases like rewriting function calls, it 
would catch a large portion of API changes.  It would be really nice 
though, if it could also edit the user's code, as in modify/add/remove, 
so that some levels of refactoring could be performed automatically. 
The new code (user's source tree) might be placed in a new directory or 
some such; an implementation detail.  I imagine the import mixin type 
stuff could be used to grab the user source code for analysis, and then 
you just need some way to write the result somewhere else.  As for the 
analysis itself, I'm not so sure about this.  I know it should be 
possible already, and talked about proposed features like AST macro type 
things seem to be pointed in this direction.

OK so let's assume we do the above two things.  That might still leave 
some issues.  Now we have library scripts rummaging through our code and 
changing various bits and pieces without our knowledge.  Maybe a little 
scary.  This could be handled by pragma(msg,"...")'ing some sort of 
description about changes that happened during a code update or patch. 
But it would also help to know that libraries aren't going to rewrite 
any user code until they are explicitly asked to do so, which might just 
mean versioning off of a compile switch.  Even better if, upon 
compilation, the library runs a script that checks for new versions of 
the library, and mentions to the user when those things are available. 
Perhaps even more practical would be to have the compiler keep a list of 
what versions of libraries are in use, and when a new one is tried it 
prompts to start the patching process.

Then there is a problem when refactoring requires some sort of decision 
from the library user.  This is where some compiler/language magic might 
be needed, in the form of better compile-time io.  Just some sort of 
scanf to pause compilation and retrieve user input.

All in all, I envision library users seeing a kind of installer like 
user interface whenever they try to upgrade to a new library version, 
and they have to do very little, if any, code refactoring of their own.

That's all I have for now.
- Chad



More information about the Digitalmars-d mailing list