A Purple Paper · the descent & the climb

The Ladderof Languages

A programming language is an invented thing — someone designed its grammar the way someone designs an alphabet. And every single one was built because the one before it hit a wall. This is that climb, rung by rung, from the first algorithm down to the metal and back up — with the real code, and the exact wall that forced each change.

scroll to descend the ladder

No language is handed down by nature. Each one is a human invention — and inventions only appear when something breaks.

So the cleanest way to understand the whole history isn't a list of names and dates. It's a chain of failures: this language could not do that, so someone built the next one to fix it — and then that one broke too. Read it as a ladder. The bottom is the bare machine. Every rung up is a step away from the transistors and toward human meaning. Nothing on the ladder replaces what's beneath it; it sits on top of it.

low rungs
Close to the metal. Fast, total control, brutal to write. You think like the machine.
the walls
Marked in amber. The thing that broke and forced the next language into existence.
high rungs
Close to human thought. Readable, safe, slower. You think like a person; a translator does the rest.
Era I

Before there was code

The idea of a machine following written instructions is older than electronics. Two inventions set the stage — one made of wood and thread, one that existed only on paper.

The Loom 1804 Joseph-Marie Jacquard · France
altitude: the seed of the idea
▰ the wall

Weaving a patterned fabric meant a human pulling the right threads, by hand, for every single row — slow, and the pattern lived only in the weaver's head. There was no way to store a design and run it again.

Jacquard punched the pattern into stiff cards: a hole meant "lift this thread," no hole meant "leave it." The loom read the cards and wove the design automatically. The pattern was now outside a human head — written down, reusable, executable by a machine.

No one called it a program. But the shape is exactly right: instructions, encoded as holes (the original binary — hole / no-hole), fed to a machine that obeys them in order. Every line of code you will ever write is a descendant of a punched card.

The first idea wasn't a language. It was that instructions can live on the outside, and a machine can read them.
The First Program 1843 Ada Lovelace · England
altitude: an algorithm, for a machine that didn't exist
▰ the wall

Charles Babbage designed a mechanical computer — the Analytical Engine — that could calculate. But a machine that can follow instructions is useless until someone writes the instructions. No one had ever written a non-trivial set of steps meant to be executed by a machine.

Translating an article about Babbage's engine, Ada Lovelace added her own notes — longer than the original article. In Note G she wrote out, step by step, how the engine could compute the Bernoulli numbers: a loop, with variables changing on each pass. It is the first published algorithm designed to be run by a machine. She also saw further than Babbage — that such a machine could manipulate not just numbers but any symbol: music, language, anything you could encode.

Note G · the shape of it (modernized)
# the first algorithm: compute a Bernoulli number
set result = 0
for each term in the series:
    compute the term
    result = result + term      # the variable changes each pass — a loop
return result
honest flagThe "first programmer" title is debated. Babbage wrote small fragments of machine instructions earlier; Lovelace's Note G is the most complete and elaborate, and the first published one. The vision — that the machine could work on any symbol, not just sums — is hers and was genuinely ahead of its time.
Hardware that can compute is half a computer. The instructions are the other half — and the instructions are a language.
Era II

The metal, and the first escape from it

When real electronic computers arrived in the 1940s, programming meant speaking the machine's own language — which turned out to be nearly impossible for humans. The first "languages" were just thin layers of mercy on top of raw numbers.

Machine Code 1940s the bare metal
altitude: rung zero — you ARE the machine

At the bottom of the ladder there is no language at all — just numbers. The processor understands only patterns of bits (1s and 0s), where each pattern means one tiny operation: load this number, add these two, store the result here. Early programmers wrote these by hand and set them with physical switches or punched cards.

machine code · "add two numbers" (illustrative)
10110000 01100001   # put the number 97 into a register
00000100 00000101   # add 5 to it
11110100            # halt
▰ the wall

It works, and it is the only thing the chip truly understands — but no human can write or read this at scale. One wrong bit is a silent catastrophe. A program of any size is unmaintainable. The machine's native tongue is unspeakable by people.

