Skip to content
Back to the collection

The evolution of Smalltalk: from Smalltalk-72 through Squeak

Daniel Ingalls

2020 · Proceedings of the ACM on Programming Languages

Read the paper
HN score
2
Mentions
15
Readers
4
Months
14
What’s in a score?

From the abstract

This paper presents a personal view of the evolution of six generations of Smalltalk in which the author played a part, starting with Smalltalk-72 and progressing through Smalltalk-80 to Squeak and Etoys. It describes the forces that brought each generation into existence, the technical innovations that characterized it, and the growth in understanding of object-orientation and personal computing that emerged. It summarizes what that generation achieved and how it affected the future, both within the evolving group of developers and users, and in the outside world. The early Smalltalks were not widely accessible because they ran only on proprietary Xerox hardware; because of this, few people have experience with these important historical artifacts. To make them accessible, the paper provides links to live simulations that can be run in present-day web browsers. These simulations offer the ability to run pre-defined scripts, but also allow the user to go off-script, browse the details of the implementation, and try anything that could be done in the original system. An appendix includes anecdotal and technical aspects of how examples of each generation of Smalltalk were recovered, and how order was teased out of chaos to the point that these old systems could be brought back to life.

Metadata: Crossref. Abstracts retain their original authors’ rights.

In the conversation

Original HN comments, with labels from simple text rules. A label describes the whole comment and may miss context or irony. Read the discussion to make up your own mind. About the labels

15 selected excerpts · 15 total mentions

