I had some knowledge of this stuff, but it wasn't really organized in my head (bet most of you feel the same). Today I found this on Lambda the Ultimate:
There are a lot of choices when designing a type system
Strong vs Weak Strong: Impossible to treat an object as an wrong type Weak: Possible to use improper operations on an object
Static vs Dynamic Static: The type of an expression is known at compile time. Dynamic: The type of an expression is only known at run time.
Explicit vs Implicit Explicit: All variables and functions are explicitly typed (also called Manifest typing) Implicit: The types of variables are implicit (also called Latent typing)
Many people argue ardently about this stuff while they don't really understand the terms. I paste it here just to remember it :-)