En resumen: ¿cómo se clasifican los sistemas de tipos en contextos académicos; particularmente, ¿dónde puedo encontrar fuentes confiables que aclaren las distinciones entre los diferentes tipos de sistemas de tipos?
En cierto sentido, la dificultad con esta pregunta no es que no pueda encontrar una respuesta, sino que puedo encontrar demasiadas, y ninguna se destaca como correcta. El trasfondo es que estoy tratando de mejorar un artículo en el wiki de Haskell sobre mecanografía , que actualmente afirma las siguientes distinciones:
- Sin escribir: el idioma no tiene noción de tipos, o desde una perspectiva escrita: hay exactamente un tipo en el idioma. El lenguaje ensamblador solo tiene el tipo 'patrón de bits', Rexx y Tk solo tienen el tipo 'texto', el núcleo MatLab solo tiene el tipo 'matriz de valores complejos'.
- Escritura débil: solo hay unos pocos tipos distinguidos y quizás sinónimos de varios tipos. Por ejemplo, C usa números enteros para booleanos, enteros, caracteres, conjuntos de bits y enumeraciones.
- Tipografía fuerte: conjunto de tipos de grano fino como en Ada, idiomas wirthianos (Pascal, Modula-2), Eiffel
Esto es completamente contrario a mi percepción personal, que estaba más en la línea de:
- Escritura débil: los objetos tienen tipos, pero se convierten implícitamente a otros tipos cuando el contexto lo exige. Por ejemplo, Perl, PHP y JavaScript son todos los lenguajes en los que
"1"
se puede usar en más o menos cualquier contexto que se1
pueda. - Escritura fuerte: los objetos tienen tipos y no hay conversiones implícitas (aunque se puede utilizar una sobrecarga para simularlos), por lo que usar un objeto en el contexto incorrecto es un error. En Python, indexar una matriz con una cadena o flotante genera una excepción TypeError; en Haskell fallará en el momento de la compilación.
Pedí opiniones sobre esto a otras personas con más experiencia en el campo que yo, y uno dio esta caracterización:
- Escritura débil: realizar operaciones no válidas en los datos no se controla ni se rechaza, sino que simplemente produce resultados no válidos / arbitrarios.
- Escritura fuerte: las operaciones con datos solo se permiten si los datos son compatibles con la operación.
Según tengo entendido, la primera y la última caracterización llamarían a C débilmente tipado, la segunda lo llamaría fuertemente tipado. El primero y el segundo llamarían a Perl y PHP débilmente tipados, el tercero los llamaría fuertemente tipados. Los tres describirían Python como fuertemente tipado.
Creo que la mayoría de la gente me diría "bueno, no hay consenso, no hay un significado aceptado de los términos". Si esas personas están equivocadas, yo estaría feliz de oír hablar de eso, pero si están en lo cierto, entonces ¿ Cómo describo investigadores CS y comparar los sistemas de tipo? ¿Qué terminología puedo usar que sea menos problemática?
Como una pregunta relacionada, creo que la distinción dinámica / estática a menudo se da en términos de "tiempo de compilación" y "tiempo de ejecución", lo que me parece insatisfactorio dado que si un idioma se compila o no no es una propiedad de ese idioma como sus implementaciones. Siento que debería haber una descripción puramente semántica de la escritura dinámica versus la estática; algo parecido a "un lenguaje estático es aquel en el que se puede escribir cada subexpresión". Agradecería cualquier pensamiento, particularmente referencias, que aporten claridad a esta noción.