2009-06-09 18 views

Respuesta

25

No, no necesariamente, aunque depende de su definición de los términos, y no hay definiciones muy claras y ampliamente aceptadas.

Por ejemplo, los lenguajes de programación dinámicos a menudo son seguros, pero no fuertemente tipados. En otras palabras, no hay información de tipo de tiempo de compilación que determine qué puede y qué no puede hacer con un tipo, pero en tiempo de ejecución, el tiempo de ejecución se asegura de que no utilice un tipo como si fuera otro.

Por ejemplo, en C# 4.0, que puede hacer:

dynamic foo = "hello"; 
dynamic length = foo.Length; // Uses String.Length at execution time 
foo = new int[] { 10, 20, 30 }; 
length = foo.Length; // Uses Array.Length at execution time 
dynamic bar = (FileStream) foo; // Fails! 

La última línea es la clave para que sea de tipo seguro: no hay una segura conversión de una matriz int a un FileStream, por lo que la operación falla - en lugar de tratar los bytes del objeto de matriz como si fuera un FileStream.

EDITAR: C# normalmente está "fuertemente tipado" (como idioma) y tipo seguro: el compilador no le permitirá intentar realizar llamadas arbitrarias sobre un objeto, y el tiempo de ejecución no le permitirá realizar conversiones inapropiadas .

No estoy del todo seguro de dónde encaja el código no seguro - No sé lo suficiente sobre él para comentar, me temo.

La tipificación dinámica en C# 4 permite un código débilmente tipeado pero seguro a la hora de escribir, como se muestra arriba.

Tenga en cuenta que foreach realiza una conversión implícita, por lo que es una especie de híbrido:

ArrayList list = new ArrayList(); 
list.Add("foo"); 

foreach (FileStream stream in list) 
{ 
    ... 
} 

Esto compilará (había another question en este recientemente), pero se producirá un error en tiempo de ejecución. Irónicamente, eso se debe a que está tratando de a escribir fuertemente con respecto a la variable stream, lo que significa que debe realizar un molde sobre el resultado del iterador.

+0

Jon, ¿puedes definir/explicar un poco (si tienes tiempo) con respecto a C#. – Wondering

+0

Hm, parece que su definición de "seguro para tipos" simplemente significa que el motor de ejecución no accederá a un dato pensando que es del tipo incorrecto. Estoy sorprendido de esto, porque según esa definición, los genéricos C# no agregan ningún tipo de seguridad en comparación con el uso de ArrayList no genérico, por ejemplo. ¿Diría que los genéricos son solo un ejemplo de tipeo fuerte, pero no de seguridad? – Timwi

+0

@Timwi: CLR proporciona el tipo de seguridad en ambos casos, pero puede verlo en un nivel superior: si tengo que emitir los resultados de extraer un valor de un 'ArrayList', ese molde puede fallar. Fallará de una manera bastante segura, pero el acto de "obtener valor de cadena de la lista" es aún más arriesgado de lo que sería con una 'Lista '. –

1

"Tipo seguro" significa que no hay conversión y que no se pueden producir errores de tipo de tiempo de ejecución.

Algunas personas argumentan que "Fuertemente tipado" no significa nada, o "es bueno", o "me siento cómodo con eso".

De todos modos, "Tipo seguro" se refiere a una parte del código o API, cuando "Fuertemente tipado" se refiere a todo un idioma o plataforma.

+0

En realidad, el tipo de seguridad no implica que la verificación de tipos se realice en tiempo de compilación. Siempre y cuando se realice * en algún lugar *, entonces todo está bien. – Noldorin

3

Buena pregunta. Leer this entrada de la Wikipedia, he aquí un extracto:

Benjamin C. Pierce, autor de Tipos y lenguajes de programación avanzada y Tipos y lenguajes de programación, dice, "Me pasó un par de semanas ... tratando de ordenar a cabo la terminología de "totalmente en con tipo," "tipos estáticos", "seguro", etc., y lo encontraron sorprendentemente difícil .... el uso de estos términos es tan variada como para hacerlos casi inútil ."

0

Ellos son el básicamente mismo, es sólo una cuestión de interpretación:

de Wikipedia:

Type safety:

Seguridad de tipos es sinónimo de una de las muchas definiciones de tipificación fuerte, pero la seguridad de tipo y la tipificación dinámica son mutuamente compatibles. Un lenguaje de tipado dinámico como Smalltalk puede verse como un lenguaje fuertemente tipado con un sistema de tipo muy permisivo donde cualquier sintactica lly programa correcto está bien tipado; siempre y cuando su semántica dinámica asegure que ningún programa de este tipo "va mal" en un sentido apropiado, cumple con la definición anterior y se puede llamar seguro de tipo.

0

ype safe significa impedir que los programas accedan a la memoria fuera de los límites de las propiedades públicas de un objeto. Cuando el código no es seguro para tipos, pueden ocurrir efectos secundarios no deseados. La seguridad de tipo es importante para el aislamiento del ensamblaje y la aplicación de la seguridad. Cuando el código es seguro para tipos, el tiempo de ejecución de lenguaje común puede aislar por completo los ensamblados

Cuestiones relacionadas