The Direct Lineage — Objective-C, Ruby, and Beyond
Smalltalk
Chapter 6 · The Direct Lineage — Objective-C, Ruby, and Beyond
smalltalk1-5 traced Smalltalk's design and UI influence — MVC, the GUI. This chapter traces a genuinely separate thread: languages that borrowed Smalltalk's own actual syntax and semantics directly, not just its ideas about screens and windows.
Objective-C — Smalltalk's Syntax, Bolted Onto C
Brad Cox and Tom Love created Objective-C in the early 1980s by adding Smalltalk-style messaging directly on top of C — literally grafting Smalltalk's own message-send syntax onto C's existing structure. [receiver message] and [receiver message: argument] are direct syntactic descendants of Smalltalk's own keyword-message form.
This is a real, direct lineage, tied concretely back to smalltalk1-3's own core claim: in Objective-C, [myArray count] is genuinely, literally sending the message count to the object myArray — the same message-passing model as Smalltalk, syntactically dressed to sit inside C's own surrounding structure. Not "OOP inspired by OOP in general" — the actual message-send concept survived the trip into Objective-C intact, not just classes and inheritance.
Objective-C went on to become the primary language for NeXTSTEP and, for decades, macOS and iOS development, right up until Swift. For a genuinely long stretch, Smalltalk's own message-passing model was running on hundreds of millions of Apple devices — mostly invisibly, to developers who may never have heard the word "Smalltalk" at all.
Ruby — Smalltalk's Philosophy, With Friendlier Syntax
Yukihiro "Matz" Matsumoto, Ruby's creator, has explicitly and repeatedly cited Smalltalk as one of Ruby's own major influences — a stated, acknowledged influence, not speculation. Ruby's own "everything is an object" claim, already flagged in smalltalk1-3's own note-box, is inherited close to directly: 3.times { ... } is a real method call on the integer object 3, not special syntax, and nil itself is an object of class NilClass, not a special non-object null value the way many other languages treat null.
Worth revisiting ruby1-6's own material directly: Ruby's own open classes — the ability to reopen and add methods to an existing class, even a built-in one like Integer or String, at any time — are a genuinely direct descendant of the same live-editability philosophy covered in smalltalk1-4's own image and class-browser material. The idea that a class definition isn't a sealed, fixed artifact, but something you can keep live-editing at any point, is inherited close to intact.
Beyond Objective-C and Ruby — A Wider, Fainter Trail
Briefly, and without overclaiming: many other languages absorbed some Smalltalk influence more indirectly or partially. Python's own object model is less directly Smalltalk-influenced than Ruby's, but still object-uniform in spirit for many built-in types. JavaScript's own prototype-based object model is worth flagging as a genuinely separate lineage — despite a superficial "everything is dynamic and objecty" resemblance, it did not descend from Smalltalk directly, and lumping every dynamically-typed, object-heavy language together as "basically Smalltalk" would be inaccurate.
Self and Squeak are worth naming here too, as more direct — if less mainstream — descendants; smalltalk1-8 covers Squeak specifically in full as this course's own closing chapter.
How Much of "Modern OOP" Genuinely Traces Back Here
smalltalk1-1's own closing note claimed that every OOP language covered on this site "inherited its object model from a lineage that runs through" Kay's work. That's worth refining here, not repeating uncritically: there are actually two distinct OOP lineages. A Simula-rooted branch (C++, Java, C#) — emphasizing static types and compile-time class structure, tracing back to Simula 67's own earlier, independent root from smalltalk1-1 — and a Smalltalk-rooted branch (Objective-C, Ruby, Python to a degree) — emphasizing dynamic typing, live message-passing, and duck typing. Most OOP languages inherit from one of these two roots, sometimes elements of both, rather than everything tracing to Smalltalk specifically.
| Branch | Languages | Typing | Dispatch |
|---|---|---|---|
| Simula-rooted | C++, Java, C# | Static, compile-time | Compiler-resolved (vtables, opt-in virtual) |
| Smalltalk-rooted | Objective-C, Ruby, Python (partially) | Dynamic | Live message lookup at send time |
Reflection Questions
This chapter distinguishes "borrowing syntax/semantics directly" (Objective-C) from "borrowing UI/design ideas" (smalltalk1-5's own MVC material). Why might that distinction matter when tracing a language's real influences, rather than just saying "everything comes from Smalltalk"?
If you know Ruby, Python, or JavaScript, pick one and identify a specific feature that either does or doesn't fit this chapter's own Smalltalk-rooted vs. Simula-rooted distinction. Where would you place it, and why?
This chapter openly corrects an overclaim made back in smalltalk1-1. Why do you think it's worth the course revising its own earlier claim explicitly, rather than quietly using the more accurate framing going forward without mentioning the earlier one?
Chapter 6 Key Takeaways
- Objective-C's
[receiver message]syntax is a direct descendant of Smalltalk's own message-send form — same underlying concept, not just similar-looking OOP - Objective-C carried Smalltalk's message-passing model onto hundreds of millions of Apple devices for decades
- Matz has explicitly cited Smalltalk as a major Ruby influence — Ruby's "everything is an object" and open classes both trace directly back
- JavaScript's prototype-based model is a genuinely separate lineage, not a Smalltalk descendant
- OOP genuinely splits into two lineages: Simula-rooted (C++, Java, C#, static/compiler-dispatched) and Smalltalk-rooted (Objective-C, Ruby, dynamic/message-dispatched)
- Not all OOP traces to Smalltalk specifically — a deliberate correction to smalltalk1-1's own earlier, looser claim