As far as possible, Starlink subroutine libraries should make their executable code available to users in the form of VMS shareable images. This approach confers a number of advantages, in particular the ability for other software to assimilate new features when the library is upgraded without the need to re-link the calling software. The linking procedures themselves are also simplified by removing the need to know about, or to specify, all the sub-libraries (or sub-sub-libraries etc.) which may be required.
However, shareable images place a responsibility on the developer of a subroutine library to ensure that any modifications which may be made are compatible with all previously distributed versions of the library. Any changes which would require the calling software to be re-linked will take a long time to propagate through all affected software and should always be avoided. In particular, the need to ensure upward-compatibility of shareable image transfer vectors must be appreciate — the VAX Linker Utility Manual should be consulted for details.
In some cases, the use of a shareable image may not be possible or appropriate. For instance, the library’s executable files may have been provided commercially, or it may be desirable to allow the user to replace certain library routines with private versions – something which cannot be done in quite the same way with a shareable image1 (of course the standard, but under-used technique of passing a subroutine or function as an argument to another routine, so that the user can specify which routine should be called at a lower level, is not affected in any way by shareable libraries). In such cases, the prescription given for the use of shareable libraries in this document may not apply, but the spirit of the naming convention described here should be followed as far as possible.
1This facility can still be provided by placing the routine to be replaced on its own in a separate shareable image. A user can then provide an alternative version of this image and access it by assigning the appropriate logical name to it at run time.