Las siguientes afirmaciones representan mi comprensión de los sistemas de tipo (que adolece de muy poca experiencia práctica fuera del mundo de Java); por favor corrija cualquier error.¿Es correcto mi entendimiento de los sistemas tipo?
La distinción estático/dinámico parece bastante clara:
- tipos estáticos langauges asignan cada variable, el campo y parámetro de un tipo y el compilador impide asignaciones entre tipos incompatibles. Ejemplos: C, Java, Pascal.
- Los idiomas de con dinamización dinámica tratan las variables como contenedores genéricos que pueden contener lo que desee; los tipos se comprueban (si es que lo hacen) solo en tiempo de ejecución cuando realiza operaciones en los valores, no cuando los asigna. Ejemplos: Smalltalk, Python, JavaScript.
- La inferencia tipo le permite a los lenguajes tipados estáticos (y tiene algunas de las ventajas de) escribirlos dinámicamente, deduciendo tipos del contexto para no tener que declararlos la mayoría de las veces, pero a diferencia en lenguajes dinámicos, no se puede, por ejemplo use una variable para mantener una cadena inicialmente y luego asigne un entero a ella. Ejemplos: Haskell, Scala
yo soy mucho menos seguro acerca de la distinción fuerte/débil, y sospecho que no está muy bien definido:
- fuertemente tipado idiomas asignan a cada valor de tiempo de ejecución de un tipo y solo permite que se realicen operaciones definidas para ese tipo; de lo contrario, existe un error de tipo explícito.
- Los idiomas débilmente tipados no tienen comprobaciones del tipo de tiempo de ejecución: si intenta realizar una operación con un valor que no admite, los resultados son impredecibles. En realidad, puede hacer algo útil, pero es más probable que obtenga datos corruptos, un bloqueo o algún error secundario indescifrable.
- Parece que hay al menos dos tipos diferentes de idiomas tipos débiles (o tal vez una serie continua):
- En C y ensamblador, los valores son básicamente cubos de bits, así que cualquier cosa es posible y si se obtiene el compilador para desreferenciar los primeros 4 bytes de una cadena terminada en nulo, es mejor que conduzca a un sitio que no contenga código de máquina legal.
- PHP y JavaScript generalmente también se consideran de tipo débil, pero no consideran que los valores sean cubos de bits opacos; Sin embargo, realizarán conversiones de tipo implícitas.
- Pero estas conversiones implícitas parecen aplicarse principalmente a las variables de cadena/entero/float: ¿eso realmente garantiza que la clasificación sea débilmente tipada? ¿O hay otros problemas donde el sistema de tipos de estos idiomas puede ofuscar errores?
Buena suerte. Nunca he encontrado una respuesta "buena" para las personas fuertes/débiles, solo una respuesta "lo suficientemente buena para salir adelante" de personas muy informadas. – wheaties