HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
rochus-keller
Smalltalk
C++2020–2026
rochus-keller / Smalltalk

Smalltalk

Parser, code model, interpreter and navigable browser for the original Xerox Smalltalk-80 v2 sources and virtual image file

5Distinct people
35Mentions
1Explicit recommenders
323GitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Parser, code model, interpreter and navigable browser for the original Xerox Smalltalk-80 v2 sources and virtual image file

GitHub

Where it is used

No documented product use has been verified yet.

What people are saying

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…

Rochus used a recommendation phrase. One indexed comment matches. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year35 dated mentions

Observed mentions: 2020-02-29 15:41:18 UTC to 2026-08-19 03:55:27 UTC.

0369122020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 12 mentions; 6 submissions, 6 comments20202021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 7 mentions; 0 submissions, 7 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 5 mentions; 0 submissions, 5 comments20232024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC1266
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC101
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC707
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC505
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC404
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC303
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC303

What Hacker News says

35 sources
Since your comment is flagged to death, I'll leave this here for a more hands on approach for interested people: https://interlisp.org/ is one of the systems which ran on these machines at the time. Due to the stars aligning right in a syzygy it is now available as open-source, updated to run on modern systems. Even in a browser, without installing it. Another one would be https://cuis.st/ which is the nearest Smalltalk-80 like thing available. Not as toyish as Squeak, not as bloated as Pharo. Or even more 'original': https://github.com/rochus-keller/Smalltalk
In Xerox invented the modern PC, then priced the Star at $16,595 (1981)
Rochus·Jul 26, 2026Recommendation phrase
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 (including Java); essentially all OO languages support late binding. 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 bit closer to "message passing" in that token streams were sent to an object for interpretation, but th
Read the rest
at 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/.
In A Love Letter to Object Orientation
> You can run Smalltalk on bare metal, if you want. Yes, if you provide the kernel, which implements all madatory primitives (i.e. system calls) required by the Smalltalk code to work. In the early Alto days, these were implemented in Alto microcode. The characterization of Smalltalk as "running on bare metal" oversimplifies the actual system architecture. In reality, the microcode implementation of the VM served as the effective operating system kernel; this microcode layer handled essential system functions including drive access and display buffer management; Smalltalk ran on top of this microcode layer, not directly on the hardware. Smalltalk is essentially the userland of an operating system, if we compare it to Unix; it's a more primitive system compared to Unix though, since the "kernel" only has one process, no process manager wit
Read the rest
h isolated processes and memory separation. I implemented some tools with which this can be easily studied (https://github.com/rochus-keller/Smalltalk/). > you can't change the semantics of what a file is without recompiling the filesystem module and forcing a reload Linux e.g. supports kernel modules which are loadable/replacable at runtime. And if you include the userland in the comparison (as the article does) there is nothing static at all. You can even run the Smalltalk VM (or any other dynamic language) in a Unix userland and have exactly the same modifiability as the article claims for Smalltalk. And a similar effect as claimed in the article can actually be achieved if you compile, run, modify and the run again a C program.
In Unix, Plan 9, and the lurking Smalltalk [pdf]
Thanks. I know SOM and Smalltalk pretty well and have implemented several VMs myself (see https://github.com/rochus-keller/Som/ and https://github.com/rochus-keller/Smalltalk/). SOM was originally designed and implemented by Bak and Lund at Aarhus university. It's very well suited for performance experiments and shares with Smalltalk the relevant features. There is an implementation of the Are-we-fast-yet suite for both SOM and Smalltalk.
In Smalltalk simplicity and consistency vs. other languages (2022) [video]
> Self wasn't sufficiently fast? Self apparently is sufficiently different from Smalltalk-80 so that even today JS engines (which are descendants of the Self engine) are still significanly faster than Cog/OpenSmalltalk. Remember that also Python is known to be pretty resistant to performance improvements. So some languages/VMs apparently are more amenable than others. In my referenced report you can see that there is still nearly a factor two between Pharo (using OpenSmalltalk) and Node.js (using V8). But Pharo is at least faster than LuaJIT, which again is about factor 220 faster than a Smalltalk interpreter which does the caching and inlining described in the Bluebook. So Cog/OpenSmalltalk went a long way to finally be the fastest Smalltalk engine around. A comparison with Smalltalk 72 makes little sense because it was a completely diff
Read the rest
erent language and engine. > Smalltalk-80 played tricks with inlining some block methods such as ifTrue: and whileTrue: That was just because a convention on lexical level made it possible. Otherwise it's very difficult because a block is just an object and executing it is just a method call on this object via dynamic dispatch; it's not trivial to find out what to inline. If you're interested in the machinery behind the scenes, here are a couple of tools which facilitate an analysis: https://github.com/rochus-keller/Smalltalk.
In Smalltalk simplicity and consistency vs. other languages (2022) [video]
Interesting talk. Smalltalk (like Lisp) has indeed a very simple (i.e. minimal) syntax. But that doesn't necessarily mean that it is also simple to write and read code, or to implement an efficient compiler. E.g. blocks - as great as they are - make inlining very difficult; it eventually took 30 years to implement a VM with decent performance (see http://software.rochus-keller.ch/are-we-fast-yet_crystal_lua... for the results of https://github.com/rochus-keller/Som/ and https://github.com/rochus-keller/Smalltalk/ compared to Cog/OpenSmalltalk). Another language explicitly designed for simplicity is e.g. Oberon, which is statically typed and easier to implement with decent performance. In my experience, at the end of the day, it's more the familiarity with a language that makes it seem "simple". And there is a trade-off between "simplicity
Read the rest
" of the language and "simplicity" of the solution; if the language is too minimal, the solution quickly becomes confusing instead, and vice versa.
In Smalltalk simplicity and consistency vs. other languages (2022) [video]
> Smalltalkish Have a look at the SOM dialect which is successfully used in education: http://som-st.github.io/ Here is an implementation in C++ which runs on LuaJIT: https://github.com/rochus-keller/Som/ > unfortunately out of print book Smalltalk 80: the language and its implementation is commonly recommended I assume you know this link: http://stephane.ducasse.free.fr/FreeBooks/BlueBook/Bluebook.... Here is an implementation in C++ and Lua: https://github.com/rochus-keller/Smalltalk
In Making Smalltalk on a Raspberry Pi (2020)
> Actually even ST-72 made synchronous calls I've not suggested it is anything but synchronous, so I don't know why you're bringing that up. It's not what we're talking about when we talk about "message passing" in this context. > In ST-76 and later versions "message passing" is just nomenclature used by the ST folks for something that is just ordinary method dispatch and call (if you have doubts, you can analyze the innards of the ST-80 VM yourself e.g. with these tools: https://github.com/rochus-keller/Smalltalk ). Sure, you can implement method dispatch the same way. I've written a (partial; unfinished; very buggy) Ruby compiler that allows dynamic method redefinition with even basic C++-style vtables. The point is not the dispatch method but the ability to override them at will. > The major difference is the dispatch based on signatur
Read the rest
e hash (similar to e.g. Java interface method calls) instead of static offsets, which enables late binding That late binding is an important part of it. But you don't even need to deviate from static offsets to enable that late binding (you do need to do so if you want the ability to do dynamic interface-based inheritance, but even then you can use a vtable-like approach - see e.g. Protocol Extension: A Technique for Structuring Large Extensible Software-Systems, M. Franz, 1995 - which adds dynamic inheritance at runtime to Oberon) as long as the dictionaries/vtables/whatever you look them up in are mutable.
In The seven programming ur-languages (2021)
> message passing and late binding combined. "Duck typing" is seriously diminishing it Actually even ST-72 made synchronous calls, but at least with a token stream interpreted by the receiving object (thus at least a bit of "message passing"). In ST-76 and later versions "message passing" is just nomenclature used by the ST folks for something that is just ordinary method dispatch and call (if you have doubts, you can analyze the innards of the ST-80 VM yourself e.g. with these tools: https://github.com/rochus-keller/Smalltalk ). The major difference is the dispatch based on signature hash (similar to e.g. Java interface method calls) instead of static offsets, which enables late binding (at the expense of performance); and since everything including ordinary integers derive from Object, all values and objects are subject to dynamic metho
Read the rest
d dispatch; it's no coincidence that Smalltalk was the first language to be associated with duck typing. The unification of scalar values and references, dynamic typing, and likewise the minimal syntax where control structures are implemented by means of runtime constructs were already known from Lisp; also closures (i.e. ST blocks) were already known before they were added to ST.
In The seven programming ur-languages (2021)

Showing the 15 most recent of 35 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.