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.

¿Fue útil?

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).

Vea la wiki-página para obtener información más detallada.

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:

  

Probablemente 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.

Tipos

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.

La estático / dinámico - fuerte / débil Typing Plano

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
  • 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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top