Estático/Dinámico vs Fuerte/Débil
-
23-09-2019 - |
Pregunta
Veo estos términos de boca en boca por todo el lugar en la programación y tengo una vaga noción de lo que significan.Una búsqueda que me demuestra que las cosas han sido frecuentes en todo el desbordamiento de pila en el hecho.Tan lejos como soy consciente de Estática/Dinámica escribir en idiomas es sutilmente diferente a Fuertes/Débiles de escribir, pero lo que la diferencia se me escapa.Diferentes fuentes parecen utilizar diferentes significados o incluso utilizar los términos indistintamente.No puedo encontrar en algún sitio que habla sobre ambos y realmente explica la diferencia.Lo que sería bueno es que si alguien puede por favor escribe esta claramente aquí para mí y para el resto del mundo.
Solución
-
Estático Dinámico Typing / se trata de cuando información de tipo se adquiere (ya sea en tiempo de compilación o en tiempo de ejecución)
-
Typing fuerte / débil se trata de cómo estrictamente tipos se distinguen (por ejemplo, si los intentos de lenguaje para hacer una conversión implícita de cadenas en números).
Otros consejos
Usted ha descubierto un punto débil en la terminología que los aficionados utilizan para hablar de lenguajes de programación.No utilizar los términos "fuertes" y "débiles" de escribir, debido a que no tienen un consenso universal en sentido técnico.Por el contrario, estáticos significa que los programas son comprueba antes de ser ejecutado, y un programa podría ser rechazado antes de que comience. Tipado dinámico significa que los tipos de los valores de se comprueban durante ejecución, y un mal escrito operación puede provocar que el programa de detener o de lo contrario la señal de un error en tiempo de ejecución.Una razón principal para la escritura estática es la regla de los programas que podrían haber dicho "dinámica de los errores de tipo".
Tipado fuerte generalmente significa que hay no hay escapatorias en el sistema de tipos, mientras que débil escribir significa que el tipo de sistema puede ser subvertido (invalidar cualquier garantía).Los términos se utilizan a menudo incorrectamente a la media de la estática y dinámica de escribir.Para ver la diferencia, pensar en C:el lenguaje es de tipo comprueban en tiempo de compilación (estáticos), pero hay un montón de lagunas;prácticamente se puede lanzar un valor de cualquier tipo a otro de la misma talla---en particular, puede convertir los tipos de puntero libremente.Pascal fue un lenguaje que estaba destinado a ser inflexible, pero la famosa frase tuvo un imprevisto laguna:una variante de registro con ninguna etiqueta.
Implementaciones de establecimiento inflexible de tipos de idiomas, a menudo adquieren las lagunas a lo largo del tiempo, por lo general por lo que parte del sistema de tiempo de ejecución puede ser implementado en el lenguaje de alto nivel.Por ejemplo, el Objetivo Caml tiene una función llamada Obj.magic
que tiene el efecto de volver a su argumento, pero en tiempo de compilación se convierte un valor de cualquier tipo de cualquier otro tipo.Mi ejemplo favorito es Modula-3, cuyos diseñadores, llamó a su tipo de fundición de la construcción LOOPHOLE
.
Habiendo dicho eso, no se puede contar con cualquiera de las dos personas el uso de las palabras "fuertes" y "débiles" exactamente de la misma manera.Así que evítalos.
En pocas palabras esta manera: en un lenguaje de tipos estáticos es el tipo estática , es decir, una vez que se establece una variable de un tipo, no puede cambiarlo. Esto es así porque la tipificación se asocia con la variable en lugar del valor que se refiere.
Por ejemplo en Java:
String str = "Hello"; //statically typed as string
str = 5; //would throw an error since java is statically typed
Mientras que en una lenguaje de tipos dinámicos es el tipo dinámico , es decir, después de configurar una variable de un tipo, puede cambiarlo. Esto se debe a la tipificación se asocia con el valor en lugar de la variable.
Por ejemplo en Python:
str = "Hello" # it is a string
str = 5 # now it is an integer; perfectly OK
Por otro lado, el tipado fuerte / débil en una lengua está relacionada con las conversiones de tipo implícitas (en parte tomados de la respuesta de Darío @):
Por ejemplo en Python:
str = 5 + "hello"
# would throw an error since it does not want to cast one type to the other implicitly.
mientras que en PHP:
$str = 5 + "hello"; // equals 5 because "hello" is implicitly casted to 0
// PHP is weakly typed, thus is a very forgiving language.
tipos estáticos permite chequear el tipo de corrección en tiempo de compilación. lenguajes con tipos estáticos generalmente se compilan y lenguajes de tipado dinámico se interpretan. Por lo tanto, los lenguajes dinámicamente escritos pueden comprobar escribiendo en tiempo de ejecución.
medios de tipificación débil que el tipo de un objeto puede cambiar dependiendo del contexto. Por ejemplo, en un lenguaje de tipos débiles de la cadena "123" puede ser tratado como el número 123 si se agrega otro número a la misma. Ejemplos de lenguajes con tipificación débil son bash, awk y PHP.
Otro tipo de lenguaje tipos débiles es C, donde los datos a una dirección de memoria pueden ser tratados como un tipo diferente por colada.
En un lenguaje fuertemente tipado el tipo de un objeto no cambia - un int es siempre un int y tratando de usarlo como una cadena dará lugar a un error. Java y Python son fuertemente tipados.
La diferencia entre dinámico y tipos estáticos es cuando se aplican las reglas de tipo. En un lenguaje de tipos estáticos del tipo de cada variable y parámetro debe ser declarado en la fuente y se hace cumplir en tiempo de compilación. En un lenguaje de tipos dinámicos los tipos sólo se verifican cuando se utilizan en tiempo de ejecución. Así Java está estático de tipos y Python se escribe de forma dinámica.
Sin embargo, los límites puede ser un poco borrosa a veces. Por ejemplo, aunque Java es de tipo estático, cada vez que utilice reflexión o un molde (por ejemplo, cuando el uso de contenedores de objetos) que le están aplazando la verificación de tipos de tiempo de ejecución.
Del mismo modo más fuertemente tipado idiomas todavía se convertirán automáticamente entre números enteros y flotadores (y en algunos idiomas BigInts precisión abitrary).
Hoy en día la investigación 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 Se aclaró muchas cosas para mí y pensé que puede agregar a algunos de los grandes respuestas anteriores.
tipado fuerte:
TiposProbablemente se clasifican los más modernos sistemas de correderas común es "fuerte" o "débil". Esto es lamentable, ya que estas palabras tienen casi ningún es decir, en absoluto. Es, en una medida limitada, es posible comparar dos idiomas con sistemas de tipo muy similares, y uno designado como teniendo el más fuerte de los dos sistemas. Más allá de eso, las palabras no significan nada en absoluto.
estáticas y dinámicas
Esto es muy cerca de la clasificación única común de los sistemas de tipos que tiene un significado real. Como cuestión de hecho, es de importancia es frecuentemente subestimado [...] dinámico y sistemas de tipo estático son dos cosas completamente diferentes, cuyos objetivos resultan parcialmente solapamiento.
sistema A de tipo estático es un mecanismo por el cual un compilador examina código fuente y asigna etiquetas (llamados "tipos") para piezas de la la sintaxis, y luego las utiliza para inferir algo acerca de los programas de comportamiento. Un sistema de tipo dinámico es un mecanismo por el que un compilador genera código para realizar un seguimiento del tipo de datos (casualmente, también llama su "tipo") utilizado por el programa. El uso de la misma palabra "Tipo" en cada uno de estos dos sistemas es, por supuesto, en realidad no del todo coincidente; sin embargo, se entiende mejor como tener una especie de débil significado historico. Gran confusión resulta de tratar de encontrar una visión del mundo en el que "tipo" en realidad significa lo mismo en ambos Los sistemas. No lo hace.
/ Tipos explícito lo implícito:
Cuando se utilizan estos términos, se refieren a la medida en que una compilador razón acerca de los tipos estáticos de partes de un programa. Todas lenguajes de programación tienen alguna forma de razonar acerca de los tipos. Algunos tienen más que otros. ML y Haskell tienen tipos implícitos, en el que ningún (O muy pocos, en función del idioma y las extensiones en uso) Tipo Se necesitan declaraciones. Java y Ada tienen tipos muy explícitas, y uno está constantemente declarando los tipos de cosas. Todo lo anterior tiene (Relativamente, en comparación con C y C ++, por ejemplo) fuerte tipo estático sistemas.
A partir de Scott Lenguaje de programación pragmática , tercera edición página 291, que tiene
La verificación de tipos es el proceso de asegurar que un programa obedece a la reglas de compatibilidad tipo de lenguaje. Una violación de las reglas es conocida como un choque tipo. Un lenguaje se dice que es inflexible de tipos si prohíbe, de manera que la implementación del lenguaje puede hacer cumplir, la aplicación de cualquier operación a cualquier objeto que no está destinado a apoyar esa operación. Un lenguaje se dice que es tipos estáticos si que es fuertemente tipado y la comprobación de tipos puede llevar a cabo en tiempo de compilación hora. En el sentido más estricto del término, son pocos idiomas estáticamente mecanografiado. En la práctica, los Termis aplican a menudo a los idiomas en los cuales más la comprobación de tipos puede llevar a cabo en tiempo de compilación, y el resto lata llevarse a cabo en tiempo de ejecución.
Unos pocos ejemplos: Ada es fuertemente tipado, y en su mayor parte estático de tipos (ciertas restricciones de tipo deben ser verificados durante la ejecución hora). Una aplicación Pascal también puede hacer la mayor parte de su comprobación de tipos en tiempo de compilación, no de que el lenguaje es bastante inflexible: registros variantes sin etiquetar (a ser discutidos en la Sección 7.3.4) son su única escapatoria. C89 es significativamente más inflexible que su dialectos predecesor, pero aún significativamente menos inflexible de tipos de Pascal. Sus lagunas incluyen sindicatos, un número variable subroutineswith de los parámetros, y la interoperabilidad de los apuntadores y arreglos (para ser discute en la Sección 7.7.1). Las implementaciones de C rara vez se compruebe nada en tiempo de ejecución.
Dynamic tipo (en tiempo de ejecución) de cheques es una forma de enlace tardío, y tiende que se encuentran en los idiomas que retrasan otras cuestiones hasta que el tiempo de ejecución como bien. Lisp y Smalltalk son dinámicamente (aunque fuertemente) mecanografiado. Más lenguajes de script también se escriben de forma dinámica; algunos (por ejemplo, Python y Rubí) están fuertemente tipado. Idiomas con el ámbito dinámico son generalmente tipos dinámicos (mecanografiado o no en todos): si el compilador no puede identificar el objeto al que se refiere un nombre, por lo general no puede determinar el tipo del objeto o bien.
Así que en términos simples, estático / tipado dinámico se refiere al momento en que se produce la verificación de tipos: tiempo de compilación para la tipificación estática, y tiempo de ejecución para lenguajes dinámicos. Del mismo modo, tipado fuerte / débil se refiere a qué tan agresivo es una lengua en la aplicación de su sistema de tipos.
He tratado de traducir la descripción de Scott en un diagrama agradable, que he publicado a continuación.
creo que los otros colegas hicieron un buen trabajo esp. explicar la diferencia entre estática y tipado dinámico. Pero en lo que se refiere a tipado fuerte, hay que decir que hay Las diferentes interpretaciones / puntos de vista.
Aquí dos ejemplos:
-
Algunos dicen que Haskell es fuertemente tipado, porque no se le permite hacer cualquier conversiones de tipos.
-
Otros (por ejemplo, de Dario vista) decir un lenguaje que permite convertir implícitamente de cadena en número a propósito tipos débiles, pero otros incluso llaman a esto el escribir solamente pato.
Las dos declaraciones no resaltar los extremos opuestos de un sistema de tipo, pero completamente diferentes aspectos. Así que me uno a la opinión del Sr. Ramsey no utilizar los términos "fuerte" y "débil" para distinguir entre los sistemas de tipo.
Estáticamente v/s dinámicamente tipado idiomas
- Los lenguajes con tipos estáticos son aquellos en los que la comprobación de tipos se realiza en tiempo de compilación, por lo que esto también significa que en los lenguajes con tipos estáticos cada variable tiene un tipo y no cambia durante el curso. Ahora, en cambio, dinámicamente tipado idiomas son aquellos en los que la comprobación de tipos se realiza en tiempo de ejecución, y no hay ningún tipo de comprobación en tiempo de compilación, por lo que esto también significa que en dinámicamente tipado de idiomas puede o puede no ser un tipo asociado con una de las variables, y si un tipo está asociado, entonces podría ser un tipo genérico como "var" en JS que poseen tanto una cadena y un número.
- "Las implementaciones de forma dinámica comprobados idiomas generalmente asociado a cada objeto en tiempo de ejecución con un tipo de etiqueta (es decir, una referencia a un tipo) que contiene su información de tipo.Esta información de tipo en tiempo de ejecución (RTTI) también puede ser utilizado para implementar la distribución dinámica de enlace, abajo, de fundición, de reflexión, y de características similares."
- Incluso si el lenguaje es de tipo estático, todavía podría haber algún dinámicamente tipado característica, lo que básicamente significa que algún tipo de comprobación de tipos en tiempo de ejecución.Esto es útil en la fundición de tipos.
- "Una serie de útiles y lenguaje de programación común de las características no se pueden comprobar de forma estática, como por ejemplo el de la fundición.Por lo tanto, muchos idiomas tienen tanto de tipo estático y dinámico de cheques;el tipo estático checker comprueba lo que puede, y la dinámica de los cheques de comprobar el resto."
- "Algunos lenguajes permiten escribir código que no es de tipo seguro.Por ejemplo, en C, los programadores pueden libremente lanzar un valor entre dos tipos que tienen el mismo tamaño."
- La ventaja de "estáticamente", escribió idiomas son los siguientes:
- Dado que la mayoría de la comprobación de tipos se realiza en tiempo de compilación para el intérprete o el tiempo de ejecución puede correr a toda velocidad, sin tener que preocuparse acerca de los tipos.
- Esto conduce a un menor número de excepción en tiempo de ejecución o errores relacionados con el tipo, debido a que la mayoría de la comprobación de tipos se realiza en tiempo de compilación.
- La ventaja de "dinámicamente", escribió idiomas son los siguientes:
- Ellos podrían ayudar en la extremadamente rápida creación de prototipos, ya que el desarrollador no necesita entender el tipo de sistema de modo dev libre puede crear variables y ejecutarlo, y esto conduce a la muy rápida creación de prototipos.
- Lista de estáticamente y dinámicamente tipado idiomas:
- Estática:
- Java
- C (C es un lenguaje de tipo estático, pero en menor "fuerte", escribió como en comparación con Java ya que permite que más conversiones implícitas)
- C++
- C#
- Dinámicamente:
- PERL
- PHP
- Python
- JavaScript
- Ruby
- Estática:
- La comprobación de tipos es una característica de seguridad importante. Supongamos, no hay ningún tipo de comprobación, y un método acepta un objeto de tipo "cuenta bancaria", que tiene un método denominado como "creditAccount(BankAccountDetails)", ahora en tiempo de ejecución si no hay ningún tipo de comprobación, a continuación, me puede pasar un objeto de mi propia clase que tiene el mismo método de "creditAccount(BankAccountDetails)" y se ejecuta, teniendo en cuenta que estamos hablando del lenguaje orientado a objetos debido a que soporta la programación orientada a objetos "polimorfismo" y aquí lo que estamos discutiendo no es sino "polimorfismo".Así que, básicamente, un lenguaje orientado a objetos (lo que básicamente significa que admite la "polimorfismo") que no tiene un tipo de comprobación puede llevar a problemas de seguridad.
Fuertemente v/s débilmente con idiomas
- Inflexible de idiomas son aquellos en los que las conversiones implícitas no son permitidas si hay pérdida de precisión.Por ejemplo, en Java, usted puede lanzar un "int a tiempo" porque no hay ninguna pérdida de precisión pero no puede "implícitamente" lanzar una "long int", porque sería una pérdida de precisión.En contraste, en débilmente con los idiomas, las conversiones implícitas se permitió incluso si hay una pérdida de precisión.
- Creo que la dinámica de lenguaje escrito también puede ser un lenguaje con establecimiento inflexible si "en tiempo de ejecución" no se permiten las conversiones implícitas en los que hay pérdida de precisión.
Buena más lecturas
tipos estáticos idiomas generalmente requiere la declaración de los tipos de variables, el cual se analiza a continuación, en tiempo de compilación para reducir los errores. La palabra "estático" en "estático de tipos" se refiere a "análisis de código estático", que es el proceso de examinar el código antes de ejecutar la misma. Aunque es posible que un lenguaje de tipos estáticos para inferir el tipo de la variable del lado derecho de una expresión o parámetros reales, en la práctica la mayoría estáticamente lenguajes de tipo requieren tipos de variables que se declare explícitamente.
tipos dinámicos idiomas en general, no requieren declaraciones de variables a tener tipos, y que inferir los tipos de variables en función del tipo calculado como resultado de la evaluación de la parte derecha de cada instrucción de asignación o de los parámetros reales a una llamada de función. Puesto que la variable se puede dar varias asignaciones durante su vida útil, su tipo puede cambiar con el tiempo y es por eso que se llama "tipos dinámicos". Además, el entorno de ejecución necesita para realizar un seguimiento del tipo de corriente para cada variable, por lo que el tipo está ligado al valor en lugar de con la declaración de variables. Esto se puede considerar un sistema (RTTI) información de tipo de tiempo de ejecución.
Elementos de lenguajes de tipo estática y dinámicamente se pueden combinar. Por ejemplo, C # soportes tanto estática como dinámicamente mecanografiadas variables y lenguajes orientados a objetos generalmente apoyan abajo de fundición a la jerarquía de tipos. lenguajes con tipos estáticos suelen proporcionar diversas maneras a la comprobación de tipos de derivación, por ejemplo mediante el uso de la fundición, la reflexión y la invocación dinámica.
fuerte contra Typing débil se refiere a un proceso continuo de hasta qué punto el lenguaje trata de evitar errores debido al uso de una variable como si se tratara de un tipo cuando en realidad es otro tipo. Por ejemplo, tanto C y Java son lenguajes de tipado estático, sin embargo Java utiliza mucho más fuerte que lo hace la comprobación de tipos C. El siguiente código C es feliz para compilar y ejecutar, y pondrá un valor aleatorio en la variable b en tiempo de ejecución, lo más probable causando una eRROR:
char *a = "123";
int b = (int)a;
El código Java equivalente producirá un error de compilación, que generalmente es preferible:
String a = "123"
int b = (int)a;