When “virtual” is used as computer jargon there is usually some model lurking. The Java virtual machine is actually rather complex but the meaning of a class file can best be described by talking about a fictitious machine that operates rather directly on the byte codes. This is called the Java virtual machine. This transition form the real to the virtual is not primarily to gloss over details, but to eliminate enough detail so that matters remaining in view can be accurately described. The suppressed details are usually irrelevant for most users of the system, such as those who produce class files.
The specifications for the Keykos kernel are written in terms of a model and the description of what really happens is limited to the kernel logic manual. In the kernel model nodes hold capabilities and not bits. The manual prescribes what capabilities are in nodes and not what bits. At different times different bits will represent the same capability.
Computing models often (perhaps usually) refer to states that are inaccessible to some or even all programs running within the model. They speak in terms of the effects of an action even if that cannot be directly sensed by any program.
The above merely says that we describe a program’s function by what it seems to do for the user instead of detailing all steps it takes to do it. A word processor’s user manual talks of paragraphs while the behaviors of paragraphs may be scattered throughout the code. One goal of object style programming is to cluster the code the same way that the external behavior is clustered. The behavior of the paragraph that is visible to the user is mostly determined in the code that defines the paragraph object within the code.
If we are to understand what computers do by abstracting large parts of the function behind conceptual curtains, just where do those curtains go? In the description of the Keykos kernel the curtain was around all of the privileged code. It is noteworthy that some kernel implemented objects could be moved out of the kernel and without changing code other than the code defining that object.