Programming languages bridge the gap between programmers and machines. On one hand, programmers use the language as a mechanism for instructing a machine and for sharing ideas about computations with others. On the other hand, compilers and interpreters process programs according to the rules of the language. The symmetry suggests that programming language researchers pay equal attention to both halves: the human-language interface and the language-machine interface. Unfortunately, this is not true. While researchers have paid some attention to explaining syntax errors, type errors, and data flow properties, most research efforts focus on type systems, logics, semantics, compilation strategies, register allocation, instruction pipelining, memory locality, etc. In other words, work on the language-machine interface dominates work on the human-language interface. The consequences are bad for both novices and experienced programmers. Novices struggle with an array of bewildering programming and programming language concepts from the very start; professionals who switch from one class of language to another often miss the point of the new language and its program design philosophy.
Over the past eight years, my team and I have engaged in constructing a human interface to the Scheme programming language. Since a programming language is a complex logical artifact, the interface consists of three large components: a design philosophy with programming techniques; a series of increasingly powerful sublanguages of Scheme; and a programming environment that supports both. Experience with novice programmers suggest that this interface to Scheme provides a significantly smoother learning curve than conventional interfaces.
In my talk, I will present these components and suggest to develop this idea of a human-language interface into a general research area.