← the guideObjects Ascendant

§ 02 — Eras · 1980

Smalltalk-80

everything is an object; everything happens by message

Left: era context, features, and the 101 hello. Right: 3 core concepts, 3 deeper 201 lessons, the factorial specimen, and where Smalltalk-80 lives today — each column scrolls on its own.

creators
Alan Kay, Dan Ingalls, Adele Goldberg et al., Xerox PARC, 1980
status
alive (niche) · Pharo, Squeak — and every IDE descends from it
lineage
← Simula 67→ Objective-C⇢ Ruby

The problem it solves

Kay wanted computing children could wield — programs as conversations between objects, in an environment you live inside.

The problem it carries

Purity has a price: everything-an-object overhead, an image opaque to version control, and licensing that kept it niche.

Key features

uniform messaging
Everything is an object, and every interaction is a message — unary, binary or keyword.
the browser and workspace
Live editing and inspection of running objects: the IDE as part of the language.
blocks as objects
Closures are first-class values, passed to collection methods like collect: and select:.
image-based persistence
The running system is the database; changes take effect instantly, no build step.

101 — hello, world

Session one is the smallest program that still counts as speaking Smalltalk-80: what every tutorial prints first, in the dialect that mattered when the language arrived (1980).

the first program1980
Transcript showln: 'Hello, world'.

101First contact — hello world and 3 ideas that define how Smalltalk-80 reads. 201 — 3 lessons on mechanisms you meet after the factorial specimen: the sharp edges practitioners actually use.

101 — core concepts

3 fragments, each naming a habit of mind in Smalltalk-80. Read the note, then the code — together they are the 101 in one sitting.

01 — messages, not operators

No syntax to speak of — just objects sending unary, binary and keyword messages.

3 + 4.
'Smalltalk' reverse.
#(1 2 3) collect: [:x | x * x].

02 — blocks

Closures before anyone called them that; iteration is a message with a block.

[:each | each * each]      "a function, as an object"
#(1 2 3) collect: [:each | each * each].

03 — the live image

You edit a running system and see changes instantly — the browser/inspector/debugger were born here.

1 to: 5 do: [:i |
  Transcript showln: i factorial].

201 — going deeper

The 201 assumes you have read the 101 and the specimen. Each lesson is one mechanism — what it is for, how it looks in code, and the trap or payoff that makes Smalltalk-80 distinctive at scale.

  1. the image and object memory
  2. non-local return and ensure
  3. the debugging trio

the image and object memory

The running image is the program: classes, methods and data live in one address space you can inspect and change while it executes.

Object subclass: #Ship
  instanceVariableNames: 'tons'
  classVariableNames: '' !

non-local return and ensure

A caret returns from the invoking method, and ensure blocks run on the way out — the control-flow primitives behind Smalltalk’s loop idioms.

#(3 2 1) do: [:each |
  each > 2 ifTrue: [^ 'big']].
"never reached"

the debugging trio

Workspace, Inspector and Transceiver — evaluate, poke at live objects, and watch messages flow — the direct ancestors of today’s IDEs.

| s |
s := Ship new tons: 24.
s inspect.
s class name.

The specimen — factorial

The message: no operators, no statements — only objects sending words to objects, even to build the IDE itself. The environment is written in the language it describes.

the message1980
#(1 2 3 4 5)
   collect: [ :each | each * each ]

Run it today

installbrew install gnu-smalltalk

rungst fact.st

Where it is now

Pharo powers research and trading systems; its real legacy is Objective-C, Ruby, and every IDE you have used.