¿Qué argumentos hay a favor de la escritura débil?

39

Esto surgió en una discusión con un amigo, y me encontré con dificultad para pensar en cualquier argumento bueno. ¿Qué beneficios confiere la escritura débil?

    
pregunta Fishtoaster 19.01.2011 - 05:55

4 respuestas

47

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

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

Desafortunadamente, aparte de la respuesta de Nick , ninguno de los respondedores se molestó en proporcionar su definición, y usted puede Ver la confusión que genera en algunos de los comentarios. Es difícil decirlo, 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 utilizadas son (y sí, que casi ninguna de ellas tiene sentido, pero esas son las definiciones que la gente realmente usa):

  • escritura débil = escritura insegura / escritura fuerte = escritura segura
  • escritura débil = escritura dinámica / escritura fuerte = escritura estática
  • escritura débil = escritura de pato / escritura fuerte = escritura nominal
  • escritura débil = escritura estructural / escritura fuerte = escritura nominal
  • escritura débil = escritura implícita / escritura fuerte = escritura explícita
  • escritura débil = escritura latente / escritura fuerte = escritura de manifiesto
  • escritura débil = sin escritura / escritura fuerte = escritura
  • tipificación débil = conversiones implícitas / tipificación fuerte = solo conversiones explícitas
  • escritura débil = conversiones implícitas o explícitas / escritura fuerte = sin conversiones en absoluto
  • 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 en absoluto
  • escritura débil = interpretación / escritura fuerte = compilación
  • escritura débil = lenta / fuerte escribiendo = rápida
  • escritura débil = recolección de basura / escritura fuerte = administración de memoria manual
  • escritura débil = administración de memoria manual / escritura fuerte = recolección de basura
  • ... y muchos otros

Sin embargo, las tres definiciones que parecen ser utilizadas la mayoría ampliamente son

  • escritura débil = tu estúpido lenguaje de programación de mierda / escritura fuerte = mi lenguaje de programación súper impresionante
  • escritura débil = cualquier otro lenguaje de programación / escritura fuerte = el único lenguaje de programación que alguna vez me tomé la molestia de aprender (generalmente Java, C # o C ++; extrañamente, las personas que aprenden, por ejemplo, Haskell o Scheme como su primer y único idioma, no parecen compartir esta cosmovisión)
  • escritura débil = todos los idiomas que no entiendo / escritura fuerte = Java (sustituye con C # o C ++ a voluntad)

A menos que todos estén de acuerdo con una definición de lo que es "tipificación débil", incluso es , ni siquiera tiene sentido pensar en cuáles podrían ser sus ventajas. ¿Ventajas de qué? Lo que es peor, si no hay una definición en absoluto , entonces todos pueden cambiar sus definiciones para que se ajusten a sus argumentos, y está garantizado que cada discusión se convertirá en una llama flamígera.

Yo mismo personalmente he cambiado mi propia definición varias veces a lo largo de los años y ahora he llegado al punto en que ya no 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 el shell scripting, pero siempre que tengo que resolver el mismo problema en Bash y PowerShell, me recuerdan dolorosamente lo equivocado que estaba.

    
respondido por el Jörg W Mittag 19.01.2011 - 21:49
25

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

Escritura dinámica

  

Se dice que un lenguaje de programación se escribe dinámicamente cuando la mayoría de sus verificaciones de tipos se realizan en tiempo de ejecución y no en tiempo de compilación. En la tipificación 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 como solo para programadores "nuevos", 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 otro modo tendrías que emitir o asignar un nuevo valor:

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

Escritura floja o débil

  

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

Beneficios:

  • Pase cualquier valor de tipo como parámetro a una función . Es útil para devoluciones de llamadas, API flexibles y facilita la implementación de cierres.
  • Evaluación booleana implícita . Cualquier tipo puede ser evaluado como un booleano. Esto también tiene beneficios secundarios, ya que una parte de un || se puede usar en la asignación sin conversión a booleano:

    var a = param || defaultValue;
    
  • Nuevamente, 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 un String ; de lo contrario, los programadores de Java lo estarían maldiciendo todo el día (las declaraciones de registro estarían fuera de control).

Ambas definiciones son de enlace . Lo dijo mejor que yo.

    
respondido por el Nicole 19.01.2011 - 06:45
6

El argumento principal para escritura débil es uno de rendimiento. (Esto es para responder a la pregunta de OP como se indica). Hay mucha buena discusión acerca de dinámico frente a estático, implícito frente a explícito. etc.

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

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

Si bien la verificación de tipos en tiempo de ejecución no tiene una sobrecarga extraordinaria, hay ocasiones 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 en tiempo real en este caso.

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

    
respondido por el Berin Loritsch 19.01.2011 - 22:07
2

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

Buen artículo sobre el tema: Tipo fuerte vs Prueba fuerte

    
respondido por el Homde 19.01.2011 - 06:00

Lea otras preguntas en las etiquetas