Influenced by: bcpl algol b assembly
C is the original systems language: a small, fast, statically but weakly typed procedural language created at Bell Labs to write Unix. Memory is entirely manual - there is no garbage collector, no destructors, and no built-in ownership. You allocate with malloc/calloc/realloc, release with free, and reach memory directly through raw pointers and pointer arithmetic. That power comes with undefined behavior: get the lifetime or the bounds wrong and the program is yours to debug.
What makes it distinctive
- Fully manual memory management: no garbage collector and no automatic destructors - you pair every
malloc/calloc/reallocwith a matchingfree, and a missed or doublefreeis on you. - Raw pointers and pointer arithmetic give direct, unchecked access to memory; arrays decay to pointers and there are no bounds checks at runtime.
- Undefined behavior is a core design feature: out-of-bounds access, use-after-free, signed overflow, and uninitialized reads have no defined meaning, which is what lets compilers optimize aggressively.
- "Portable assembler": a thin, predictable mapping to hardware with minimal runtime, making it the default for kernels, bootloaders, and embedded systems.
- The de facto ABI of computing: the C calling convention and headers are the universal interop layer that virtually every other language binds to via FFI.
- Small core language standardized by ISO WG14, with a deliberately minimal standard library and no built-in safety net - discipline and tooling (sanitizers, static analysis) substitute for language-enforced safety.
History
C was created in 1972 by Dennis Ritchie at Bell Labs. It grew directly out of Ken Thompson's B language (1969), which was itself a stripped-down descendant of Martin Richards' BCPL and, more distantly, ALGOL 60. B was typeless and word-oriented; as Unix was ported toward the byte-addressed PDP-11, Ritchie added data types (char, int, structs) and a richer expression syntax, producing what was first called "New B" and then C.
C's defining moment was the rewrite of the Unix kernel in C around 1973. This made Unix one of the first operating systems written largely in a high-level language, and it gave C its reputation as a "portable assembler" - close enough to the hardware to be efficient, abstract enough to move between machines.
In 1978 Brian Kernighan and Dennis Ritchie published The C Programming Language, whose informal specification became known as K&R C. As C spread, the need for a formal standard grew. ANSI standardized the language in 1989 (C89, also called ANSI C), and ISO adopted essentially the same text in 1990 (C90, ISO/IEC 9899:1990).
The language was modernized by C99 (1999), which added // comments, variable-length arrays, long long, and designated initializers. C11 (ISO/IEC 9899:2011) introduced multithreading (<threads.h>), atomics, _Static_assert, and anonymous structs/unions. C17 (a.k.a. C18, ISO/IEC 9899:2018) was a bug-fix release with no new features. The current standard, C23 (ISO/IEC 9899:2024), was published on October 31, 2024; it makes bool, true, false, nullptr, static_assert, and thread_local first-class, adds typeof, binary literals, and <stdckdint.h> checked arithmetic. The committee responsible is ISO/IEC JTC1/SC22/WG14, now working toward "C2y".
Ritchie and Thompson received the ACM Turing Award in 1983 for Unix; more than fifty years on, C remains the lingua franca of operating systems, embedded firmware, language runtimes, and the C ABI that nearly every other language must speak to.