C was developed by Dennis Ritchie at Bell Labs between 1972 and 1973, evolving from Ken Thompson's B language (itself derived from BCPL), specifically to give the emerging UNIX operating system a portable, higher-level alternative to writing everything in assembly. By 1973, UNIX itself had been substantially rewritten in C, proving the language could deliver near-assembly performance with genuinely portable, structured code — a combination no earlier language had offered. C gives direct, largely unchecked access to memory through pointers, compiles to native machine code with minimal runtime overhead, and has no garbage collector, automatic bounds checking, or built-in safety net — correctness is the programmer's responsibility, not the language's.
Hello, World — close to the machine
Even this trivial example shows C's character: manual memory-free functions like printf link directly against the C standard library, and there's no runtime, interpreter, or virtual machine involved at all — the compiler produces a native executable directly.
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}The mother of modern systems programming
The Linux kernel is written almost entirely in C; large parts of Windows and macOS's core layers are too. C++, Objective-C, and C# were built directly on C's foundations, and languages like Java, Python, Go, and Rust all carry visible traces of C's syntax — curly braces, semicolons, the general shape of control flow — even where their actual semantics diverge sharply.
No safety net, by design
C has no automatic memory management, no bounds checking on array access, and no runtime type safety — a program can read or write past the end of an array, or use memory after freeing it, and the language itself will not stop this. This is a deliberate tradeoff: it's exactly what gives C its predictable performance and direct hardware control, and exactly why memory-safety bugs in C code have historically been a major source of real-world security vulnerabilities.