The metal is honest but merciless. Every rung above exists to get humans further away from these bits.
Assembly 1947 Kathleen Booth · England
altitude: rung one — names instead of numbers
▰ the wall (carried up from machine code)

Humans can't hold binary in their heads. So: give each machine operation a short name a person can remember and read.

Assembly language replaces each numeric instruction with a mnemonic — MOV, ADD, JMP. A small program called an assembler translates those names back into the exact machine code. It is a one-to-one map: still the machine's way of thinking, but now writeable.

assembly · the same "add" — now readable
      MOV  AL, 97      ; put 97 in register AL
      ADD  AL, 5       ; add 5
      HLT              ; halt
▰ the new wall

Two fresh problems. First, you still think in single machine steps — writing a × b + c takes a dozen lines. Second, and worse: assembly is different for every kind of chip. Code written for one machine is gibberish to another. You rewrite everything to move it.

A name is easier than a number. But you're still speaking the machine's language, one chip at a time.
honest flagSeveral people built early assemblers around the same time; Kathleen Booth wrote some of the first assembly languages and is the most commonly credited. "First" in this era is usually a cluster, not a single name.
Era III

The leap: speak like a human, not a machine

The 1950s broke the deadlock. Instead of one instruction at a time in the chip's own dialect, you'd write something close to mathematics or English — and a far more ambitious translator, a compiler, would turn a whole program into machine code for you. This is the great climb.

FORTRAN 1957 John Backus & team · IBM
altitude: the first high climb — write the formula, not the steps
▰ the wall (carried up from assembly)

Scientists wanted to write equations, and assembly forced them to hand-translate every formula into dozens of machine steps, per chip. Most believed a machine could never translate human-style math into code as efficiently as a human could. The wall was a belief: that high-level code was impossible or hopelessly slow.

FORTRAN — Formula Translation — let you write the math almost as you'd write it on paper, and its compiler produced machine code fast enough to win the skeptics over. It is widely called the first successful high-level language. Suddenly a formula was one line, and the same line could (with a different compiler) run on a different machine.

FORTRAN · a formula is finally just a formula
      PROGRAM ADDER
      INTEGER X
      X = 97 + 5
      PRINT *, 'HELLO, WORLD'
      END
▰ the new wall

FORTRAN was built for numbers. But people wanted computers to do things that aren't arithmetic — reason about symbols, process lists, handle language, run business records in plain English. One language shaped for math couldn't be shaped for everything.

Once a machine could translate human notation into fast code, the only question left was: whose notation? Every answer became a new language.
LISP 1958 John McCarthy · MIT
altitude: a language for thought, not sums
▰ the wall

The new field of artificial intelligence needed to manipulate symbols and lists — words, logical statements, trees of ideas — and to define functions that call themselves (recursion). FORTRAN's number-grid couldn't bend that way.

LISP (LISt Processor) made the list the fundamental thing, and code itself was written as lists — so a LISP program could read and write other LISP programs. It introduced ideas decades early: recursion, functions as values, automatic memory management. Much of it looks strange (so many parentheses) because it's close to raw mathematical logic.

LISP · factorial, defined in terms of itself (recursion)
(defun factorial (n)
  (if (= n 0)
      1
      (* n (factorial (- n 1)))))   ; it calls itself
Some walls aren't about speed. FORTRAN couldn't think in lists — so a language was built whose every thought is a list.
still aliveLISP's ideas (recursion, functions as data, garbage collection) were so far ahead that modern languages spent fifty years catching up to them. Its descendants still run today.
COBOL 1959 committee · incl. Grace Hopper's ideas
altitude: code a manager could read
▰ the wall

Business — payroll, banking, inventory — was a huge new use for computers, but the people who understood the business weren't mathematicians. Math-notation code was unreadable to them. Programs needed to look like English so non-specialists could check what they did.

COBOL (Common Business-Oriented Language) was deliberately verbose and English-like. Grace Hopper had already proven the key idea — that a compiler could accept near-English and produce machine code — and championed making code readable to the business, not just the engineer.

COBOL · reads almost like a sentence
       MULTIPLY HOURS-WORKED BY PAY-RATE
           GIVING GROSS-PAY.
       DISPLAY "HELLO, WORLD".
