Earlier quoted context omitted.
> If the symbols are "hard linked", it is not dynamic anymore. Lies, slander! ;-) Anything that happens within a function can be treated as a black box, and compiled down to the metal, if you like. The language can be as dynamic as you like; that doesn't preclude the output format from being tightly optimized machine code.
What about the things you pass into the function? You can't know their properties in advance, in general, or can you?
You can know that, e.g. a function passed in as an argument can be dereferenced as a pointer stored in a specific offset on the stack.
If your typechecks are compiler-generated statements inserted before a function call, then if you know at compile-time (via declarations or type inference, or type propagation) that a certain variable (to be passed as an argument) will always be of the correct type T, then you can omit the typecheck, as well as boxing/tagging.
You can get really close to the metal this way, and still have your language be as dynamic as can be.