History of the C Programming Language: From Bell Labs to the World (1969–2025)
C did not begin as a grand project to create the perfect programming language. It began as a practical solution to a very specific problem at Bell Labs in the late 1960s: how do you build a portable operating system when every computer speaks a different assembly language?
The answer that Dennis Ritchie found — and the language he built to implement it — would go on to power the computers in your pocket, the servers running the internet, and billions of embedded devices you've never seen. This is that story.
Before C: The BCPL and B Lineage
To understand where C came from, you need to understand what existed before it. In the mid-1960s, programming languages fell into two uncomfortable camps: high-level languages like FORTRAN and COBOL that were too abstract for systems work, and raw assembly language that was fast but completely machine-specific.
In 1967, Martin Richards at Cambridge University created BCPL (Basic Combined Programming Language) — a typeless language designed for writing system software. It was simple, efficient, and importantly, it had a single data type: the machine word.
Ken Thompson at Bell Labs took BCPL and stripped it down further into a language he called B around 1969, tailoring it for the memory constraints of the PDP-7 minicomputer Bell Labs was using. B kept BCPL's typeless approach but was written specifically for Unix development work.
B's fundamental problem was that it couldn't efficiently handle the varying data sizes of real hardware — bytes, integers, pointers, floating-point numbers all need different sizes, and B treated them all the same. This is the problem Dennis Ritchie set out to solve.
The Birth of C at Bell Labs (1969–1973)
Bell Telephone Laboratories in Murray Hill, New Jersey was one of the most productive research institutions in history. In the late 1960s, its computing research department was working on Multics — an ambitious time-sharing operating system project with MIT and GE. When Bell Labs withdrew from Multics in 1969, a small team led by Ken Thompson decided to build something simpler and more focused.
Thompson started writing Unix on an old PDP-7 minicomputer. The first version was in assembly language — fast but completely tied to that specific machine. Ritchie, who had been studying the B language, began working on a new language that would address B's limitations.
int, char, and pointer types — and later
float, double, and struct. This seemingly simple
addition made efficient machine code generation possible, because the compiler now knew
exactly how much memory each value needed.
By 1973, enough of C was working that Thompson was able to rewrite the Unix kernel in it — a momentous event in computing history. For the first time, a complete operating system was written in a higher-level language, meaning it could theoretically run on any computer with a C compiler.
/* Early C (pre-ANSI) used a different function declaration style */
/* Known as "K&R style" — note: no types in the parameter list */
int add(a, b) /* K&R style: params listed after name */
int a, b; /* types declared separately below */
{
return a + b;
}
/* Modern ANSI C style (1989 onwards): */
int add(int a, int b) {
return a + b;
}
C and the Rewriting of Unix
The decision to rewrite Unix in C had consequences that extended far beyond Bell Labs. Because Unix was now portable — able to run on any machine with a C compiler — Bell Labs was able to distribute Unix to universities at low cost under a license agreement.
Through the 1970s and 1980s, Unix spread across university computer science departments worldwide. Students learning to program in this environment learned C. C became inseparable from Unix, and Unix became inseparable from how a generation of developers learned computing.
The C/Unix pairing also created the foundation of the POSIX standard — a set of specifications
that define a compatible interface for Unix-like operating systems. Functions you use in C today
like open(), read(), write(), fork(), and
exec() come directly from the Unix system call interface that C was designed to access.
The K&R Book: The First Standard (1978)
By the mid-1970s, C had spread beyond Bell Labs. Different companies were implementing their own C compilers, and inconsistencies were multiplying. Code that worked on one compiler would fail on another. The community needed a definitive reference.
In 1978, Brian Kernighan and Dennis Ritchie published The C Programming Language — a slim 228-page book that immediately became the authoritative reference for the language. To this day it is simply called "K&R" by programmers.
#include <stdio.h>
main()
{
printf("hello, world\n");
}
Note the differences from modern C: no return type on main, no return 0;,
and lowercase "hello, world" without an exclamation mark. These reflect the more relaxed type rules
of pre-ANSI C. The modern version declares int main() and returns 0.
ANSI Standardization: C89 and C90
As C grew in popularity through the early 1980s, the lack of a formal standard became a serious problem. The C compiler market was fragmented — Microsoft, Borland, Unix vendors, and others each had their own dialects with subtle incompatibilities. Code written for one platform often failed to compile cleanly on another.
In 1983, the American National Standards Institute (ANSI) formed a committee — designated X3J11 — to produce a formal standard for C. After six years of work, ANSI C (C89) was published in 1989. The International Organization for Standardization (ISO) adopted it as ISO/IEC 9899:1990 the following year, which is why this version is also called C90.
void type, const
and volatile qualifiers, standardized library functions, and explicit rules for
undefined behaviour. These resolved almost all major compiler incompatibilities.
The Evolution of C: C99, C11, C17, and C23
Since ANSI C, the language has gone through four further official standards. Each added new capabilities while remaining backward-compatible with well-written earlier code.
| Version | Year | Key additions | Status |
|---|---|---|---|
| K&R C | 1978 | Original informal standard from the Kernighan-Ritchie book | Obsolete |
| ANSI C / C89 | 1989 | Function prototypes, void, const/volatile, standardized library | Widely supported |
| C99 | 1999 | Inline functions, variable-length arrays (VLAs), stdint.h, // comments, designated initializers, _Bool, complex.h |
Universally supported |
| C11 | 2011 | Multi-threading (threads.h), atomic operations (stdatomic.h), improved Unicode support, static assertions, anonymous structs/unions, _Generic |
Widely supported |
| C17 | 2017 | Bug-fix release for C11 — no new features, only clarifications and defect corrections | Current baseline |
| C23 | 2024 | bool / true / false as keywords, #embed, improved type inference with auto, decimal floating-point types, removal of obsolete K&R function syntax |
Latest standard |
The People Behind C
Dennis Ritchie
Designed and implemented C between 1969–1973. Co-created Unix with Ken Thompson. Received the Turing Award in 1983 (jointly with Thompson). Called by some "the most influential programmer who ever lived." Passed away in 2011.
Ken Thompson
Created Unix and the B language that directly preceded C. Co-recipient of the 1983 Turing Award with Ritchie. Later co-created the Go programming language at Google — another C descendant.
Brian Kernighan
Co-authored The C Programming Language with Ritchie in 1978. Also coined the term "Hello, World!" as a teaching example. His writing talent made C accessible to a generation of programmers who learned from that book.
Martin Richards
Created BCPL in 1967, the grandparent language of C. BCPL introduced the idea of a portable, systems-oriented language compiled from a high-level source — the concept that C refined and brought to the world.
C's Legacy: 50 Years of Influence
Few technologies have shaped the modern world as profoundly as C. Consider what would not exist without it: the Linux kernel (and therefore Android, most web servers, and supercomputers), the Windows NT kernel, macOS and iOS foundations, the Python interpreter, the MySQL and PostgreSQL databases, the Git version control system, and the firmware in billions of embedded devices.
C also shaped how we think about programming. Concepts like typed variables, structured control flow, functions, and pointers — all clarified and popularized by C — are now taken for granted in every language. Even languages designed as explicit reactions to C's problems (Java's garbage collection, Rust's borrow checker) only exist because C showed the world what those problems were.
In 2025, C ranks #3 on the TIOBE programming language index — behind only Python and C++. It has never left the top 5 in over 40 years of TIOBE tracking. For a language that turns 53 in 2025, that is a record no other language in history can match.
Frequently Asked Questions
int, char, pointers,
and other types — which made efficient machine code generation possible.
bool as a keyword,
#embed, and removed obsolete syntax.
bool, true, and false as built-in keywords
(no longer requiring stdbool.h), the #embed directive for including
binary data, improved auto type inference, and decimal floating-point types.
The ISO working group (WG14) continues to maintain and evolve the standard.