Básicamente, en lenguajes sin tipo, cada punto de referencia a un objeto que contiene tanto el tipo como el valor. Por ejemplo, var a = 3apunta a una instancia que contiene el valor 3 y el tipo int, si realiza a = "bla", la referencia se actualiza a una instancia que contiene la cadena "bla" y la cadena de tipo, el objeto antiguo se descarta, etc.
Esto es lento porque cada vez a + bque se debe realizar una operación (por ejemplo ) en este tipo básico, el tiempo de ejecución primero debe desreferenciar los objetos, verificar que su tipo sea compatible, realizar la operación, crear un nuevo objeto.
Por el contrario, a + ben C ++ o Java comprueba en tiempo de compilación que los tipos son válidos y compatibles, a y b se almacenan como valores inmediatos (no referencias), y la adición es una operación de procesador simple en estos valores.
Por supuesto, todo esto es muy teórico. En la práctica, se puede hacer mucha optimización en este proceso para evitar la mayor parte de la sobrecarga, y los lenguajes escritos dinámicamente pueden ser bastante rápidos.