Tools shape thought. Many at Smalltalk Superpowers pointed out that
adding static tools to dynamic languages discourages people from
writing very dynamic programs. We think twice before using
messageNotUnderstood:, because our tools are confused by
use SLIME for debugging code that was CPS-converted by macros. These
tools are a mixed blessing.
Dynamic is cool. Smalltalk and Forth execute by direct operations on simple first-class objects (program counter, stack, etc). You can dynamically manipulate those objects in simple ways to do useful things: call/cc (copy a sequence activation records), tail-call optimization (drop one record), exceptions (drop them until you find a handler), for example. This really feels easy compared with program transformation approaches like CPS-conversion. Compilers are hard but stacks and program counters are easy.
I wonder what the most late-bound programming environment is today? Please tell me if you know.