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

A correction worth making honestly
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.
BranchLanguagesTypingDispatch
Simula-rootedC++, Java, C#Static, compile-timeCompiler-resolved (vtables, opt-in virtual)
Smalltalk-rootedObjective-C, Ruby, Python (partially)DynamicLive message lookup at send time
A genuinely separate lineage: JavaScript
JavaScript's own prototype-based object model didn't descend from Smalltalk — it's a distinct design with its own separate history. It's easy to lump every "dynamic and objecty" language together as one big Smalltalk family; this chapter deliberately resists that, since accuracy about which influence actually flowed where matters more than a tidy, oversimplified story.

Reflection Questions

Question 1

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"?

Question 2

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?

Question 3

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