Smalltalk was designed on top of the following features provided by the Virtual Machine
- Object allocation: The
#basicNew
and #basicNew:
primitives
- Automatic deallocation: The GC
- Message sends: The
send
family of bytecodes
- Blocks: The
[:arg | ...]
syntax (see below)
- Non-local returns: The
[:arg | ... ^result]
syntax
- Late binding: The method lookup mechanism
- Native code compilation: The interpreter (see below)
Modern implementations added
- Block Closures: Which replaced blocks
- Fast compilation: The JIT compiler, which replaced the interpreter
- Stack unwind: The
#ensure:
message
Note that other "features" such as the Smalltalk Compiler, the Debugger or the Exception mechanism are not in the list because they can be derived from others (i.e., they are implemented in user code.)
These features where identified as the fundamental building blocks for a general purpose Object Oriented environment meant to run on the bare metal (i.e. with no Operating System support.)
What the designers had in mind wasn't Functional Programming. Instead they had in mind the every thing is an object and every computation is a message send uniform metaphor. To this end, blocks and non-local returns played the role of modeling "functions" as objects too so to make sure that every known concept got included in the OO paradigm. This doesn't mean that they had functional programming as a goal. They didn't include other features (functional or not) because they were trying to identify a minimal set of primitive elements that would support a general purpose system with no hindrances.