En programación de computadoras , una de las muchas formas en que los lenguajes de programación se clasifican coloquialmente es si el sistema de tipos del lenguaje lo hace fuertemente tipado o débilmente tipado ( tipo flexible ). 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 principales lenguajes de programación. [1] Por esta razón, los escritores que desean escribir sin ambigüedades sobre sistemas de tipos a menudo evitan los términos "tipificación fuerte" y "tipificación débil" en favor de expresiones específicas como " seguridad de tipos ".
Generalmente, un lenguaje fuertemente tipado tiene reglas de escritura más estrictas en el momento de la 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 las llamadas a funciones. Los lenguajes tipados dinámicamente (donde la verificación de tipos ocurre en tiempo de ejecución ) también se pueden tipificar fuertemente. En los lenguajes de tipado dinámico, los valores, en lugar de las variables, tienen tipos.
Un lenguaje de tipo débil tiene reglas de escritura más flexibles 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 de tipificación latente .
En 1974, Barbara Liskov y Stephen Zilles definieron un lenguaje fuertemente tipado como aquel en el que "cada vez que un objeto 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 indicará sus requisitos de comunicación en términos de estos tipos". [4]
Se ha hecho referencia a varias decisiones diferentes de diseño de lenguaje como evidencia de tipificación "fuerte" o "débil". Muchos de estos 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 .
"Tipo fuerte" generalmente se refiere al uso de tipos de lenguajes de programación para capturar invariantes del código y garantizar su corrección, y definitivamente excluir ciertas clases de errores de programación. Por lo tanto, existen muchas disciplinas de "tipificación 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 tienes un lenguaje escrito estáticamente y usas las características sintácticas del lenguaje para forzar el uso de un tipo como si fuera un tipo diferente (considera el uso común de void* en C ). La coerción suele ser un síntoma de tipificación débil, por otro lado, la conversión crea un objeto nuevo del tipo apropiado". [5]
Como otro ejemplo, GCC describe esto como un juego de palabras y advierte que romperá el alias estricto . Thiago Macieira analiza varios problemas que pueden surgir cuando los juegos de palabras hacen que el compilador realice optimizaciones inapropiadas . [6]
Hay muchos ejemplos de lenguajes que permiten conversiones de tipos implícitas , pero de forma 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 tal conversión, trata la operación como una llamada a función. Por el contrario, convertir un valor al tipo C void* 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. Estos lenguajes a veces se denominan "débilmente tipificados", ya que la aritmética de punteros se puede utilizar para evitar el sistema de tipos del lenguaje.
Algunos lenguajes de programación admiten uniones sin etiquetar , 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 fuertes" se describe como aquel en el que no hay posibilidad de que se produzca un error de tipo en tiempo de ejecución sin comprobar. En otros escritos, la ausencia de errores de tiempo de ejecución no verificados se denomina seguridad o seguridad de tipo ; Los primeros artículos de Tony Hoare llaman a esto seguridad de propiedad . [8]
Algunas de estas definiciones son contradictorias, otras son meramente conceptualmente independientes 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 tipificados. Por ejemplo:
{{cite web}}
: Mantenimiento CS1: bot: estado de la URL original desconocido ( enlace )