Last updated: March 2025

History of the C Programming Language: From Bell Labs to the World (1969–2025)

By CoodeVerse Editorial Team ⏱ 10 min read
Explore Now → Learn More

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.

1967
BCPL
Martin Richards
1969
B
Ken Thompson
1972–73
C
Dennis Ritchie
1978
K&R C
Published standard
1989
ANSI C
C89 / C90

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.

The key innovation: Ritchie added a type system to B. Where B treated every value as a single machine word, Ritchie's "New B" (which quickly became C) distinguished between 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 Unix system call — the style of C circa 1973K&R C style
/* 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.

Long-term impact: That generation of Unix-trained developers went on to found companies, write open-source software, and teach the next generation. Linus Torvalds, who wrote the Linux kernel in 1991, was trained on Unix and wrote Linux in C for the same reason Unix was written in C — portability, efficiency, and direct hardware control. Linux now runs on over 90% of the world's servers.

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.

Why K&R mattered: Before formal standards bodies got involved, the K&R book was the de facto specification of C. If a compiler produced output that matched the book's described behaviour, it was considered a valid C compiler. The book's first example — the "Hello, World!" program — became the universal introduction to every programming language that followed.
The original "Hello, World!" from K&R (1978)C
#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.

Key additions in ANSI C89: Function prototypes (so the compiler could check argument types before calling a function), the 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
Which version should you use? For most new code, target C11 or C17 — these are universally supported by GCC, Clang, and MSVC, and give you threading, atomics, and modern type support. Embedded projects targeting older toolchains often use C99. Safety-critical projects (automotive, aerospace) frequently mandate C99 or C11 under the MISRA C standard.

The People Behind C

Dennis Ritchie

Creator of C · Bell Labs

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

Creator of Unix & B · Bell Labs

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-author of K&R · Bell Labs

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

Creator of BCPL · Cambridge University

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.

Dennis Ritchie's own words (from a 1993 paper): C is a language that satisfied a need for a system implementation language efficient enough to displace assembly language, yet sufficiently abstract and fluent to describe algorithms and interactions in a wide variety of environments.

Frequently Asked Questions

C was invented by Dennis Ritchie at Bell Telephone Laboratories (Bell Labs) between 1969 and 1973. Development began around 1969 and the language was substantially complete by 1973, when it was used to rewrite the Unix operating system kernel.
C was created specifically to rewrite the Unix operating system in a portable, higher-level language. Before C, Unix was written in assembly language — which meant it only worked on one specific machine. Ritchie created C so that Unix could be rewritten in a language that could be compiled for any computer, making the operating system portable across different hardware.
C evolved from a language called B, created by Ken Thompson at Bell Labs around 1969. B was itself derived from BCPL (Basic Combined Programming Language), created by Martin Richards at Cambridge University in 1967. The main improvement C made over B was adding a type system — distinguishing between int, char, pointers, and other types — which made efficient machine code generation possible.
These are successive formal standards of the C language. C89 (1989) was the first ANSI standard, adding function prototypes and standardizing the library. C99 (1999) added inline functions, variable-length arrays, and new data types. C11 (2011) added multi-threading and atomic operations. C17 (2017) was a bug-fix release with no new features. C23 (2024) added bool as a keyword, #embed, and removed obsolete syntax.
K&R C refers to the version of C described in the 1978 book The C Programming Language by Brian Kernighan and Dennis Ritchie. Before formal standards existed, this book was the de facto specification of C. The "K&R style" of function declarations — with parameter types listed separately from the parameter names — is still occasionally seen in older codebases and was officially removed in C23.
C and Unix were co-developed at Bell Labs and are deeply intertwined. Unix was originally written in assembly language. Dennis Ritchie created C so that Ken Thompson could rewrite Unix in a portable language. By 1973, the Unix kernel had been rewritten in C. Unix spread to universities with C as its language, training a generation of programmers. Linux — Unix's direct descendant — is still primarily written in C today.
Yes. The most recent standard, C23, was published by ISO in 2024. It adds features like 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.

Continue learning C on CoodeVerse

CoodeVerse Editorial Team

The CoodeVerse editorial team consists of experienced software developers and educators specializing in C, Python, Java, and web development. All content is technically reviewed and updated regularly.