Veo estos términos en todo el lugar en la programación y tengo una vaga noción de lo que significan. Una búsqueda me muestra que tales cosas se han preguntado en todo el desbordamiento de pila, de hecho. Por lo que sé, la escritura estática / dinámica en los idiomas es sutilmente diferente a la escritura fuerte / débil, pero esa diferencia se me escapa. Diferentes fuentes parecen usar diferentes significados o incluso usan los términos indistintamente. No puedo encontrar un lugar que hable sobre ambos y que realmente explique la diferencia. Lo que sería bueno es que alguien pueda explicar esto claramente aquí para mí y el resto del mundo.
319
Respuestas:
La escritura estática / dinámica se trata cuando se adquiere información de tipo (ya sea en tiempo de compilación o en tiempo de ejecución)
La escritura fuerte / débil trata de cómo se distinguen estrictamente los tipos (por ejemplo, si el idioma intenta hacer una conversión implícita de cadenas a números).
Consulte la página wiki para obtener información más detallada.
fuente
"12" + "34"
sería igual"46"
, pero"12" + "34Q"
sería igual"1234Q"
[afortunadamente, uno podría escribir"12" & "34"
si quisiera concatenación]. Curiosamente, las variables que contienen números los almacenaron como flotantes de doble precisión, y las matemáticas en tales variables usaron los valores de punto flotante sin mezcla de cadenas, pero no había forma de preguntar si una variable era una cadena o un número.Has descubierto un punto débil en la terminología que los aficionados usan para hablar sobre lenguajes de programación. No use los términos mecanografía "fuerte" y "débil" , porque no tienen un significado técnico universalmente acordado. Por el contrario, la escritura estática significa que los programas se verifican antes de ejecutarse , y un programa puede ser rechazado antes de que comience. La escritura dinámica significa que los tipos de valores se verifican durante la ejecución , y una operación mal escrita puede hacer que el programa se detenga o indique un error en el tiempo de ejecución . Una razón principal para la escritura estática es descartar programas que puedan tener tales "errores de tipo dinámico".
La tipificación fuerte generalmente significa que no hay lagunas en el sistema de tipos, mientras que la tipificación débil significa que el sistema de tipos puede subvertirse (invalidando cualquier garantía). Los términos a menudo se usan incorrectamente para significar tipeo estático y dinámico. Para ver la diferencia, piense en C: el lenguaje se verifica en el momento de la compilación (escritura estática), pero hay muchas lagunas; prácticamente puede emitir un valor de cualquier tipo a otro tipo del mismo tamaño, en particular, puede emitir tipos de puntero libremente. Pascal era un lenguaje que estaba destinado a ser fuertemente tipado, pero que tenía una escapatoria imprevista: un registro variante sin etiqueta.
Las implementaciones de lenguajes fuertemente tipados a menudo adquieren lagunas a lo largo del tiempo, generalmente para que parte del sistema de tiempo de ejecución se pueda implementar en el lenguaje de alto nivel. Por ejemplo, Objective Caml tiene una función llamada
Obj.magic
que tiene el efecto de tiempo de ejecución de simplemente devolver su argumento, pero en tiempo de compilación convierte un valor de cualquier tipo en uno de cualquier otro tipo. Mi ejemplo favorito es Modula-3, cuyos diseñadores llamaron a su construcción de fundición de tiposLOOPHOLE
.Dicho esto, no puede contar con dos personas que usen las palabras "fuerte" y "débil" exactamente de la misma manera. Así que evítalos.
fuente
En pocas palabras: en un lenguaje estáticamente escrito tipo estático , el tipo es estático , lo que significa que una vez que establece una variable en un tipo, NO PUEDE cambiarlo. Esto se debe a que la tipificación está asociada con la variable en lugar del valor al que se refiere.
Por ejemplo en Java:
Mientras que en un lenguaje de tipo dinámico, el tipo es dinámico , dinámico , lo que significa que después de establecer una variable en un tipo, PUEDE cambiarlo. Esto se debe a que la tipificación está asociada con el valor en lugar de la variable.
Por ejemplo en Python:
Por otro lado, el tipeo fuerte / débil en un idioma está relacionado con las conversiones de tipo implícito (en parte tomado de la respuesta de @ Dario):
Por ejemplo en Python:
mientras que en PHP:
La escritura estática permite verificar la corrección de tipo en tiempo de compilación. Los lenguajes tipados estáticamente generalmente se compilan, y los lenguajes tipados dinámicamente se interpretan. Por lo tanto, los idiomas escritos dinámicamente pueden verificar la escritura en tiempo de ejecución.
fuente
La escritura débil significa que el tipo de un objeto puede cambiar según el contexto. Por ejemplo, en un idioma de tipo débil, la cadena "123" puede tratarse como el número 123 si le agrega otro número. Ejemplos de lenguajes con mecanografía débil son bash, awk y PHP.
Otro tipo de lenguaje débilmente tipado es C, donde los datos en una dirección de memoria pueden tratarse como un tipo diferente mediante conversión.
En un lenguaje fuertemente tipado, el tipo de un objeto no cambia: un int siempre es un int y tratar de usarlo como una cadena dará como resultado un error. Tanto Java como Python están fuertemente tipados.
La diferencia entre la escritura dinámica y la estática es cuando se aplican las reglas de escritura. En un lenguaje de tipo estático, el tipo de cada variable y parámetro debe declararse en la fuente y se aplica en tiempo de compilación. En un lenguaje de tipo dinámico, los tipos solo se verifican cuando se usan en tiempo de ejecución. Por lo tanto, Java se escribe estáticamente y Python se escribe dinámicamente.
Sin embargo, los límites pueden ser un poco borrosos a veces. Por ejemplo, aunque Java está estáticamente tipado, cada vez que usa la reflexión o un yeso (por ejemplo, cuando usa contenedores de objetos), difiere la verificación de tipo al tiempo de ejecución.
Del mismo modo, los idiomas más fuertemente tipados se convertirán automáticamente entre enteros y flotantes (y en algunos idiomas, BigInts de precisión arbitraria).
fuente
f
toma el argumentox
(fun f(x)
) [** por lo que no se declaran tipos **] y el cuerpo de la función esx+1
. Sin tipos declarados, el compilador descubrirá quex
tiene que ser un int.- fun f x = x + 1;
val f = fn : int -> int
5 + 'c' // OK
Hoy, al investigar sobre este tema, me encontré con este gran artículo http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Aclaró un montón de cosas para mí y pensé que podría agregar a algunas de las excelentes respuestas anteriores.
Mecanografía fuerte y débil:
Tipos estáticos y dinámicos
Tipos explícitos / implícitos:
fuente
De Scott's Programming Language Pragmatics , tercera edición, página 291, tenemos
Entonces, en términos simples, la escritura estática / dinámica se refiere al momento en que ocurre la verificación de tipo: tiempo de compilación para la escritura estática y tiempo de ejecución para lenguajes dinámicos. Del mismo modo, la tipificación fuerte / débil se refiere a cuán agresivo es un lenguaje para hacer cumplir su sistema de tipos.
Intenté traducir la descripción de Scott en un bonito diagrama, que publiqué a continuación.
fuente
Creo que los otros colegas hicieron un buen trabajo especialmente. explicando la diferencia entre tipeo estático y dinámico. Pero en lo que respecta a la tipificación fuerte y débil, se debe decir que hay diferentes entendimientos / puntos de vista.
Aquí dos ejemplos:
Algunos dicen que Haskell está fuertemente tipado, porque no está permitido realizar conversiones de ningún tipo.
Otros (por ejemplo, el punto de vista de Dario) dicen que un lenguaje que permite convertir implícitamente una cadena a un número a propósito está tipeado débilmente, pero incluso otros lo llaman simplemente tipear pato.
Ambas declaraciones destacan no los extremos opuestos de un sistema de tipos, sino aspectos completamente diferentes. Así que me uno a la opinión del Sr. Ramsey de no usar los términos "fuerte" y "débil" para distinguir entre sistemas de tipos.
fuente
Lenguajes estáticamente v / s escritos dinámicamente
Lenguajes fuertemente t / v débilmente tipados
Buenas lecturas adicionales
fuente
Los lenguajes de tipo estático generalmente requieren que declare los tipos de variables, que luego se verifican en tiempo de compilación para reducir los errores. La palabra "estático" en "estáticamente tipado" se refiere al "análisis de código estático", que es el proceso de examinar el código antes de ejecutarlo. Aunque es posible que un lenguaje de tipo estático infiera el tipo de la variable desde el lado derecho de una expresión o parámetros reales, en la práctica la mayoría de los lenguajes de tipo estático requieren que los tipos de variables se declaren explícitamente.
Los lenguajes de tipo dinámico generalmente no requieren que las declaraciones de variables tengan tipos, e infieren tipos de variables basados en el tipo calculado como resultado de evaluar el lado derecho de cada declaración de asignación o los parámetros reales de una llamada a función. Dado que a la variable se le pueden asignar múltiples tareas durante su vida útil, su tipo puede cambiar con el tiempo y es por eso que se llama "tipeado dinámicamente". Además, el entorno de tiempo de ejecución necesita realizar un seguimiento del tipo actual para cada variable, por lo que el tipo está vinculado al valor en lugar de a la declaración de la variable. Esto puede considerarse un sistema de información de tipo de tiempo de ejecución (RTTI).
Se pueden combinar elementos de lenguajes tipados estática y dinámicamente. Por ejemplo, C # admite variables tipadas estáticamente y dinámicamente, y los lenguajes orientados a objetos generalmente admiten la conversión descendente de la jerarquía de tipos. Los lenguajes de tipo estático suelen proporcionar varias formas de evitar la verificación de tipos, por ejemplo, mediante el uso de la conversión, la reflexión y la invocación dinámica.
Typing Strong vs. Weak Typing se refiere a un continuo de cuánto intenta el lenguaje evitar errores debido al uso de una variable como si fuera un tipo cuando en realidad es otro tipo. Por ejemplo, tanto C como Java son lenguajes de tipo estático, sin embargo, Java utiliza una verificación de tipos mucho más fuerte que C. El siguiente código C se compila y ejecuta, y pondrá un valor aleatorio en la variable b en tiempo de ejecución, lo que probablemente causará un insecto:
El código Java equivalente producirá un error de compilación, que generalmente es preferible:
fuente