Tweeter original aquí. :)
En primer lugar, ¡estoy algo divertido / sorprendido de que mi tweet se tome tan en serio! Si hubiera sabido que iba a ser tan ampliamente difundido, ¡habría pasado más de 30 segundos escribiéndolo!
Thiago Silva tiene razón al señalar que "estático" y "dinámico" describen con mayor precisión la verificación de tipos , en lugar de los sistemas de tipos . De hecho, tampoco es realmente exacto decir que un idioma está tipeado estática o dinámicamente. Por el contrario, un lenguaje tiene un sistema de tipos, y una implementación de ese lenguaje podría imponer el sistema de tipos mediante la verificación estática, o la verificación dinámica, o ambas, o ninguna (¡aunque eso no sería una implementación de lenguaje muy atractiva!).
Como sucede, hay ciertos sistemas de tipos (o características de los sistemas de tipos) que son más susceptibles a la verificación estática, y hay ciertos sistemas de tipos (o características de los sistemas de tipos) que son más susceptibles a la verificación dinámica. Por ejemplo, si su idioma le permite especificar en el texto de un programa que un valor particular siempre debe ser una matriz de enteros, entonces es razonablemente sencillo escribir un verificador estático para verificar esa propiedad. Por el contrario, si su idioma tiene subtipos, y si permite el downcasting, entonces es razonablemente sencillo verificar la validez de un downcast en tiempo de ejecución, pero es extremadamente difícil hacerlo en tiempo de compilación.
Lo que realmente quise decir con mi tweet es simplemente que la gran mayoría de las implementaciones de lenguaje realizan una cierta cantidad de verificación de tipo dinámico. O, de manera equivalente, la gran mayoría de los idiomas tienen algunas características que son difíciles (si no imposibles) de verificar estáticamente. Downcasting es un ejemplo. Otros ejemplos incluyen desbordamiento aritmético, verificación de límites de matriz y verificación nula. Algunos de estos pueden verificarse estáticamente en algunas circunstancias, pero en general, sería difícil encontrar una implementación de lenguaje que no haga ninguna verificación en tiempo de ejecución.
Esto no es algo malo. Es solo una observación de que hay muchas propiedades interesantes que nos gustaría que nuestros idiomas aplicaran, y que realmente no sabemos cómo verificar estáticamente. Y es un recordatorio de que las distinciones como "tipos estáticos" versus "tipos dinámicos" no son tan claras como algunas personas quisieran hacer creer. :)
Una nota final: los términos "fuerte" y "débil" no se usan realmente en la comunidad de investigación del lenguaje de programación, y realmente no tienen un significado consistente. En general, descubrí que cuando alguien dice que un idioma tiene "mecanografía fuerte" y otro idioma tiene "mecanografía débil", realmente está diciendo que su idioma favorito (el que tiene "mecanografía fuerte") les impide cometiendo un error que el otro idioma (el que tiene "mecanografía débil") no lo hace, o por el contrario, que su idioma favorito (el que tiene "mecanografía débil") les permite hacer algo interesante que el otro idioma (el uno con "mecanografía fuerte") no.