sistema de tipos


En los lenguajes de programación , un sistema de tipos es un sistema lógico que comprende un conjunto de reglas que asigna una propiedad denominada tipo a las distintas construcciones de un programa informático , como variables , expresiones , funciones o módulos . [1] Estos tipos formalizan y hacen cumplir las categorías implícitas que el programador usa para tipos de datos algebraicos , estructuras de datos u otros componentes (p. ej., "cadena", "matriz de flotantes", "función que devuelve booleanos"). El objetivo principal de un sistema de tipos es reducir las posibilidades de errores .en programas de computadora [2] definiendo interfaces entre diferentes partes de un programa de computadora y luego verificando que las partes se hayan conectado de manera consistente. Esta verificación puede ocurrir estáticamente (en tiempo de compilación ), dinámicamente (en tiempo de ejecución ) o como una combinación de ambos. Los sistemas de tipos también tienen otros propósitos, como expresar reglas comerciales, permitir ciertas optimizaciones del compilador , permitir el envío múltiple , proporcionar una forma de documentación, etc.

Un sistema de tipos asocia un tipo con cada valor calculado y, al examinar el flujo de estos valores, intenta garantizar o probar que no pueden ocurrir errores de tipo . El sistema de tipo dado en cuestión determina qué constituye un error de tipo, pero en general, el objetivo es evitar que las operaciones que esperan un cierto tipo de valor se utilicen con valores para los que esa operación no tiene sentido (errores de validez). Los sistemas de tipos a menudo se especifican como parte de los lenguajes de programación y se integran en intérpretes y compiladores, aunque el sistema de tipos de un lenguaje se puede ampliar con herramientas opcionales que realizan comprobaciones adicionales utilizando la sintaxis y la gramática de tipos originales del lenguaje.

Un ejemplo de un sistema de tipo simple es el del lenguaje C. Las partes de un programa en C son las definiciones de funciones . Una función es invocada por otra función. La interfaz de una función establece el nombre de la función y una lista de parámetros que se pasan al código de la función. El código de una función de invocación establece el nombre de la función invocada, junto con los nombres de las variables que contienen valores para pasarle. Durante la ejecución, los valores se colocan en el almacenamiento temporal, luego la ejecución salta al código de la función invocada. El código de la función invocada accede a los valores y hace uso de ellos. Si las instrucciones dentro de la función se escriben con la suposición de recibir un valor entero , pero el código de llamada pasó unvalor de coma flotante , entonces la función invocada calculará el resultado incorrecto. El compilador de C comprueba los tipos de los argumentos que se pasan a una función cuando se llama con los tipos de los parámetros declarados en la definición de la función. Si los tipos no coinciden, el compilador genera un error en tiempo de compilación.

Un compilador también puede usar el tipo estático de un valor para optimizar el almacenamiento que necesita y la elección de algoritmos para operaciones en el valor. En muchos compiladores de C , el tipo de datos flotante , por ejemplo, se representa en 32 bits , de acuerdo con la especificación IEEE para números de punto flotante de precisión simple . Por lo tanto, utilizarán operaciones de microprocesador específicas de punto flotante en esos valores (suma de punto flotante, multiplicación, etc.).

La profundidad de las restricciones de tipo y la forma de su evaluación afectan la tipificación del lenguaje. Un lenguaje de programación puede además asociar una operación con varias resoluciones para cada tipo, en el caso del polimorfismo de tipo . La teoría de tipos es el estudio de los sistemas de tipos. Los tipos concretos de algunos lenguajes de programación, como enteros y cadenas, dependen de aspectos prácticos de la arquitectura de la computadora, la implementación del compilador y el diseño del lenguaje.

Formalmente, la teoría de tipos estudia los sistemas de tipos. Un lenguaje de programación debe tener la oportunidad de verificar tipos utilizando el sistema de tipos, ya sea en tiempo de compilación o en tiempo de ejecución, anotado manualmente o inferido automáticamente. Como Mark Manasse lo expresó de manera concisa: [3]