prototyping - pist - ¿Puede alguien decirme qué significa mecanografía fuerte y mecanografía débil y cuál es mejor?
lecciones de mecanografia (8)
Esa será la teoría de las respuestas atendidas, pero el lado de la práctica parece haberse descuidado ...
Escribir fuerte significa que no puede usar un tipo de variable donde se espera otro (o tiene restricciones para hacerlo). La mecanografía débil significa que puede mezclar diferentes tipos. En PHP, por ejemplo, puede mezclar números y cadenas y PHP no se quejará porque es un lenguaje de tipo débil.
$message = "You are visitor number ".$count;
Si fue fuertemente tipado, tendrías que convertir $ count de un entero a una cadena, generalmente con un casting:
$message = "you are visitor number ".(string)$count;
... o una función:
$message = "you are visitor number ".strval($count);
En cuanto a cuál es mejor, eso es subjetivo. Los defensores del tipado enérgico le dirán que lo ayudará a evitar errores o errores y a comunicar el propósito de una variable, etc. También le informarán que los defensores del tipado débil lo llamarán tipeado fuerte " innecesario ". pelusa del lenguaje que el sentido común deja sin sentido ", o algo similar. Como miembro portador de tarjetas del grupo de tipificación débil, tendría que decir que tienen mi número ... pero yo también tengo el suyo, y puedo ponerlo en una cadena :)
¿Puede alguien decirme qué significa mecanografía fuerte y mecanografía débil y cuál es mejor?
La "mecanografía fuerte" y su "tipado débil" opuesto tienen un significado bastante débil, en parte porque la noción de lo que se considera "fuerte" puede variar según a quién se lo pida. Por ejemplo, C ha sido llamado tanto "fuertemente tipado" como "débilmente tipado" por diferentes autores, realmente depende de con qué lo compare.
En general, un sistema de tipos debe considerarse más fuerte si puede expresar las mismas limitaciones que otro y más. Muy a menudo, dos sistemas de tipo no son comparables, sin embargo, uno podría tener características que el otro carece y viceversa. Cualquier discusión sobre fortalezas relativas depende del gusto personal.
Tener un sistema de tipo más fuerte significa que el compilador o el tiempo de ejecución generará más errores, lo que generalmente es bueno, aunque puede tener el costo de tener que proporcionar más información de tipo manualmente, lo que podría considerarse un esfuerzo que no vale la pena. Yo diría que el "tipado fuerte" generalmente es mejor, pero debe considerar el costo.
También es importante darse cuenta de que "fuertemente tipado" a menudo se usa incorrectamente en lugar de "tipado estáticamente" o incluso "tipado manifiesto". "Tipeado estáticamente" significa que hay comprobaciones de tipo en tiempo de compilación, "manifiesto escrito" significa que los tipos se declaran explícitamente. El tipado manifiesto es probablemente la forma más conocida de fortalecer un sistema de tipos (piense en Java), pero puede agregar fortaleza por otros medios, como la inferencia de tipos.
Me gustaría reiterar que la tipificación débil no es lo mismo que el tipado dinámico.
Este es un artículo bastante bien escrito sobre el tema y definitivamente recomendaría leerlo si no está seguro acerca de las diferencias entre los sistemas de tipo fuerte, débil, estático y dinámico. Detalla las diferencias mucho mejor de lo que se puede esperar en una respuesta corta, y tiene algunos ejemplos muy esclarecedores.
La mecanografía débil significa que no se especifica qué tipo es una variable, y la tipificación fuerte significa que se da un tipo estricto a cada variable.
Cada uno tiene sus ventajas, con tipeo débil (o tipeo dinámico, como a menudo se lo llama), siendo más flexible y requiriendo menos código del programador. La tipificación fuerte, por otro lado, requiere más trabajo del desarrollador, pero a cambio puede alertarlo de muchos errores al compilar su código, antes de ejecutarlo. La tipificación dinámica puede retrasar el descubrimiento de estos problemas simples hasta que se ejecute el código.
Dependiendo de la tarea en cuestión, la tipificación débil puede ser mejor que la tipificación fuerte, o viceversa, pero es principalmente una cuestión de gusto. La tipificación débil se usa comúnmente en los lenguajes de scripting, mientras que la tipificación fuerte se usa en la mayoría de los lenguajes compilados.
Este artículo es una gran lectura: http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Me aclararon muchas cosas cuando investigaba tratando de responder una pregunta similar, espero que a otros también les resulte útil.
Mecanografía fuerte y débil:
Probablemente la forma más común en que se clasifican los sistemas de tipo es "fuerte" o "débil". Esto es desafortunado, ya que estas palabras casi no tienen ningún significado en absoluto. Es, en cierta medida, posible comparar dos idiomas con sistemas de tipos muy similares, y designar a uno que tenga el más fuerte de esos dos sistemas. Más allá de eso, las palabras no significan nada en absoluto.
Estática y Tipos Dinámicos
Esta es casi la única clasificación común de sistemas de tipo que tiene un significado real. De hecho, su importancia es frecuentemente subestimada [...] Los sistemas de tipo dinámico y estático son dos cosas completamente diferentes, cuyos objetivos se superponen parcialmente.
Un sistema de tipo estático es un mecanismo mediante el cual un compilador examina el código fuente y asigna etiquetas (llamadas "tipos") a piezas de la sintaxis, y luego las usa para inferir algo sobre el comportamiento del programa. Un sistema de tipo dinámico es un mecanismo mediante el cual un compilador genera código para realizar un seguimiento del tipo de datos (casualmente, también llamado su "tipo") utilizado por el programa. El uso de la misma palabra "tipo" en cada uno de estos dos sistemas no es, por supuesto, completamente coincidente; sin embargo, se entiende mejor como una especie de significado histórico débil. Se produce una gran confusión al tratar de encontrar una visión del mundo en la que "tipo" realmente signifique lo mismo en ambos sistemas. No es así
Tipos explícitos / implícitos:
Cuando se usan estos términos, se refieren a la medida en que un compilador razonará sobre los tipos estáticos de partes de un programa. Todos los lenguajes de programación tienen algún tipo de razonamiento sobre los tipos. Algunos tienen más que otros. ML y Haskell tienen tipos implícitos, ya que no se necesitan declaraciones de tipo (o muy pocas, según el idioma y las extensiones en uso). Java y Ada tienen tipos muy explícitos, y uno declara constantemente los tipos de cosas. Todo lo anterior tiene (relativamente, en comparación con C y C ++, por ejemplo) sistemas fuertes de tipo estático.
La tipificación fuerte es el modelo de tipo más común en los lenguajes de programación modernos. Esos idiomas tienen una característica simple: conocer los valores de tipo en el tiempo de ejecución. Podemos decir que los lenguajes fuertes mecanografiados evitan las operaciones de mezcla entre dos o más tipos diferentes de tipos. Aquí hay un ejemplo en Java:
String foo = "Hello, world!";
Object obj = foo;
String bar = (String) obj;
Date baz = (Date) obj; // This line will throw an error
El ejemplo anterior funcionará perfectamente hasta que el programa llegue a la última línea de código donde se lanzará la ClassCastException porque Java es un lenguaje de programación fuertemente tipado.
Cuando hablamos de lenguajes de tipo débil , Perl es uno de ellos. El siguiente ejemplo muestra cómo Perl no tiene ningún problema para mezclar dos tipos diferentes.
$a = 10;
$b = "a";
$c = $a . $b;
print $c; # returns 10a
Espero que encuentres esto útil,
Gracias.
La tipificación fuerte / débil en un idioma está relacionada con la facilidad con la que puede realizar conversiones de tipo:
Por ejemplo en Python:
str = 5 + ''a''
# would throw an error since it does not want to cast one type to the other implicitly.
Donde como en lenguaje C:
int a = 5;
a = 5 + ''c'';
/* is fine, because C treats ''c'' as an integer in this case */
Por lo tanto, Python es más fuertemente tipado que C (desde esta perspectiva).
Puede ser que esto te ayude a entender la escritura fuerte y débil .......
Tipificación fuerte: verifica el tipo de variables lo antes posible, generalmente en tiempo de compilación. Evita operaciones de mezcla entre tipos no coincidentes.
Un lenguaje de programación fuerte es uno en el que:
- Todas las variables (o tipos de datos) son conocidas en tiempo de compilación
- Hay una aplicación estricta de las reglas de tipeo (no se puede usar una Cadena donde se esperaría un Entero)
- Todas las excepciones a las reglas de tipeo resultan en un error de tiempo de compilación
Escritura débil: mientras que la tipificación débil retrasa la verificación de los tipos del sistema lo más tarde posible, generalmente en tiempo de ejecución. En esto puedes mezclar tipos sin una conversión explícita.
Un lenguaje de programación "de tipo débil" es simplemente uno que no es de tipo fuerte.
que se prefiere depende de lo que quieras. en el caso de los scripts y las cosas buenas, normalmente querrá escribir débilmente, porque quiere escribir la menor cantidad de código posible. en los programas grandes, la tipificación fuerte puede reducir los errores en el momento de la compilación.