Sistemas de tipos |
---|
Conceptos generales |
|
Categorías principales |
Categorías menores |
En programación informática , una de las muchas formas en que se clasifican coloquialmente los lenguajes de programación es si el sistema de tipos del lenguaje lo hace fuertemente tipado o débilmente tipado ( tipos flexibles ). Sin embargo, no existe una definición técnica precisa de lo que significan los términos y diferentes autores no están de acuerdo sobre el significado implícito de los términos y las clasificaciones relativas de la "fuerza" de los sistemas de tipos de los lenguajes de programación convencionales. [1] Por esta razón, los escritores que desean escribir de manera inequívoca sobre los sistemas de tipos a menudo evitan los términos "tipado fuerte" y "tipado débil" a favor de expresiones específicas como " seguridad de tipos ".
En general, un lenguaje fuertemente tipado tiene reglas de tipado más estrictas en tiempo de compilación , lo que implica que es más probable que se produzcan errores y excepciones durante la compilación. La mayoría de estas reglas afectan la asignación de variables, los valores de retorno de funciones, los argumentos de procedimientos y la llamada a funciones. Los lenguajes con tipado dinámico (donde la verificación de tipos se realiza en tiempo de ejecución ) también pueden tener tipado fuerte. En los lenguajes con tipado dinámico, los valores, en lugar de las variables, tienen tipos.
Un lenguaje débilmente tipado tiene reglas de tipado más laxas y puede producir resultados impredecibles o incluso erróneos o puede realizar una conversión de tipo implícita en tiempo de ejecución. [2] Un concepto diferente pero relacionado es el tipado latente .
En 1974, Barbara Liskov y Stephen Zilles definieron un lenguaje fuertemente tipado como aquel en el que "siempre que un objeto se pasa de una función que llama a una función llamada, su tipo debe ser compatible con el tipo declarado en la función llamada". [3] En 1977, K. Jackson escribió: "En un lenguaje fuertemente tipado, cada área de datos tendrá un tipo distinto y cada proceso establecerá sus requisitos de comunicación en términos de estos tipos". [4]
Se ha hecho referencia a varias decisiones de diseño de lenguajes diferentes como evidencia de tipado "fuerte" o "débil". Muchas de ellas se entienden con mayor precisión como la presencia o ausencia de seguridad de tipos , seguridad de memoria , verificación de tipos estática o verificación de tipos dinámica .
El "tipo fuerte" se refiere generalmente al uso de tipos de lenguajes de programación para capturar invariantes del código y garantizar su corrección, además de excluir definitivamente ciertas clases de errores de programación. Por lo tanto, existen muchas disciplinas de "tipo fuerte" que se utilizan para lograr estos objetivos.
Algunos lenguajes de programación facilitan el uso de un valor de un tipo como si fuera un valor de otro tipo. Esto a veces se describe como "tipificación débil".
Por ejemplo, Aahz Maruch observa que “ la coerción ocurre cuando se tiene un lenguaje con tipado estático y se utilizan las características sintácticas del lenguaje para forzar el uso de un tipo como si fuera un tipo diferente (considere el uso común de void* en C ). La coerción es usualmente un síntoma de tipado débil. La conversión, por otro lado, crea un objeto completamente nuevo del tipo apropiado”. [5]
Como otro ejemplo, GCC describe esto como un juego de palabras de tipos y advierte que romperá el alias estricto . Thiago Macieira analiza varios problemas que pueden surgir cuando el juego de palabras de tipos hace que el compilador realice optimizaciones inapropiadas . [6]
Existen muchos ejemplos de lenguajes que permiten conversiones de tipos implícitas , pero de una manera segura. Por ejemplo, tanto C++ como C# permiten que los programas definan operadores para convertir un valor de un tipo a otro con una semántica bien definida. Cuando un compilador de C++ encuentra una conversión de este tipo, trata la operación como si fuera una llamada a una función. Por el contrario, convertir un valor al tipo void* de C es una operación insegura que es invisible para el compilador.
Algunos lenguajes de programación exponen punteros como si fueran valores numéricos y permiten a los usuarios realizar operaciones aritméticas con ellos. A estos lenguajes se los suele denominar "de tipado débil", ya que la aritmética de punteros se puede utilizar para eludir el sistema de tipos del lenguaje.
Algunos lenguajes de programación admiten uniones sin etiquetas , que permiten ver un valor de un tipo como si fuera un valor de otro tipo.
En el artículo Typeful Programming de Luca Cardelli , [7] un "sistema de tipos fuerte" se describe como aquel en el que no existe posibilidad de un error de tipo en tiempo de ejecución no controlado. En otros escritos, la ausencia de errores de tipo en tiempo de ejecución no controlados se conoce como seguridad o seguridad de tipos ; los primeros artículos de Tony Hoare denominan a esta propiedad seguridad . [8]
Es posible que esta sección contenga investigaciones originales . ( Mayo de 2018 ) |
Esta sección necesita citas adicionales para su verificación . ( Mayo de 2020 ) |
Algunas de estas definiciones son contradictorias, otras son meramente independientes desde el punto de vista conceptual y otras son casos especiales (con restricciones adicionales) de otras definiciones más "liberales" (menos estrictas). Debido a la amplia divergencia entre estas definiciones, es posible defender afirmaciones sobre la mayoría de los lenguajes de programación de que están fuertemente o débilmente tipados. Por ejemplo:
{{cite web}}
: CS1 maint: bot: estado de URL original desconocido ( enlace )