A language's audience is part of its design. COBOL's "wall" was human, not technical: the people who needed to read the code couldn't read math.
still aliveTrillions of dollars in banking and government systems still run on COBOL today. "Old" does not mean "gone" — a rung that solved a real wall tends to stay standing.
ALGOL 1958–60 an international committee
altitude: the language that taught the others how to be written
▰ the wall

Every language had its own ad-hoc grammar, and there was no clean, formal, machine-independent way to write down an algorithm and share it between researchers and machines. The field needed a rigorous common notation.

ALGOL (Algorithmic Language) is the most influential language most people have never heard of. It introduced block structure (code grouped in begin … end), nested scope, and was defined by a precise formal grammar (BNF) — the idea that a language's rules can themselves be written down exactly. Almost every language since — C, Java, Python, JavaScript — inherited its shape.

ALGOL · structured blocks, the template for everything after
begin
    integer x;
    x := 97 + 5;
    print(x)
end
Sometimes the wall is chaos itself. ALGOL's gift wasn't a feature — it was grammar: proof that a language could be specified as precisely as the math it expressed.
BASIC 1964 Kemeny & Kurtz · Dartmouth
altitude: a language for everyone else
▰ the wall

Computers were spreading, but every existing language assumed you were a scientist or a professional programmer. Ordinary students and beginners had no way in.

BASIC (Beginner's All-purpose Symbolic Instruction Code) was designed so a student could sit down and make the machine do something in an afternoon. It later shipped on millions of home computers in the 1980s — for a whole generation, BASIC was the first taste of code.

BASIC · about as simple as it got
10 PRINT "HELLO, WORLD"
20 GOTO 10   REM loops forever
Accessibility is a design goal like any other. BASIC's wall was the priesthood — code that only experts could enter.
Era IV

Power and structure: C and the object

By the 1970s two new walls appeared. High-level languages were too far from the metal to build operating systems — but assembly was too painful and unportable. And programs had grown so large that even good code became an unmanageable tangle. Two answers reshaped everything.

C 1972 Dennis Ritchie · Bell Labs
altitude: the perfect middle — high enough to write, low enough to control
▰ the wall

To build an operating system you need fine control over the machine's memory — which meant assembly, which meant rewriting the entire system for every new computer. High-level languages hid the machine too much to do the job; assembly chained you to one chip. There was no portable language for systems.

C sat exactly in the gap: structured and readable like a high-level language, but with direct access to memory like assembly. Its masterstroke — the Unix operating system was rewritten in C, so moving Unix to a new machine meant writing a C compiler, not rewriting Unix. C became the language the modern world is built on: operating systems, databases, other languages' own compilers.

C · the hello world that shaped the canon
#include <stdio.h>

int main(void) {
    printf("Hello, world\n");
    return 0;
}
▰ the new wall

C's power is also its danger: it trusts you completely with memory, so a single mistake corrupts data or crashes — or becomes a security hole. And as programs grew to millions of lines, C's flat style of functions-and-data became a tangle no one could hold in their head.

C found the load-bearing middle of the ladder and never left it. Fifty years on, the layer beneath almost everything is still C.
Smalltalk 1972 Alan Kay · Xerox PARC
altitude: a new way to organize, not just to write
▰ the wall

As programs ballooned, the old style — a pile of functions all reaching into shared data — became spaghetti: change one thing, break five others. Largeness itself was the wall. Code needed a way to stay organized as it grew.

Smalltalk made everything an object: a self-contained bundle of data and the behavior that acts on it, talking to other objects by sending messages. This is object-oriented programming in its purest form — model the program as a society of small responsible parts. The idea would soon flow into nearly every mainstream language.

Smalltalk · objects sending messages
Transcript show: 'Hello, world'.   "send 'show:' to the Transcript object"
Some walls aren't about what a language can compute, but how a human can organize what they wrote. The object was an answer to scale.
C++ 1985 Bjarne Stroustrup · Bell Labs
altitude: C's speed + the object's structure
▰ the wall

C was fast and close to the metal but had no objects, so big C programs tangled. Smalltalk had objects but was slower and a world apart. You had to choose between speed and structure — and large systems needed both.

C++ added objects (and much more) on top of C, keeping C's speed and machine access. You could write low-level, fast code and organize it into objects in the same language. It became the workhorse for things that must be both big and fast: game engines, browsers, trading systems.

C++ · objects, but still close to the metal
#include <iostream>

int main() {
    std::cout << "Hello, world" << std::endl;
    return 0;
}
▰ the new wall

Power piled on power: C++ grew enormous and intricate, and it kept C's memory dangers. Writing correct C++ took deep expertise. Most programmers didn't need maximum speed — they needed to stop crashing and ship faster.

You can bolt the new idea onto the old rung — but you inherit the old rung's dangers too. C++ carried C's sharp edges up with it.
Era V

The human era: readable, safe, everywhere

By the 1990s, computers were fast and cheap enough to spend some of that speed on the programmer instead of the machine. The new walls weren't about capability — they were about human cost: too hard to write, too easy to crash, too tied to one computer. The answers prioritized the person.

Python 1991 Guido van Rossum · Netherlands
altitude: near the top — code that reads like a sketch of thought
▰ the wall

C and C++ made you write a lot of ceremony — type declarations, memory management, braces and semicolons — before you could do anything simple. For everyday tasks that was too much friction; the language got in the way of the idea.

Python optimized ruthlessly for readability and speed-of-writing. It hides memory management, needs little ceremony, and uses indentation to show structure so the code looks clean. Compare it to C's hello world — the whole program is one line, and a beginner can read it aloud.

Python · the entire program
print("Hello, world")
When the machine has speed to spare, spend it on the human. Python's wall was friction itself — and it won a generation by removing it.
the tradePython is slower than C because a translator works harder at run time to spare you. That's the deal at the top of the ladder: you trade some machine speed for a lot of human speed. Most of the time, that's the right trade.
Java 1995 James Gosling · Sun Microsystems
altitude: high — and it invented a fake machine to stand on
▰ the wall

C++ programs had to be recompiled — often rewritten — for every kind of computer, and its memory bugs caused endless crashes. The dream was "write once, run anywhere" with the memory dangers removed.

Java's trick was an invented, fake machine — the Java Virtual Machine (JVM). Your code compiles not to any real chip's code, but to bytecode for the JVM. Then a JVM built for each real platform runs that bytecode. Compile once, run on any machine that has a JVM. Java also took memory management out of your hands (automatic "garbage collection"), removing a whole class of crashes — and kept the object structure from the C++/Smalltalk line.

Java · the ceremony is the portability & structure
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world");
    }
}
and the descent underneath it — every layer an invented language
Hello.java   → your text (a designed grammar)
    javac
