About Eidola | Home |
The Impetus |
Notation is important. Our representations of ideas are not only what allow us to
communicate with one another, but with ourselves. A good notation system is one of the
most powerful conceptual tools we have.
We humans often do well representing information. Mathematical notation's elegant mixture of layered symbolic abstraction and graphical suggestion has made the notation inseparable from the mathematical reasoning process. Musical notation conveys enough large-scale structure to make skimming a score quite informative, and enough detail to reproduce a piece of music from the score alone. Of course, we don't always do so well. Source code is a terrible way to represent the concepts of programming languages. Plain text conveys very small pieces of information well enough, but degrades as the scale grows. This is unfortunate, since the entire history of programming languages has been, roughly speaking, an effort to capture structure at ever larger scales and higher levels of abstraction. It's not too hard to get the gist of a dozen lines of code, but it's a royal pain to figure out even the most overall organization of ten thousand, even though that overall organization may be quite simple. We rarely use code to explain code -- ask a programmer to explain their code, and you'll probably get a diagram with some boxes and arrows. The powerful ideas of high-level languages suffer because we have to work with them through a low-level notation system. Textual source code is an anachronism, and although modern computers are hardly dumb terminals, we still design programming languages as if they were. Of course, there are many efforts to address the shortcomings of plain text languages, such as modeling tools, code browsers, and graphical component systems. Although these systems are commendable in many ways and can be quite useful, they all suffer from at least some of the following problems:
|
The Experiment |
Eidola is an experiment to test the hypothesis that textual source code is anachronistic.
It takes a radical approach to language design. A traditional language exists in an
inherently unstructured textual form; a compiler translates it into a highly structured
internal form, generates machine code, and then throws away all that useful structure until
the next compile cycle. Eidola, on the other hand, starts and ends in the realm of
mathematical structure, and these structures are independent of representation.
From a traditional point of view, in Eidola the programmer is directly
manipulating the parse tree, but a better way to think of it is that an Eidola program's
fundamental form is structured in way that makes the distinction between source code and
parse tree meaningless.
In short, Eidola separates a program's structure from how that structure is presented. so that the structure is always accessible and flexible, and the presentation can focus on being a powerful, useful notation. The basic principles of Eidola are as follows: |
1. The language's foundation is a clean, representation-independent formal semantics. 2. The structures of the formal semantics are the fundamental form of programs. 3. A layer of user interfaces form a notation system for these semantic structures. |
Principle 1 (Semantics): Eidola's foundation is a clean, representation-independent formal semantics.
The best way to present information well is to start with well-structured information. Any hope of representing well something as complex as a programming language lies in starting with the cleanest, simplest fundamental structure possible. Eidola's basic view of the world is a type-centric object-oriented model, backed by a formal semantics. The initial aim of the semantics is theoretical purity, not feature robustness; in other words, we're starting simple, and there are currently notable omissions. Principle 2 (Kernel): The structures of the formal semantics are the fundamental form of programs. This means that there is no single "true" binary form of an Eidola program; the canonical form is mathematical. Every memory representation or storage form satisfying the semantics is an equally legitimate form of a program. An Eidola kernel is a software implementation of the semantics, which can form the foundation of both editors and runtime environments for Eidola. Because a program always exists in the structured forms of the kernel, all static semantic structure is available at edit time. Principle 3 (Notation): A layer of user interfaces forms a notation system for the semantic structures. The kernel allows different interfaces to observe, query, and modify semantic structures. The kernel's responsibility is to manage the structure of a program; the interfaces' responsibility is to represent this information well and make it easy to change and work with. Different interfaces can observe the same element of a program; if one modifies it, all reflect the change immediately through an event mechanism. Thus, Eidola has no single correct or fundamental notation, and a programmer can view the same program through the lens of different representations for different kinds of insight. |
Basic Terminology |
The semantics is a formal mathematical description of the Eidola language.
The semantics consists of fundamental structures, the basic units which define an
individual program, and derived structures, which combine the fundamentals to give them
meaning.
A representation of Eidola is a mapping from the fundamental structures to some target domain, such that every legal Eidola program in the semantic domain has a representation in the target domain. A binary file format, a database schema, or a piece of software could all be representations. An Eidola kernel is a special kind of representation which enforces the rules of the semantics, allows interactive modification of the fundamental structures, and provides mechanisms for observers to track these modifications. A kernel will also likely want mechanisms for translating a program to and from other representations. A notation (or user interface) for Eidola is a way of presenting the structures of the language, and allowing a human to interact with a kernel. Since a programmer can use many notations simultaneously, a particular notation might not show all the structures of language (for example, it might show only type relationships). It also might show structures which are not strictly part of the language (like ordering and grouping of class members), but which help a programmer organize their thoughts. |
To Learn More... |
That's the experiment. If you find it interesting, you'll want to skim through the FAQ, and read about the current status of the project. There are links from there to other interest areas of the site. |
Home | Copyright 2000-2001 Paul Cantrell |