¿Qué argumentos hay a favor del tipeo débil?

40

Esto surgió en una discusión con un amigo, y me encontré en apuros para pensar en algún buen argumento. ¿Qué beneficios confieren los tipos débiles?

Fishtoaster
fuente
17
Cooper and Torczon's Engineering a Compiler define la tipificación débil como el empleo de un sistema de tipos mal diseñado. Eso seguro no parece beneficiar a nadie.
Corbin marzo
@Corbin March: Bonito. Necesito agregar eso a mi lista.
Jörg W Mittag
55
El mejor argumento puede ser dada por los ejecutivos corporativos: me permite contratar a personas baratas de construir mis sistemas
Vector

Respuestas:

46

El problema con este tipo de discusión es simplemente que los términos "mecanografía débil" y "mecanografía fuerte" no están definidos, a diferencia de, por ejemplo, los términos "mecanografía estática", "mecanografía dinámica", "mecanografía explícita", "mecanografía implícita", " tipificación de pato "," tipificación estructural "o" tipificación nominal ". Diablos, incluso los términos "mecanografía manifiesta" y "mecanografía latente", que todavía son áreas abiertas de investigación y discusión, probablemente estén mejor definidos.

Por lo tanto, hasta que su amigo proporcione una definición del término "mecanografía débil" que sea lo suficientemente estable como para servir como base de una discusión, ni siquiera tiene sentido responder esta pregunta.

Desafortunadamente, aparte de la respuesta de Nick , ninguno de los que respondieron se molestó en proporcionar su definición tampoco, y puede ver la confusión que genera en algunos de los comentarios. Es difícil saberlo, ya que en realidad nadie proporciona sus definiciones, pero creo que cuento al menos tres diferentes, solo en esta misma página.

Algunas de las definiciones más comúnmente utilizados son (y sí, saben que casi ninguno de ellos tiene algún sentido, pero esas son las definiciones que he visto personas usan en realidad):

  • escritura débil = escritura insegura / escritura fuerte = escritura segura
  • escritura débil = escritura dinámica / escritura fuerte = escritura estática
  • mecanografía débil = mecanografía pato / mecanografía fuerte = mecanografía nominal
  • tipificación débil = tipificación estructural / tipificación fuerte = tipificación nominal
  • escritura débil = escritura implícita / escritura fuerte = escritura explícita
  • escritura débil = escritura latente / escritura fuerte = escritura manifiesta
  • escritura débil = sin escritura / escritura fuerte = escritura
  • escritura débil = conversiones implícitas / escritura fuerte = solo conversiones explícitas
  • escritura débil = lanzamientos implícitos o explícitos / escritura fuerte = sin lanzamientos
  • escritura débil = conversiones implícitas / escritura fuerte = solo conversiones explícitas
  • escritura débil = conversiones implícitas o explícitas / escritura fuerte = sin conversiones
  • escritura débil = interpretación / escritura fuerte = compilación
  • escritura débil = escritura lenta / fuerte = rápida
  • escritura débil = recolección de basura / escritura fuerte = administración manual de memoria
  • escritura débil = gestión de memoria manual / escritura fuerte = recolección de basura
  • … y muchos otros

