>... Smalltalk ... every IO and every message-based communication is non-blocking and async
Only if you explicitly make that particular IO or message send async.
"When a block receives value, it waits to return until all of its expressions have been executed. For example, the following expression does not produce a value until all three clocks have been completely displayed.
[EasternTime display.
MountainTime display.
PacificTime display] value
"
"When a block receives fork, it returns immediately, usually before its expressions have been executed.
[EasternTime display.
MountainTime display.
PacificTime display] fork
"
page 252 "Smalltalk-80: The language and its implementation." 1983
https://rmod-files.lille.inria.fr/FreeBooks/BlueBook/Blueboo...
~
Also 2019 "GildaVM: a Non-Blocking I/O Architecture for the Cog VM"
https://hal.science/hal-02379275