Static typing checks types at compile time, while dynamic typing checks types at runtime. Compiled languages check types before execution, while interpreted languages check types during execution. Static typing catches errors earlier and can improve performance by allowing compiler optimizations, while dynamic typing is more flexible. The key difference is when type checking occurs, not whether a language is compiled or interpreted.