On this page
Two pieces of work from Bell Labs in the early 1970s, the Unix operating system and the C language, still shape how programmers think about computers. Dennis Ritchie created C and co-created Unix. This post covers how C grew out of earlier languages, why it mattered for Unix, a worked example of its most famous rule, and what students can learn from how Ritchie worked.
Who was Dennis Ritchie?
The ACM Turing Award page for Ritchie records that he was born on 9 September 1941 in Bronxville, New York. He took a BS in physics in 1963 and a PhD in applied mathematics in 1967 at Harvard. He then joined the Bell Laboratories computing research group in Murray Hill, New Jersey, alongside Ken Thompson. He died in early October 2011.
How did Unix begin?
In 1969 Bell Labs withdrew from Multics, a large shared computing project. Ritchie, quoted on the ACM page, said Unix "began in 1969 when Ken Thompson discovered a little-used PDP-7 computer and set out to fashion a computing environment that he liked." He added that "most of the ideas, and most of the work for that matter, were his."
Thompson wrote the first Unix in assembly language. He then created a language called B, which Ritchie describes in The Development of the C Language as "BCPL squeezed into 8K bytes of memory and filtered through Thompson's brain."
How did B become C?
In that paper, published in the ACM History of Programming Languages proceedings, Ritchie explains the steps:
In 1971 he began extending B with a character type and rewrote its compiler to produce PDP-11 machine code.
He called the result NB, for "new B". It did not last long.
After building a type system and compiler, he "decided to follow the single-letter style and called it C".
By early 1973 the essentials of modern C were complete.
The payoff came that summer: the language was "strong enough to permit us to rewrite the Unix kernel for the PDP-11 in C". An operating system written mostly in a high-level language could be moved to new hardware far more easily than one written in assembly. The ACM page notes that by 1978 there were over 600 Unix installations.
Thompson and Ritchie described the system in "The UNIX time-sharing system" in Communications of the ACM in 1974. In 1978 Brian Kernighan and Ritchie published The C Programming Language.
Worked example: C's array and pointer rule
Ritchie calls one design choice "the crucial jump" from B to C. The rule, "which survives in today's C, is that values of array type are converted, when they appear in expressions, into pointers to the first of the objects making up the array."
int marks[5] = {72, 85, 64, 90, 58};
int *p = marks; /* marks becomes a pointer to marks[0] */
printf("%d\n", marks[2]); /* prints 64 */
printf("%d\n", *(p + 2)); /* also prints 64 */Step by step:
Indexing starts at 0, so marks[0] is 72, marks[1] is 85 and marks[2] is 64.
p points to marks[0]. Adding 2 moves the pointer two elements along, not two bytes. So p + 2 points to marks[2].
The * reads the value there: 64. In B, Ritchie notes, *(V+i) and V[i] meant the same thing, and C kept that meaning.
Common mistakes:
Counting from 1. marks[5] does not exist; the last element is marks[4].
Assigning to an array name. marks = something is an error in C. Ritchie notes that programs which did this in B were "meaningless in C" and had to be repaired.
Thinking pointer + 1 means "next byte". It means the next element of the pointed-to type.
What honours did Ritchie receive?
The ACM page lists, with Thompson, the 1983 ACM Turing Award "for their development of generic operating systems theory and specifically for the implementation of the UNIX operating system", and the US National Medal of Technology in 1998.
What can a student take from how Ritchie worked?
Build the tool you need. C grew because Unix needed a language that was fast enough to replace assembly.
Change things in small steps. B became NB, then C, while existing code kept working.
Share credit precisely. Ritchie openly gave Thompson most of the credit for early Unix.
Write it down well. His history paper and the book with Kernighan taught generations of programmers.
Ideas like memory addresses and data types underpin every language, including Python. The Fermi Concept Library covers every concept in physics, chemistry, biology, mathematics and computing, so you can look up the idea behind a confusing line of code. For how a computer's memory and processor fit together, see our post on computer system organisation.
Try it now: for the same array, work out what *(p + 4) and marks[1] + marks[3] print, then check by running the code.



