ReflectionEtymologically, reflection is first a term about turning back the image of another object; since the phenomenon was mostly used to see oneself with mirrors (the alternate spelling reflexion is preferred for the optical phenomenon), it has come to mean applying to oneself (see reflexive). From there, it has come to mean not just to see oneself's physical image, but also to examine one's own mental state (early 17th century), and quickly applied to thinking in general (late 17th century), and has been used for well considered thought in general, although still keeping as an alternative this meaning of thinking about one's thoughts.
In Computer Science, Reflection is the domain of programs that (effectively or potentially) describe and manipulate "themselves", or other related programs. This notion extends to programs the philosophical notion of Reflection of human thought that can apply to itself. The idea is not quite new, and has been used by the founding fathers of formal logic and computer science in their early theorems on the power and limits of reasoning and computation (Cantor, Gödel, Turing, etc).
We sometimes say reflective for potentially reflective, and likewise say reflection instead of potential reflection. In this above meaning, programming is a reflective activity, as one can program programs that program. A programming language or an operating system is called reflective if suited to reflective metaprogramming, that is, if it has provides programs some special ability to read and write themselves or other related programs. Actually, such reflection is often obtained as an interesting side effect of a more general and useful property, universality with respect to meta-programming.
Computational Reflection in particular is the ability to describe inside a language the semantics of further programs. The whole point about it is that it and only it allows full control for all programs of what is to be explicit, and what is to be implicit in the semantics of these programs.
We think that Reflection is just needed for computer development, and can be justified by a cost analysis that can be formalized in terms of computational complexity. If you want to develop a computer system from a supported computer system, then there must be Reflection somewhere in the system. On most current systems, that Reflection might be hidden, and might need a reboot everytime it is used (with loss of all current data, unless measures are taken manually): for instance, Linux can be developed from Linux, but you must kill all processes and reboot so as to replace a current Linux with a developed Linux.
Consider then the following simple cost analysis. If I is the cost of all the irreflective abstraction layers between the hardware and the first reflected part P of the system; if R is the cost of all the abstraction layers that help reflect P into itself, then the cost of doing k reflective operations is greater than
I+k*R (for compiled implementations; interpreted approaches may be exponentially worse). Current systems are such that all this often is a prohibitive cost, and as a consequence, even though all systems are somehow reflective, reflection is only marginally used. Now, the cost of not using computerized reflection is to do by hand what the computer would do automatically, hence having lots of automatizable tasks be done by humans, and moving to them humans the responsibility of ensuring the consistency of such a complex system. The result is a drastic decrease in productivity and reliability, and consequential limitations in achievements.
See our review of methods of reflection.
Also linked from: AdaOS Constructor and Destructor Cybernetics Inheritance Java Maude Metaprogramming Methods of Reflection Moostrap Napier88 nitrOVM NuPrl Pliant Reflective Tower Reflexive Site Map Static TCL Transparent Tube