bytecode     → the JVM's language (an invented machine)
    JVM + JIT
machine code → the real chip's language (also a design)
   
transistors  → the only layer that isn't a language
Java's answer to portability was to invent a machine that doesn't exist, so the code never has to commit to a real one until the last moment. The whole ladder is languages compiling to languages — all the way down to the voltage.
JavaScript 1995 Brendan Eich · Netscape · in 10 days
altitude: high — and it lives inside every web page
▰ the wall

The early web was paper: pages you could read but not do anything with. There was no way to make a page react — respond to a click, check a form, change without reloading.

JavaScript was built (famously, in about ten days) to run inside the browser and make pages interactive. Despite a rushed birth and many quirks, it became one of the most-used languages on Earth simply because it owns the one place everyone goes: the web page. This very document runs a little of it to reveal each section as you scroll.

JavaScript · making the page do something
function greet() {
    alert("Hello, world");   // pops up when you click
}
A language can win not by being best, but by owning the only door to somewhere everyone needs to be. JavaScript's wall was the static page — and it became the language of the web by default.
Era VI

The return: can we have it all?

The newest walls are old ones, refused. For decades the deal was fixed: low rungs gave speed but danger; high rungs gave safety but cost speed. The modern question is whether that trade was ever truly necessary — or just unsolved.

Rust 2010 · 1.0 in 2015 Graydon Hoare · Mozilla
altitude: low-rung speed, high-rung safety — at the same time
▰ the wall