Sin embargo, las tres definiciones que parecen usarse más ampliamente son

  • mecanografía débil = su estúpido lenguaje de programación horrible / mecanografía fuerte = mi lenguaje de programación súper increíble
  • escritura débil = cualquier otro lenguaje de programación / escritura fuerte = el único lenguaje de programación que alguna vez me molesté en aprender (generalmente Java, C # o C ++; curiosamente, las personas que aprenden, por ejemplo, Haskell o Scheme como su primer y único lenguaje, no parecen compartir esta cosmovisión)
  • escritura débil = todos los idiomas que no entiendo / escritura fuerte = Java (sustituya con C # o C ++ a voluntad)

A menos que todo el mundo está de acuerdo en una definición de lo "débil escribir" aún es , que ni siquiera tiene sentido pensar en cuáles podrían ser sus ventajas. ¿Ventajas de qué? Peor aún, si no hay una definición en absoluto , entonces todos pueden cambiar sus definiciones para que se ajusten a sus argumentos, y se garantiza que cada discusión se convertirá en una guerra de llamas.

Yo mismo he cambiado personalmente mi propia definición varias veces a lo largo de los años y ahora he llegado al punto en que ya ni siquiera considero que los términos sean útiles. También solía pensar que la escritura débil (en sus diversas definiciones) tiene un lugar en las secuencias de comandos de shell, pero cada vez que tengo que resolver el mismo problema en Bash y PowerShell, me recuerda dolorosamente lo equivocado que estaba.

Jörg W Mittag
fuente
55
¡Respuesta bastante cínica! Entiendo de dónde vienes, pero creo que es "lo suficientemente bueno" como para adivinar que cualquiera que no proporcione una definición se refiere a "escritura débil y / o dinámica", por eso incluí ambos en mi respuesta. Sé que no es perfecto, pero la mayoría de las personas parecen desconectarse cuando se trata de definir sistemas de tipos.
Nicole
77
@Renesis: lo llamaría "realismo" :-) He visto suficientes debates sobre los sistemas de tipos para darme cuenta de que la mitad de las personas no se dan cuenta de que están hablando de cosas completamente diferentes y la otra no sabe de qué están hablando. acerca en absoluto . Hace un par de meses, hubo una discusión sobre la lista central de desarrollo de un lenguaje que no nombraré, sobre agregar un sistema de tipos opcional para mejorar el rendimiento. Esa discusión continuó durante una semana, involucró a decenas de personas y cientos de correos. Nadie se dio cuenta de que un sistema de tipos opcional por definición no puede mejorar el rendimiento. …
Jörg W Mittag el
8
+1 para el cinismo! Puede agregar "escritura fuerte = cuando el IDE conoce los tipos de mis variables (Intellisense, etc.), escritura débil = cuando no lo hace)"
user281377
1
Los nombres mejor definidos para los sistemas de mecanografía carecen del juicio de valor implícito que tienen débiles y fuertes .
Eva
1
Magnífico, entretenido y preciso. Cuanto más aprendí sobre los sistemas de tipos, más me di cuenta de cuánto tiempo sufrí bajo la ilusión de que un idioma era diferente de otro en formas que simplemente no lo eran. Es sorprendente cuánta confusión causa este concepto, y realmente creo que no es necesario si solo aceptamos que débil / fuerte no es algo real, así que hablemos de algo que realmente es y tal vez aprendamos algo.
BrianH
25

Recuerde que hay dos conceptos principales que comúnmente se confunden:

Escritura dinámica

Se dice que un lenguaje de programación se tipea dinámicamente cuando la mayoría de su verificación de tipo se realiza en tiempo de ejecución en lugar de en tiempo de compilación. En la escritura dinámica, los valores tienen tipos pero las variables no; es decir, una variable puede referirse a un valor de cualquier tipo.

Las ventajas aquí a menudo se descartan solo para "nuevos" programadores, pero también pueden ser convenientes para cualquier programador:

if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever

Menos código en cualquier caso en el que de lo contrario tendría que emitir o asignar un nuevo valor:

if (data is Array)) {
    i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}

Mecanografía floja o débil

La escritura débil significa que un lenguaje convierte implícitamente (o emite) tipos cuando se usa.

Beneficios:

  • Pase cualquier valor de tipo como parámetro a una función . Útil para devoluciones de llamada, API flexibles y facilita la implementación de cierres.
  • Evaluación booleana implícita . Cualquier tipo puede evaluarse como booleano. Esto también tiene beneficios secundarios, como una parte de un ||puede usarse en la asignación sin conversión a booleano:

    var a = param || defaultValue;
    
  • De nuevo, menos código:

    var num = 5;
    var str = "Hello";
    input.innerHTML = input.value = num;
    for (var i=0; i < input.value; i++) { ... }
    

    Incluso Java tuvo que ir a la mitad, con la llamada implícita a .toString()cuando se combinan objetos con a String; de lo contrario, los programadores de Java lo maldecirían todo el día (las declaraciones de registro estarían fuera de control).


Ambas definiciones son de http://en.wikipedia.org/wiki/Type_system . Lo dijo mejor de lo que pude.