Rochus
Recommendation · rule
Sure. Late binding in Smalltalk-80 means that a bytecode method is selected via a hash table per class and the address of the internalized selector string (atom) as a key. In Oberon, procedures are natively compiled, but each module is dynamically loaded; a module can implement a handler for a message and be separately compiled and loaded by name, so again late binding. If you're interested in the difference between Smalltalk versions, I recommend Ingall's most recent paper: https://dl.acm.org/doi/10.1145/3386335. In contrast to Smalltalk >= 76, ST-72 had no bytecode, but sent tokens (synchronously) to object instances for parsing (which was called "message passing" by…
Read the full comment
its authors). > If you are doing whole-system development and have control over the entire thing, then it is that simple The dispatch mechanism and the described duality is the same, whether whole-system or not. > Kay's view of OO is a matter of "open world" versus "closed world" Smalltalk was always a "closed world" (you are always in the same image, but code can be compiled on the fly at runtime), and all calls were synchronous. Since the Oberon compiler and system treats each module as a dynamic loadable entity and supports loading by name, it actually supports the "open world" approach. Interestingly, Kay's view is likely best represented in Erlang, where there are true messages sent asynchronously. > If you're programming every operation with switch statements that select code paths based on objects' type tags As mentioned, Oberon traverses the "2D matrix" from the other side. Each module may or may not handle a message in a WITH (i.e. switch by type) statement, but modules per se ar dynamic. So the "a priori knowledge" only applies to the message type.
igouy
Neutral mention · rule
> especially hard for beginner students Perhaps you don't know that 50 years ago Smalltalk was being taught to middle school and high school students? > Nothing so simple exists in smalltalk Have you actually used Smalltalk? ---- `I will always remember a debug emergency call I received during one of our student classes. A girl was experimenting with numbers in Smalltalk-80, and suddenly her system froze when she tried to reframe a window. Although the UI was unresponsive, the "emergency evaluator" window was still operating so I was able to take a look at what had happened. Her window was trying to display itself, but was encountering an error because BitBlt,…
Read the full comment
responsible for painting the border, had a width that was. . . wait a minute. . . a Fraction? We did not even have fractions in the student system, but she said, "Oh yes, I added a Fraction class". Interestingly, BitBlt was written to be resilient, in that if it received a non-integer argument, it would call itself again after sending the message asInteger to that argument. However, her fractions did not have such a method, so the debugger had stopped at that point and was not even able to show the problem because of another such infraction (er, sorry). I asked whether she had a conversion to integer and she replied no, but that her fractions did have a makeFloat message. We talked about the problem, and I got her to suggest defining Fraction understands: 'asInteger' as: '↑ self makeFloat asInteger' We were able to type this into the emergency evaluator, at which point the debugger miraculously displayed itself, the window she had tried to reframe reappeared, and everything in the system seemed to work again. Probably hundreds of methods in the system were now operating just fine with rectangles whose coordinates were instances of a student’s newly defined Fraction class. This illustrates the astounding ability of message-sending systems to absorb unanticipated constructions.` Daniel Ingalls "The Evolution of Smalltalk" 85:63 Proc. ACM Program. Lang., Vol. 4, No. HOPL, Article 85. Publication date: June 2020 https://dl.acm.org/doi/pdf/10.1145/3386335
actuallyalys
Neutral mention · rule
A lot of these languages didn't introduce their "big idea." I think their inclusion makes sense but the article could be clearer about it. —Comptime exists in Lisps and I think C++ had it before Zig. Zig's contribution, IMO, is in using it to simplify the language. My impression is that they don't have a dedicated generic mechanism as a result. —Multiple dispatch exists in Clojure but predates it. Apparently all dispatch in Julia is technically multiple dispatch and is consequently much optimized. —Optionals long predate Swift (as he acknowledges) and are notably a part of the ML family. I don't know much about Swift, and the author doesn't really make it clear why he…
Read the full comment
found Swift Optionals easier to pick up. —Structural typing existed in dynamic languages, as he acknowledges. I'm actually not sure that Lisp got to images first. Smalltalk is younger than Lisp but old enough that Lisp was still evolving. According to The Evolution of Smalltalk [0], the very first version of Smalltalk had images. I'd be curious as to whether the author or anyone else has a good source on the first Lisp with images? [0]: https://dl.acm.org/doi/10.1145/3386335
Rochus
Neutral mention · rule
You have to consider that there is actually no true message passing in Smalltalk. Smalltalk just uses that term for dynamic dispatch of compiled methods and calling them (synchronous local invocation). Since Smalltalk 76 methods are compiled and there is a dynamic dispatch mechanism similar to Simula 67 (or Java); the main difference is that Smalltalk uses an internalized pointer to the selector (i.e. method signature) for dispatch instead of the more efficient method index used by Simula 67 and most modern OO-languages. When you read e.g. https://dl.acm.org/doi/10.1145/3386335 (highly recommended), Ingalls describes that the first Smalltalk implementation in 1972 was a…
Read the full comment
bit closer to "message passing" in that token streams were sent to an object for interpretation, but that was synchronous and local as well (like the later method dispatch) and the objects were not "active" (in contrast to e.g. the Actor Model as implemented e.g. in Erlang). I spent a lot of time building tools to study the internals of Smalltalk-80; if you are interested in the technicalities, here is the link: https://github.com/rochus-keller/Smalltalk/.
Rochus
Neutral mention · rule
> The person who coined the term "object-oriented programming" See https://news.ycombinator.com/item?id=36879311 for who coined the term. > before he developed Smalltalk See https://dl.acm.org/doi/10.1145/3386335 for who developed Smalltalk. > The big idea [..] was messaging A Simula I event notice (time, process) in the sequencing set is just a message step(process, time) in a priority mailbox; the two are the same mathematical object, making Simula's discrete-event active processes and message-passing active objects trivially isomorphic.
Rochus
Neutral mention · rule
> That's the Smalltalk school of OOP In particular the "Smalltalk-72 school" which had indeed something like "message passing" (though still synchronously). Starting from Smalltalk-76, and particularly in Smalltalk-80, which is the Smalltalk we know today, the object model pretty much corresponds to Simula-67, with compiled methods dipatched via virtual method tables. The only difference is, that in Smalltalk, the dispatch goes via the internalized string address of the selector (vs. method index as e.g. in Simula-67, C++ or Java). See e.g. https://dl.acm.org/doi/10.1145/3386335.
Rochus
Neutral mention · rule
> But Kay was the one to popularize objects as we think of them today. Not actually. Kay's view of OO is pretty different from what we understand of OO today; the general understanding is closer to Simula 67; see also the IEEE milestone: https://ethw.org/Milestones:Object-Oriented_Programming,_196.... Ironically Smalltalk-76 and onwards also corresponds more with the Simula 67's than Kay's view. > Development of Smalltalk started in 1969 You mix that up with Kay's PhD. A good and reliable history about the origin and evolution of Smalltalk can be found in the excellent 2020 paper by Ingalls: https://dl.acm.org/doi/10.1145/3386335
Rochus
Neutral mention · rule
The original Smalltalk in 1972, the language of which Kay designed, indeed had some kind of message passing (even though it was synchronous, the receiving object interpreted messages composed of tokens). Smalltalk-76, essentially designed by Ingalls, who was also the sole author of the 1978 publication, made a fundamental shift towards compiled virtual methods, essentially as it was done in Simula 67 and adopted by C++ (though much less efficient). So yes, it makes pretty much sense when Kay claims that he didn't have C++ nor Smalltalk in mind when talking about OO. See also https://dl.acm.org/doi/abs/10.1145/3386335.
Rochus
Neutral mention · rule
Kay's view of object-orientation is "messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things" (quoted from http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay...). This is quite different from what we associate with object-orientation today (objects, classes, inheritance, virtual methods, etc.), and how it was implemented e.g. in Simula 67, or in Java. Kay's view has similarities with Hewitt's actor model (see e.g. https://www.quora.com/What-is-the-difference-between-Alan-Ka...). A good source on how Smalltalk-72 was different from Smalltalk-76 is Ingall's 2020 paper (https://dl.acm.org/doi/10.1145/3386335).…
Read the full comment
Smalltalk-72 indeed implemented a kind of message passing in that there were objects "sending" token streams to other objects which interpreted these streams; so there was indeed something like a "message", and there are similarities with message queues and parts of Kafka; message passing can be synchronous or asynchronous. Calling a method is not the same as passing a message; there is no message which has to be "interpreted", but the compiler knows the signature of the method and generates efficient code for calling it using a specific ABI. If methods from objects are called which reside in a different address space/process or even on different hardware, then method calls are dispatched over an IPC mechanism or even a network (like e.g. CORBA or some versions of ESBs); the network dispatch is technically message passing, but to the programmer it still looks like a local (synchronous) method call. The Smalltalk community instead prefers to talk about "message passing", even if it is implemented as plain in-process, in-memory method call. It is also notable that already Simula I (1962) had "active objects" (the Simula I objects were called "process") and there was the notion of events and queues.
Rochus
Neutral mention · rule
Btw. just came across your FOSDEM talk (https://fosdem.org/2021/schedule/event/new_type_of_computer/) which I found very interesting. Modula-2 was actually inspired by Mesa, not by Cedar (see https://dl.acm.org/doi/10.1145/1238844.1238847), and you might also be interested in this paper (concerning the implementation language of the ST VMs): https://dl.acm.org/doi/10.1145/3386335. Btw. a lot of good ideas from ST went into Ruby and finally Crystal which might be an adequate alternative solution for your two language (Oberon & Squeak) approach.

Keep following the thread.

More in Programming languages

More from the same topics.

2000arXiv

Dancing links

Donald E. Knuth

The author presents two tricks to accelerate depth-first search algorithms for a class of combinatorial puzzle problems, such as tiling a tray by a fixed set of polyominoes.

10 mentions10 months
2HN score