This episode traces C's birth at Bell Labs by Dennis Ritchie, its role in developing Unix and operating systems, and the evolution of the C89, C99, C11, C17, and C23 standards. You will also understand the problems C solves and when to choose C over other languages.

Before understanding how to write C, you need to understand why this language was born and why it has survived for more than five decades. Episode 1 opens the journey from the Bell Labs research labs in the early 1970s to the stable C23 standard of today.
The C language was born from a pragmatic need: rewriting the Unix operating system, which was originally written in assembly. Assembly is very fast but hard to maintain and not portable. C was created as a bridge: as fast as assembly for low-level operations, yet abstract enough to be written productively by humans.
In this episode you will see the evolution of C, the problems it solves, its comparison with high-level languages, and guidance on when to choose C. This will become the philosophical foundation for all the episodes that follow.
C's history begins with the BCPL language developed by Martin Richards, then simplified by Ken Thompson into the B language for the PDP-7 computer. B was too limited because it had no well-defined data types. In 1972, Dennis Ritchie designed C as an evolution of B, rewritten for the PDP-11.
The most influential decision of that era was rewriting Unix in C in 1973. From that point on, operating systems were no longer tied to a single machine architecture. This was the birth of the portability concept, which remains C's primary promise to this day.
C became the language of choice for writing operating systems for three reasons: direct memory access through pointers, precise control over hardware, and efficient machine code output. Linux, Windows, and macOS are all written largely in C. So too are the firmware on microcontrollers, network kernels, and device drivers.
Without C, the modern software ecosystem would not exist. Popular languages like Python, Go, and JavaScript implement their runtimes in C or C++. Understanding C means understanding the lowest layer on which all other languages stand.
The first version of C was documented in the book The C Programming Language by Brian Kernighan and Dennis Ritchie in 1978, known as K&R C. Because C grew without an official standard, every compiler added its own incompatible extensions.
In 1989, ANSI published the first C standard, followed by ISO in 1990, so it is known as ANSI C or C89/C90. This standard formalized syntax, the standard library, and compiler behavior for the first time.
Each subsequent revision added important features:
long long type, // comments, variables in for blocks, and the <stdint.h> header.nullptr constant, typeof, attributes, and preprocessor improvements.You can choose the standard version when compiling:
gcc -std=c17 program.c -o program
gcc -std=c2x program.c -o program
clang -std=c11 program.c -o programThe flag -std=c17 above instructs the compiler to conform strictly to the C17 standard. Getting used to specifying an explicit standard makes your code more portable across compilers and platforms.
The main problem C solves is the need for a language as efficient as assembly but still productive. With pointers, you can access memory addresses directly. With bitwise operators, you can manage flags at the bit level. The result is memory-efficient, fast programs, well suited to systems with limited resources.
Because C is an internationally standardized language, code written to a given standard can be compiled on different architectures with different compilers. GCC for x86_64, ARM, and RISC-V all understand the same standard. This is what makes C the most portable language in the world.
Prove the portability promise by compiling the same code with two different compilers:
cat > coba.c <<'EOF'
#include <stdio.h>
int main(void) {
printf("portabel di mana saja\n");
return 0;
}
EOF
gcc -std=c17 coba.c -o coba-gcc
clang -std=c17 coba.c -o coba-clang
./coba-gcc
./coba-clangOne source file, two compilers, two executables that both run. Code that only uses standard features like the example above will compile on almost any platform that provides a C toolchain.
Almost every modern language learned from C. The syntax of Java, C#, and Go directly inherits the C style. The pointer concept resurfaces in the form of slices in Go and references in Rust. Understanding C gives you intuition about why other languages behave the way they do.
C is not always the right answer. Python and Go are more productive for business applications, while Rust provides stricter memory safety. Choose C when you need direct control over hardware, small binary sizes, or precise execution determinism.
Use the following checklist:
C excels in domains that value control and efficiency above all else. In that position, C skills will never become obsolete.
Key takeaways:
In the next episode 2 we will discuss C's core concepts and main architecture — the compilation process from preprocessing, compilation, assembly, to linking, the C memory model with stack, heap, static data, and text segments, and the ABI and calling convention working behind the scenes.