To write a valid program, you have to know the grammar/language. That just specifies things using some form, typically BNF. Start by specifying all the valid words in the language (numbers, 'for', 'while', 'if', 'true', 'false', that kind of thing). Then specify how you can build things like sentences and paragraphs (in programming 'expressions' and usually 'blocks'), and what valid combinations of those form a complete program. for example: Expr := for (; ; ) Block | if then Block else Block where the SimpleExpr and Block both refer to other ways of writing little paragraphs in the language, with different limitations on what you're allowed to include. The BNF form is read as Expr := | "an Expr [equivalent to, say, 'sentence', or 'clause', or whatever] is built from OR ". This specifies every program you can write in the language which is correct for that language. Just like writing a strict grammar for French or German or whatever, only considerably simpler :) That's syntax. The next thing you want to do is assign meaning to your programs. You want to know what's going to happen when you write something that is grammatically correct. So to do that you specify the semantics. Typically they'll be written down in natural language, but pedants can find enormous numbers of holes and "undefined" cases if you do that. So for example, in natural language you might write down that: 'if then else ' behaves as follows: the system will evaluate . It should turn out to be "true" or "false". If it turns out to be something else ("four", or "hello"), spit out an error. If it turns out to be "true", then execute the . If it turns out ot be false then execute the . The stuff I was doing with Acute in Cambridge, that was specifying semantics formally, and inventing/implementing a language (implementing it means writing a program which knows both the language we invented, and a language the computer already knows, and can translate the former into the latter, more or less). Why would we do that? Why have more than one language? You know they say the Eskimoes have forty-seven words for snow? Or something like that? And the Japanese have about five words for "you", /and/ different versions of all their verbs according to politeness. Languages evolve to be good at expressing certain types of things. Programming languages are the same. There's also a question of how fast the computer can do something, and that depends on how compactly the translator can translate the original language. Which sort of depends on how close to the computer's natural language the programming language is. Languages that are easier for humans to use tend to result in the computer doing things more slowly. Although that's getting less so nowadays.