A distinction we will see throughout the term is between the following:
A statically typed language requires the programmer to declare
a type for each variable. The validity of a message passing expression
will be checked at compile time, based on the declared type of the
receiver.
A dynamically typed language associates types with values,
not with variables. A variable is just a name.
The legality of a message cannot be determined until run-time.
(There do exist statically typed languages that do not require the programmer
to write declaration statements, but no commonly used OO languages use
this approach.)