In traditional environments for software development the various phases for building an application are well-defined and distinct: first one has to write a collection of modules, possibly with some inter dependencies, and with some dependencies to predefined modules stored in libraries; then one has to compile the modules, in order to generate machine code and, in strongly typed systems, to check type correctness of the modules; finally, one has to link the various pieces of machine code together, using a global name space to resolve all cross-references. This, of course, is the schema for compiled languages, but it accounts for the great majority of development environments in current use. Therefore, in such systems, the granularity of components seen by programmers is basically the same as the granularity of units manipulated by the development environment. In order to get more flexible composition environments, this well-established scheme of program development has to be reviewed. There are several reasons why a component oriented life cycle is needed, and there are several tendencies in modern languages that demonstrate the possibility of improving the traditional three-phase assembly of software.
We discussed above the necessity for open systems to be able to dynamically link new agents into a running system. This implies that the information that is normally discarded at link-time, namely the association between global names and memory addresses, needs to be kept both in the running system and in the agent that will be added to it. In other words, even a complete system can no longer considered to be totally closed: names may be locally resolved, but they still need to be considered as potential free variables that can be linked later to a dynamic entity.
Leave a Reply