En los lenguajes de programación llamamos tipo de datos o sencillamente tipo, a un atributo de los datos que indica al sistema la clase de datos que se va a manejar. Ejemplos típicos son los números enteros, números en coma flotante, caracteres, cadenas de caracteres y lógicos.
Llamamos sistema de tipos al sistema formal que define las reglas que asignan un tipo de datos a los distintos constructos del código como variables, expresiones o funciones. Su principal cometido es reducir la posibilidad de errores en nuestros programas, al haber definido un contrato entre las distintas partes que permite comprobar que se conectan de manera consistente. También permite expresar reglas de negocio y habilitar optimizaciones del compilador.
Los sistemas de tipos (type system en inglés) se clasifican en varias categorías según su comprobación:
Estáticos vs dinámicos
Se dice que un lenguaje de programación usa tipado estático si la comprobación de tipos se realiza durante la compilación. Claros ejemplos son C, C++, Java y Go. Por el contrario se dice que es de tipado dinámico si la comprobación se realiza en tiempo de ejecución, como ocurre en Perl, Python y Ruby.
Manifiestos vs inferidos
El tipado manifiesto es aquel que identifica explícitamente en nuestro código el tipo de la variable declarada. Por el contrario el tipado inferido, también conocido como tipado implícito, es aquel en el que el tipo de la variable se detecta.
Algunos lenguajes como Go mezclan ambos tipados. Por ejemplo en el siguiente código la primera línea declara explícitamente el tipo de la variable i
, mientras que en la segunda línea el tipo de j
es inferido.
var i int
j := i // j es un entero
Fuertemente tipados vs Débilmente tipados
Por regla general un lenguaje fuertemente tipado tiene reglas estrictas de tipado en tiempo de compilación. Cabe destacar que un lenguaje dinámicamente tipado puede ser fuertemente tipado. Por el contrario en un lenguaje débilmente tipado no hay reglas estrictas y se pueden producir resultados erróneos o impredecibles cuando se realiza una conversión de tipos en tiempo de ejecución.
Tipado nominal vs Tipado estructural
En lenguajes de computación se dice que un sistema de tipos es de tipo nominal si la compatibilidad y equivalencia entre los tipos de datos se determina por declaraciones explícitas y/o el nombre de los tipos. En contraste se considera un tipado estructural a aquel en el que las comparaciones se basan en la estructura de los tipos en cuestión sin necesitar declaraciones explícitas.
Lenguajes como C++, C#, Java o Delphi son considerados como lenguajes de tipado nominal. Por el contrario Go usa un tipado estructural ya que con que un tipo implemente los métodos indicados por una interfaz se considera que la cumple sin necesidad de indicar nada explícito.