Something I've always thought would make this classic article better is a good old s/typed/type-checked/g
Both static and dynamic type-checking can be easily implemented for most programs in nearly every language.
Plenty of statically type-checked language implementations build in support for RTTI and runtime casts (dynamic type checks galore!). Plenty of language implementations that do pervasive dynamic type-checks have modules for accessing the AST (upon which you can perform static type-checks!).
It's not always easy to add sound static type-checking, for sure. In some language implementations it's impossible to implement dynamic type-checks that make any sense without major greenspunning (eg. Haskell and type erasure). But your language's native type system is not your program's destiny!
Both static and dynamic type-checking can be easily implemented for most programs in nearly every language.
Plenty of statically type-checked language implementations build in support for RTTI and runtime casts (dynamic type checks galore!). Plenty of language implementations that do pervasive dynamic type-checks have modules for accessing the AST (upon which you can perform static type-checks!).
It's not always easy to add sound static type-checking, for sure. In some language implementations it's impossible to implement dynamic type-checks that make any sense without major greenspunning (eg. Haskell and type erasure). But your language's native type system is not your program's destiny!