C and C++ give you raw speed and control, but their memory bugs cause the majority of serious software crashes and security vulnerabilities — decades of them. The two usual fixes both cost something: write in C/C++ and accept the danger, or use a "garbage-collected" language (like Java/Python) and accept the slowdown. The wall: nobody had safety and bare-metal speed together.

Rust's idea is a compiler that proves your memory use is safe before the program ever runs — a strict set of ownership rules checked at compile time, with no run-time garbage collector slowing things down. If it compiles, a whole category of crashes is impossible. It's harder to satisfy the compiler, but the payoff is C-level speed without C's most dangerous bugs.

Rust · the compiler checks your safety before it runs
fn main() {
    println!("Hello, world");
}
The newest move on the ladder isn't a higher rung — it's refusing the old trade. Rust treats "fast or safe" not as a law of nature but as a wall waiting to be broken.
honest flagRust doesn't make all bugs impossible — only a specific (large, costly) class of memory errors. And its strictness has a real learning cost. It's a genuine advance, not a silver bullet; the trade-offs moved, they didn't vanish.
The spine

One task, the whole ladder

The clearest way to feel seventy years of climbing: watch the same instruction — "say hello" — across every rung. Same job. Each time, less ceremony, more human, further from the metal.

machine1940s
10110000 01101000 … (raw bits — unwriteable by hand)
Assembly1947
MOV / INT calls to the operating system, ~10 lines
FORTRAN1957
PRINT *, 'HELLO, WORLD'
LISP1958
(print "Hello, world")
COBOL1959
DISPLAY "HELLO, WORLD".
BASIC1964
10 PRINT "HELLO, WORLD"
C1972
printf("Hello, world\n");
Python1991
print("Hello, world")
Ruby1995
puts "Hello, world"
JavaScript1995
console.log("Hello, world")
Rust2010
println!("Hello, world");

The bits at the top and the println at the bottom do the identical thing on the identical hardware. Everything between them is invented language — each one a rung someone built so a human wouldn't have to stand on the one below.

The synthesis

Five walls, over and over

Strip away the names and the same handful of pressures forced almost every rung. New languages don't appear randomly — they appear when one of these breaks.

▰ abstraction
"This is too close to the machine." The push to think in human terms — formulas, objects, ideas — and let a translator handle the bits. Machine code → assembly → FORTRAN → the rest.
▰ portability
"I have to rewrite it for every computer." The push to write once and run anywhere. Assembly's chip-lock → C's compilers → Java's invented machine.
▰ safety
"One mistake and it crashes — or gets hacked." The push to make whole classes of bug impossible. C's raw memory → garbage collection → Rust's compile-time proofs.
▰ readability
"The people who must read this can't." The push toward code a human — or a beginner, or a manager — can follow. COBOL's English, BASIC's simplicity, Python's clarity.
▰ expressiveness
"My language can't even say what I mean." The push to match the shape of the problem — lists for AI, objects for big systems, the web for interactivity. LISP, Smalltalk, JavaScript.
▰ the meta-pressure
"A language is whatever you decide to build." None of this is fixed. Grammar is invented; the translator makes it real. Every rung is someone refusing a wall — and you can invent the next one.

The ladder never ends, because the walls never do.

Seventy years of programming languages is not a march toward one perfect language. It's a chain of refusals. Each language is someone looking at a wall — too slow, too dangerous, too tied to one machine, too hard for humans to read — and saying no, build the next rung.

And the deepest thing under all of it: a programming language is a constructed language, an invented grammar with a translator beneath it that turns it into the grammar below, and the one below that, down to the only layer that isn't a design — the voltage in the silicon. To learn to program is to learn to write in one of these invented tongues. To design a language is to add a rung of your own.

You started this paper asking how to print one line. The honest answer is: you were learning to speak one invented language, on a ladder of invented languages, every rung of which exists because a human refused the wall on the rung below.

THE LADDER OF LANGUAGES · a purple paper on why languages change
sourced from the standard history of computing · honest flags marked where the record is contested or "first" is a cluster
code examples are real and characteristic; some early ones lightly modernized for legibility (noted)
built to be read top to bottom · the climb is the argument