Nicole
fuente
1
La escritura dinámica también es beneficiosa cuando se requiere mucha generación de código en un lenguaje de escritura estática. Compare la cantidad de generación de código requerida para, por ejemplo, Entity Framework en C # con las bibliotecas ORM en lenguajes de tipo dinámico (PHP, Python, etc.). Aunque algunos pueden argumentar que los beneficios en términos de IDE IntelliSense superan el costo de toda esa generación de código ...
Dean Harding
3
Su comentario "// no i = ((Array) data) .length or Array myArr = (Array) data;" en realidad no tiene nada que ver con la escritura dinámica, porque la disposición de los datos es demostrable en tiempo de compilación. Un lenguaje de tipo estático podría propagar el conocimiento obtenido de la instancia de.
Peter Taylor
@ Peter Taylor, supongo que eso es cierto en casos simples, ¿sabes de alguno que lo haga? Tiene que ver con la escritura dinámica, ya sea que se use un ifbloque o alguna otra lógica más compleja (incluso en tiempo de ejecución o dinámica), la siguiente línea será legal y estará libre de errores.
Nicole
@Renesis, no, no. Pero la familia de idiomas ML está tipada estáticamente y utiliza la inferencia de tipos, por lo que rara vez tiene que indicar explícitamente el tipo de una variable.
Peter Taylor
1
@ Peter Taylor tiene razón. Muchos de los beneficios de la escritura dinámica están disponibles en idiomas con mejores sistemas de escritura estática, como Haskell, Scala o incluso C # en algunos casos. Diría que la principal ventaja del tipeo dinámico es tratar con cosas que son inherentemente sin tipo, como HTML DOM. ¿Por qué escribir node ["attr"] en lugar de node.attr? Siempre se resuelven en tiempo de ejecución de todos modos.
Matt Olenik
7

El argumento principal para escribir débilmente es uno de rendimiento. (Esto es para responder a la pregunta de los OP como se indicó). Hay mucha buena discusión sobre dinámica vs. estática, implícita vs. explícita. etc.

C es el lenguaje de escritura débil más famoso, y no realiza ninguna verificación de tiempo de ejecución o verificación de tiempo de compilación del tipo de variables. En esencia, puedes echar un char *a int *y al idioma no le importaría. Entonces, ¿por qué harías esto?

La programación en C es bastante parecida a la forma en que haría las cosas con el ensamblaje, por lo que hay momentos en los que solo le importa una dirección. No es raro emitir o pasar una void *referencia por esa misma razón. Si sabe cómo está organizada la memoria (una vez más una cuestión de C y ensamblaje), puede hacer algunos cálculos bastante buenos basados ​​en la dirección en la void *para obtener la información que necesita. Esto puede permitirle cortocircuitar el proceso por el que tendría que pasar en Java, por ejemplo.

Si bien la verificación de tipo en tiempo de ejecución no tiene una carga de trabajo extraordinaria, hay momentos en que es suficiente para hacer que una sección crítica sea demasiado lenta. Estoy pensando principalmente en la programación integrada y los sistemas de tiempo real en este caso.

Dicho esto, en la mayoría de los casos, tener un sistema de tipo fuerte que sea el tiempo de compilación verificado o el tiempo de ejecución verificado ayuda más a menudo de lo que duele.

Berin Loritsch
fuente
2
No veo por qué un lenguaje fuertemente tipado no puede compilarse tan eficientemente como C. Pero el compilador debería ser mucho más complejo.
9000
2
C ++ es un ejemplo de uno de esos lenguajes. En C ++, toda la verificación de tipo se realiza en tiempo de compilación, y ninguna se realiza en tiempo de ejecución ... A MENOS que tenga RTTI habilitado.
Berin Loritsch
2
No estoy seguro de estar de acuerdo con este argumento de rendimiento, pero es una vista interesante.
Martin Ba
2

La escritura débil suele ser más fácil de entender para los novatos, por ejemplo, en excel, javascript y vbscript. También intercambia cierta velocidad de desarrollo por posibles errores.

Buen artículo sobre el tema: mecanografía fuerte vs pruebas fuertes

Homde
fuente
1
No creo que haya una fuerte correspondencia entre los idiomas débilmente escritos y los idiomas amigables para los novatos. Ruby y Python están fuertemente tipados y generalmente se consideran amigables para los novatos. C tiene un tipo débil y generalmente se considera hostil como novato.
sepp2k
No, no el idioma en general, solo estaba hablando sobre la escritura
Homde
2
Dinámica y fuertemente tipada es la combinación amigable para novatos. Aunque he visto que cuando las personas pasan de un lenguaje de tipo estático a uno de tipo dinámico, también se confunden mucho. Sin embargo, nunca he visto a alguien que comenzó a escribir dinámicamente desde que las escuelas terminan enseñando C o Java primero la mayor parte del tiempo.
jsternberg
3
@Mchl: eso no tiene nada que ver con tipeo estático / dinámico o fuerte / débil. Tener que declarar tipos es sobre tipeo explícito / implícito.
Jörg W Mittag
1
Bien podría ser;) Así que pasé también del lenguaje tipado explícitamente al implícito. Corríjame si me equivoco. Pascal está tipado de forma estática, fuerte y explícita, mientras que PHP está tipeado de forma dinámica, débil e implícita, ¿no es así?
Mchl