Pages

20181107

Project Oberon by Niklaus Wirth


  • In spite of great leaps forward, hardware is becoming faster more slowly than software is becoming slower.
  • The vast complexity of popular operating systems makes them not only obscure, but also provides opportunities for “back doors”.
  • Mostly thanks to the regularity of the RISC instruction set, the size of the compiler could be reduced significantly.
  • Our programs should be expressed in a manner that makes no reference to machine peculiarities and low-level programming facilities, perhaps with the exception of device interfaces, where dependence is inherent.
  • In order to warrant the sizeable effort of designing and constructing an entire operating system from scratch, a number of basic concepts need to be novel.
  • The fundamental objective of an operating system is to present the computer to the user and to the programmer at a certain level of abstraction.
  • Every abstraction is characterized by certain properties and governed by a set of operations.
  • Every abstraction inherently hides details, namely those from which it abstracts.’
  • High interactivity requires high bandwidth, and the only channel of human users with high bandwidth is the eye. Consequently, the computer’s visual output unit must be properly matched with the human eye.
  • In the Oberon system, the display is partitioned into viewers, also called windows, or more precisely frames, rectangular areas of the screen.
  • High interactivity requires not only a high bandwidth for visual output, it demands also flexibility of input.
  • In Oberon, the notion of a unit of action is separated from the notion of a unit of compilation.
  • One of the rules of what may be called the Oberon programing style is therefore to avoid hidden states, and to reduce the introduction of global variables.
  • We classify Oberon as a single-process (or single-thread) system. [...] Unless engaged in the interpretation of a command, the processor is engaged in a loop continuously polling event sources. This loop is called the central loop; it is contained in module Oberon which may be regarded as the system’s heart.
  • The primary advantage of a system dealing with a single process is that task switches occur at user-defined points only, where no local process state has to be preserved until resumption.
  • The Oberon system features no separate linker. A module is linked with its imports when it is loaded, never before.
  • The high priority given in the system’s conception to modularity, to avoid unnecessary frills, and to concentrate on the indispensable in the core, has resulted in a system of remarkable compactness.
  • We do not consider it as good engineering practice to consume a resource lavishly just because it happens to be cheap.
  • Implementation of a system proceeds bottom-up. Naturally, because modules on higher levels are clients of those on the lower levels and cannot function without the availability of their imports.
  • Description of a system, on the other hand, is better ordered in the top-down direction. This is because a system is designed with its expected applications and functions in mind.
  • Commands in Oberon are explicit, atomic units of interactive operations.
  • It is the generic ability to perform every conceivable task that turns a computing device into a versatile universal tool.
  • Transfers of control between tasks are implemented in Oberon as ordinary calls and returns of ordinary procedures. Preemption is not possible.
  • Interactive tasks are triggered by input data being present, either from the keyboard, the mouse, or other input sources. Background tasks are taken up in a round-robin manner. Interactive tasks have priority.
  • The most important generic function of any operating system is executing programs.
  • Quintessentially, Oberon programs are represented in the form of commands that are in the form of exported parameterless procedures that do not interact with the user of the system.
  • The concept of abstraction is arguably the most important achievement of programming language development.
  • The term loading refers to the transfer of the module code from the file into the main memory, from where the processor fetches individual instructions.
  • The linking process may require a significant amount of address computations.
  • The purpose of the loader is to read object files, and to transform the file representation of modules into their internal image.
  • It is essential that a computer system has a facility for storing data over longer periods of time and for retrieving the stored data. Such a facility is called a file system.
  • A file system must not only provide the concept of a sequence with its accessing mechanism, but also a registry. This implies that files be identified, that they can be given a name by which they are registered and recieved.
  • Experience shows that in practice most files are quite short, i.e. in the order of a few thousand bytes.
  • A crucial property of the Oberon system is centralized resource management.
  • Device drivers are collections of procedures that constitute the immediate interface between hardware and software.
  • Drivers are inherently hardware specific, and the justification of their existence is precisely that they encapsulate these specifics and present to their clients an appropriate abstraction of the device.
  • They keyboard codes received from the keyboard via a PS/2 line are not identical with the character values delivered to the Read procedures. A conversion is necessary. This is so, because modern keyboards treat all keys in the same way, including the ones for upper case, control, alternative, etc. Separate codes are sent to signal the pushing down and the release of a key, followed by another code identifying which key had been pressed or released.
  • Oberon is a single-process system where every command monopolizes the processor until termination.
  • It appears to be a universal law that centralization inevitably calls for an administration.
  • The compiler is the primary tool of the system builder.
  • Compilation of a program text proceeds by analyzing the text and thereby decomposing it recursively into its constructs according to the syntax. When a construct is identified, code is generated according to the semantic rule associated with the construct.
  • The recognition of symbols within a character sequence is called lexical analysis.
  • Procedure bodies are surrounded by by a prolog (entry code) and an epilog (exit code).
  • Besides the parsing of text, the Parser also performs the checking for type consistency of objects.
  • The superiority of a tree structure becomes manifest only when a large number of global objects is declared.
  • Procedure calls cause a sequence of frames to be allocated in a stack fashion. These frames are the storage space for local variables.
  • Static typing is an important principle in programming languages. It implies that every constant, variable or function is of a certain data type, and that this type can be derived by reading the program text without executing it. It is the key principle to introduce important redundancy in languages in such a form that a compiler can detect inconsistencies. It is therefore the key element for reducing the number of errors in programs.
  • Implementation of multiplication in hardware made the operation about 30 times faster than its solution by software.
  • The principal task of the control unit is to generate the address of the next instruction.
  • The system’s core consists of a loop which consistently senses for a command to appear.
  • Make it as simple as possible, but not simpler.
  • Oberon is a general-purpose programming language that evolved from Modula-2. Its principle new feature is the concept of type extension.

No comments:

Post a Comment