On the Use of Labels with the Special Object Array

One of the first things stored in Smalltalk images is a small array of special objects, which usually contains references to objects like `Smalltalk`, `nil`, `true` and `false`. Why is it necessary to give special treatment to these things, and what does this special treatment imply?

Consider the implementation of the message `==`. This message is implemented as a primitive, and as such the actual work is performed by the virtual machine running the image. Essentially, what it will do is to see if the argument and the receiver are not just equal, but exactly and identically the same object. Whatever the objects involved are, after the comparison is done the virtual machine will have to answer either `true` or `false`. Why these objects and not anything else? Because the rest of the code in the image is written in a way that requires one of these to be answered by the primitive. And how does the virtual machine know the objects `true` and `false`? By looking them up in the special object array.

Of course, one could have the virtual machine behave more like C and answer 1 or 0 instead. And in fact one could have it do so, because the virtual machine itself does not care. Therefore, the fact that the virtual machine answers `true` or `false` is the result of some arbitrary choice. As such, we can separate the act of answering two different things (the actual answer) from the actual things being answered (how the answer is labelled for our convenience).

But then, if the actual answer could be whatever pair of distinct objects we want, we can also see that the meaning of these objects is not given by their name (`true`, `false`, `0`, `1`), not even by their identity. Rather, they become meaningful because of their location in the network of message paths. If we replace `true` and `false` by `0` and `1`, the image would still work if what is expected from booleans is satisfied by their replacements.

This is an excellent opportunity to remind ourselves to avoid confusing the labels with the labelled objects. It is perfectly fine to refer to distinctions by means of names, as long as we always keep in mind that a name is something we assign according to our intentions. But labels are not the labelled objects.

~