Semantic density

Semantic density is a metric of the readability of a program by a non-programming domain expert.

Programs work with representations of some domain. Every program must thus be read in two ways:


 * 1) as describing changes in the computer
 * 2) with reference to the domain

The programmer must understand enough of the first to have the computer animate the representational scheme – adequately to the needs of the domain expert. The domain expert can participate in this process most closely when able to follow the domain logic in the program.

This is possible when a sufficiently high proportion of the tokens (e.g. names of variables or functions) are drawn from the vocabulary of the reader. (Writers of natural languages, under a general injunction to write with their readers in mind, will find nothing surprising in this.)

Leaving aside any familiarity with programming, the minimum threshold appears to vary little between readers, and is in all cases high. Even a low proportion of ‘foreign’ terms degrades readability.

Exceptions to this are


 * control structures: up to two levels of nesting, readers follow them;
 * glyphs other than the Roman alphabet or Arabic numerals; the reader either parses them as punctuation or mathematics (eg 2÷3), or ignores them.

Two common features of programming languages obstruct this effect:


 * tokens that can't be omitted, such as void or function
 * most primitive functions have Roman-alphabet names

Certain writing techniques facilitate it:


 * assigning names only once; homonyms are confusing enough in natural languages;
 * naming only objects that correspond to terms in the reader's vocabulary;
 * using (in Dyalog, NARS2000, ngn/apl, dzaima/APL, GNU APL) anonymous dfns (lambdas) to avoid assigning other names;
 * using tacit programming (in Dyalog, NARS2000, ngn/apl, dzaima/APL) to avoid using argument names in expressions.