If memory serves me, there are also cases where information available at run-time can allow better optimizations than could normally be done at compile-time--I think the JVM has some tricks along those lines for JITing bytecode into native instructions, but I suppose the same principle could apply elsewhere.