DLL y archivos LIB: ¿qué y por qué?

Sé muy poco acerca de las DLL y las LIB además de que contienen el código vital requerido para que un programa se ejecute correctamente: bibliotecas. Pero, ¿por qué los compiladores los generan? ¿No sería más fácil incluir todo el código en un solo ejecutable? ¿Y cuál es la diferencia entre DLL y LIB?