lenguajes-tipados-no-tipados

Lenguajes tipados y no tipados

En la programación, existen dos tipos de lenguajes: los lenguajes tipados y los no tipados.

La diferencia fundamental entre ellos radica en cómo manejan los tipos de datos. En particular, como se declaran las variables y expresiones que vamos a utilizar.

Esta pequeña diferencia supone un gran cambio en el uso de los programas, y frecuentemente origina enormes debates sobre qué aproximación es mejor de usar.

Lenguajes tipados

En un lenguaje tipado (también llamados de tipado estricto), se caracterizan por que requieren que que definamos el tipo de dato específico de las variables y expresiones que vamos a utilizar.

Ejemplos de lenguajes tipados son C++, C# y Java, entre otros muchos. Veamos algunos ejemplos.

Por ejemplo, así se declaran variables en C# o Java.

int numero = 5;
int resultado = numero + 10;
string mitexto = "hola";

Que es muy similar a lo que encontramos, por ejemplo, en C++. Con la salvedad de que para definir el texto debemos usar el namespace std

int numero = 5;
int resultado = numero + 10;
std::string mitexto = "hola";

Como vemos, en un lenguaje tipado tenemos que indicar el tipo de variable al declararla, por ejemplo un número entero into una cadena de texto string.

Una vez que una variable tenga un tipo esta solo puede contener valores compatibles con este tipo. No podríamos asignar a una variable int un texto.

int a;
a = "hola";  // esto daría lugar a un error

Lenguajes no tipados

Por otro lado, los lenguajes no tipados (también llamados de tipado dinámico) no necesitan que indiquemos el tipo de las variables y expresiones al declarar la variable.

Ejemplos de lenguajes no tipados son Python y JavaScript. Veamos algunos ejemplos.

Por ejemplo, en JavaScript no es necesario indicar el tipo de una variable al declararla. Únicamente tenemos que usar la palabra reservada let para indicar que queremos crear una variable.

let numero = 5;
let resultado = numero + 10;
let mitexto = "hola";

En Python, ni siquiera es necesario emplear una palabra reservada para crear una variable. Simplemente la variable se crea la primera vez que la usamos.

numero = 5
resultado = numero + 10
mitexto = "hola"

En la gran mayoría de lenguajes no tipados es posible incluso cambiar el tipo de variable una vez creada.

let a = 5;    // aqui 'a' contiene el número 5
a = "hola";   // ahora 'a' contiene el texto "hola"

En realidad, internamente los lenguajes no tipados si tienen tipos. Tu programa lo necesita para saber como manipular los valores de las variables. Pero el lenguaje de programación hace que su uso sea transparente para el usuario la mayoría de las veces.

Ventajas y desventajas de cada tipo

El debate “lenguajes tipados” vs “lenguajes no tipados” es, casi, tan antiguo como el mundo de la programación. Cada enfoque cuenta con seguidores fervientes y detractores apasionados.

La verdad que ambos tipos tienen sus ventajas y desventajas (tened en cuenta que si uno de ellos fuera claramente superior, el otro habría desaparecido hace tiempo).

Hablando muy en general, podemos decir que los lenguajes de programación no tipados,

  • Son más sencillos de aprender
  • Son más ágiles y rápidos de programar
  • Son más flexibles

Mientras que los lenguajes de programación tipados,

  • Son más rigurosos y robustos, porque permiten detectar antes errores
  • Son más apropiados para proyectos grandes
  • En general, tienen mejor rendimiento porque permiten al compilador hacer optimizaciones

En realidad es un debate eterno y sin demasiado sentido. De hecho, ambos tipos de lenguajes evolucionan para incorporar características del otro tipo.

Lo importante es entender las características y diferencias entre ambos y saber usar cada uno de ellos cuando resulte más oportuno.

Vamos a verlo con un ejemplo

Supongamos que tienes que hacer una llamada a un servicio web, que me devuelve los datos de un usuario. Para ello tenemos una función que nos han dado ya hecha makeAPIRequest(), que realiza la petición y nos devuelve los datos.

En un lenguaje no tipado como JavaScript, únicamente tengo que hacer la petición, y el objeto que me devuelve “mágicamente” tiene todas las propiedades que necesito.

const response = makeAPIRequest(); // función que realiza la solicitud a la API

console.log(response.name); // Imprime el nombre del usuario
console.log(response.age); // Imprime la edad del usuario

Sin embargo, en un lenguaje fuertemente tipado como C# previamente tendría que definir lo que me va a devolver.

// Necesitas definir una clase que coincida con la estructura del objeto devuelto por la API
public class UserResponse
{
	public bool IsValid  { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

UserResponse response = MakeAPIRequest(); // función que realiza la solicitud a la API

Console.WriteLine(response.Name); // Imprime el nombre del usuario
Console.WriteLine(response.Age); // Imprime la edad del usuario

Como vemos, el código de JavaScript es mucho más ágil, porque me evita tener que definir el tipo, como sí ha sido necesario en C#.

Además, si en algún momento cambian el API, el código de JavaScript va a seguir funcionando, mientras que en el de C# voy a tener que cambiar la clase.

Así que vemos lo que decíamos que el lenguaje no tipado es mucho más flexible y ágil que el lenguaje fuertemente tipado.

Sin embargo, también tiene sus desventajas. Imaginad que el cambio ficticio que hemos dicho, no es compatible con parte de mi programa. En el caso de JavaScript tendría problemas para detectar el fallo, que no tendría en el caso de C#.

Es por este motivo por el que decimos que los lenguajes tipados son más rigurosos y menos propensos a fallos que los lenguajes no tipados.

Mi consejo es que evitéis posicionaros a favor o en contra. En su lugar, intentad aprender al menos un lenguaje de cada tipo y, sobre, entender todo sus similitudes y diferencias.

Además, en última instancia, la elección entre lenguajes tipados y no tipados va a depender del contexto y requisitos del proyecto. Así que al conocer ambos, te permitirá adaptarte a diversas situaciones