Building Abstractions with Functions
We are about to study the idea of a computational process. Computational processes are abstract beings that inhabit computers. As they evolve, processes manipulate other abstract things called data. The evolution of a process is directed by a pattern of rules called a program. People create programs to direct processes. In effect, we conjure the spirits of the computer with our spells.
The programs we use to conjure processes are like a sorcerer's spells. They are carefully composed from symbolic expressions in arcane and esoteric programming languages that prescribe the tasks we want our processes to perform.
A computational process, in a correctly working computer, executes programs precisely and accurately. Thus, like the sorcerer's apprentice, novice programmers must learn to understand and to anticipate the consequences of their conjuring.
We assert that the ideal programming language should be a specification language – you tell the computer what to do without telling it how to do it. Specification definitions should be smaller, more readable, and more reusable than procedural code constrained by efficiency. Thus a specification language should give the programmer greater productivity. Specifications should also be easier to validate as correct. The challenge is to automatically generate efficient programs from specifications by a provably-correct process – the “automatic programming” problem.
We assert that the ideal programming language should be a metalanguage – able to define within itself other language features and paradigms which can then be used for specification without one leaving the original language. We want a “universal” language that can incorporate the specification advantages of any other language.
But an ideal language should also be minimal – as small and simple as possible without sacrificing expressiveness. We see elegance in reducing language to its most fundamental core. Nothing would be built-in that can be defined. Such a minimal language must also be highly extensible so that those features that are not built-in can be easily defined and used as if they had been built-in.