Found on Lambda the Ultimate blog, Void-safety in Eiffel language, another 
attempt at solving this problem:
http://docs.eiffel.com/sites/default/files/void-safe-eiffel.pdf


I think to solve this problem a language like D can use three different 
strategies at the same time. Three kinds of object references can be defined:
1) the default one (its syntax is the shorter one, they are defined using the 
like current ones) is the "non nullable object reference". Many objects in a 
program are like this. The type system assures the code to be correct, you 
don't need to test such references for null. As in C# the compiler keeps eyes 
open to avoid the usage of uninitialized references of such kind. (this is a 
situation where "good" is better than "perfect". C# seems to work well enough 
in its ability to spot uninitialized variables).
2) The second kind is the current one, "unsafe nullabile object reference", 
it's faster, its syntax is a bit longer, to be used only where max performance 
is necessary.
3) The third kind is the "safe nullabile object reference". You can define it 
like using the syntax "Foo? f;". It's a "fat" reference, so beside the pointer 
this reference contains an integer number that represents the class. If your 
program has 500 classes, you need 500 different values for it. On the other 
hand usually in a program a specific reference can't be of 500 different 
classes, so the maximum number can be decreased, and you can keep at runtime 
sono conversion tables that convert some subsets of such numbers into a full 
pointer to class info. Such tables are a bit slow to use (but they don't need 
too much memory), but the program uses them only when a reference (of the third 
kind) is null, so it's not a bit problem. On 64-bit systems such numeric tag 
can be put into the most significant bits of the pointer itself (so when such 
pointer isn't null you just need a test and a mask, the shift is required only 
in the uncommon case of null). This also means that the max !
 number of possible class instances decreases, but not so much (you can have 
some conversion tables to reduce such such numeric tag to 2-5 bits in most 
programs). When the code uses a method of a null reference of such kind the 
program may call the correct method of a "default" instance of that class (or 
even a user-specified instance).

Do you like? :-)

Bye,
bearophile

Reply via email to