1 tipado de datos

4
Lenguajes fuertemente, débilmente, estáticamente y dinámicamente tipados Uno de los aspectos más importantes de cualquier programa es, sin duda, el tema de los datos. Los datos son el soporte de la información, y la información es el corazón de cualquier programa. Los lenguajes de programación utilizan las variables como contenedores de datos, para manipularlos y almacenarlos en una amplia variedad de maneras. Está claro que los datos tienen distintos tipos. A nadie se le escapa que no es lo mismo un nombre de persona que su edad, el primero es un texto y el segundo es un número. Los distintos lenguajes de programación tienen en cuenta esta particularidad de los datos, y por lo tanto, todos tienen alguna forma de distinción entre los tipos de datos. No obstante, cada uno tiene una forma de afrontar esta particularidad. Ello ha llevado a podamos en cierto modo "clasificar" los lenguajes de programación por la forma en la que tratan con el problema de los tipos de datosl. Dinámica y estáticamente tipados Fuerte y débilmente tipados El tema es, sin duda, controvertido. Cada sesudo investigador o aficionado al tema podrá darle mil definiciones y argumentos acerca de lo que significa cada uno de esos términos, pero en nuestra humilde opinión, no conviene obsesionarse ni llevar el tema al extremo. Tener una ligera idea para entender que existen varias formas de afrontar el problema de los tipos es una cosa, y emprender una cruzada para defender no-sé-qué-cosa de un lenguaje u otro, o tratar de ponerle puertas al campo, es otra. En este artículo, matizaremos los aspectos más importantes que nos permiten distinguir la forma en que un lenguaje aborda el tema de los tipos de los datos, sin ánimo de controversia ni de sentar cátedra... y por supuesto... influenciados por nuestra propia opinión de aficionados ;-) Lo mejor que puedes hacer con un artículo como éste es leerlo, no creértelo del todo, contrastarlo con otras fuentes y formarte tu propia opinión. La controversia entre éstos tipados tiene fuertes raíces en el hecho de que cuando se diseña un lenguaje, se tiene en mente si va a ser compilado o interpretado. Las diferencias en el diseño de un compilador o de un intérprete son radicales. Además, debemos fijarnos en el hecho de que un mismo lenguaje, generalmente se compila o generalmente se interpreta. Por ejemplo, el lenguaje C, o C++ o C#, o Java generalmente es compilado. El lenguaje JavaScript, o PHP o Python, generalmente se interpretan. El tratamiento de tipos en un intérprete puede, en general, disfrutar de una riqueza mucho mayor en las estructuras que internamente se utilizan para representar a las variables. El compilador, por su parte, depende de una traducción a código máquina (puede ser de una

Upload: vdominguezv

Post on 26-Jul-2015

252 views

Category:

Documents


17 download

DESCRIPTION

importancia de conocer cómo es el tipado de datos en un lenguaje de programacion

TRANSCRIPT

Page 1: 1 Tipado de Datos

Lenguajes fuertemente, débilmente, estáticamente y dinámicamente tipados

Uno de los aspectos más importantes de cualquier programa es, sin duda, el tema de los

datos.

Los datos son el soporte de la información, y la información es el corazón de cualquier

programa.

Los lenguajes de programación utilizan las variables como contenedores de datos, para

manipularlos y almacenarlos en una amplia variedad de maneras. Está claro que los datos

tienen distintos tipos. A nadie se le escapa que no es lo mismo un nombre de persona que su

edad, el primero es un texto y el segundo es un número.

Los distintos lenguajes de programación tienen en cuenta esta particularidad de los datos, y

por lo tanto, todos tienen alguna forma de distinción entre los tipos de datos.

No obstante, cada uno tiene una forma de afrontar esta particularidad. Ello ha llevado a

podamos en cierto modo "clasificar" los lenguajes de programación por la forma en la que

tratan con el problema de los tipos de datosl.

• Dinámica y estáticamente tipados

• Fuerte y débilmente tipados

El tema es, sin duda, controvertido. Cada sesudo investigador o aficionado al tema podrá

darle mil definiciones y argumentos acerca de lo que significa cada uno de esos términos,

pero en nuestra humilde opinión, no conviene obsesionarse ni llevar el tema al extremo.

Tener una ligera idea para entender que existen varias formas de afrontar el problema de los

tipos es una cosa, y emprender una cruzada para defender no-sé-qué-cosa de un lenguaje u

otro, o tratar de ponerle puertas al campo, es otra.

En este artículo, matizaremos los aspectos más importantes que nos permiten distinguir la

forma en que un lenguaje aborda el tema de los tipos de los datos, sin ánimo de controversia

ni de sentar cátedra... y por supuesto... influenciados por nuestra propia opinión de

aficionados ;-) Lo mejor que puedes hacer con un artículo como éste es leerlo, no creértelo

del todo, contrastarlo con otras fuentes y formarte tu propia opinión. La controversia entre

éstos tipados tiene fuertes raíces en el hecho de que cuando se diseña un lenguaje, se tiene

en mente si va a ser compilado o interpretado. Las diferencias en el diseño de un compilador

o de un intérprete son radicales. Además, debemos fijarnos en el hecho de que un mismo

lenguaje, generalmente se compila o generalmente se interpreta. Por ejemplo, el lenguaje C,

o C++ o C#, o Java generalmente es compilado. El lenguaje JavaScript, o PHP o Python,

generalmente se interpretan.

El tratamiento de tipos en un intérprete puede, en general, disfrutar de una riqueza mucho

mayor en las estructuras que internamente se utilizan para representar a las variables. El

compilador, por su parte, depende de una traducción a código máquina (puede ser de una

Page 2: 1 Tipado de Datos

máquina real o una máquina virtual, como en el caso de .net o de Java). Eso hace que las

estructuras para representar variables tengan una flexibilidad algo menor, y, si se quiere

dotar de mecanismos más flexibles o más potentes a un compilador, generalmente redunde

en un mayor consumo de tiempo y de memoria y también generalmente, a los compiladores

se les suele exigir rapidez en el código que generan y consumo de recursos reducido.

Estos factores, en cierto modo, condicionan cómo los lenguajes tratan los tipos.

Tipos estáticos, tipos dinámicos. (static typing, dinamic typing)

En un lenguaje estáticamente tipado, cada variable debe ser declarada con un tipo. Eso

ocurre por ejemplo en C# o Java. Para utilizar una variable de tipo entero, es necesario

indicar que en efecto, es de ese tipo. El tipado estático es típico de los lenguajes

compilados.El tipo no se altera hasta que la variable se sale de ámbito y se extingue. Éste

comportamiento se aplica tanto a variables locales (a un método o función), a parámetros (de

un método o función), a varibles de instancia (de un objeto), a variables de clase ("static"), o

a variables globales (en lenguajes no orientados a objetos).

Por ejemplo, en C# o java, para utilizar una variable de nombre "i" que contenga un entero int i; //Primero se declara

i=3; //y luego se utiliza

No es posible asignar un valor de otro tipo a una variable de un tipo concreto: i="hola"; //incorrecto

En un lenguaje dinámicamente tipado, no suele ser necesario declarar el tipo de las

variables. Es típico de los intérpretes. Ocurre en lenguajes como PHP o Python. Las

variables empiezan a existir cuando se les da valor. Los lenguajes dinámicamente tipados

tienen en cuenta los tipos, desde luego, pero no en las variables, sino en su contenido.

Una misma variable puede contener en un instante dado un dato de un determinado tipo, y

en otro instante, puede contener otro dato de otro tipo.

Por ejemplo, en Python, podemos utilizar una variable "i" para contener un entero, sin

necesidad de indicar que va a contener un entero. (La almohadilla # (o gato) indica un

comentario) i=3 #la variable comienza a existir al darle valor

i="hola" #luego, puede contener un valor de otro tipo

Vamos a contarlo de otro modo. Imagina que las variables fueran cajas de cartón (bueno, al

fin y al cabo, una caja de cartón sirve para contener cosas):

En los lenguajes estáticamente tipados se le asigna el tipo a la caja. Es como si en la caja,

pusieramos una etiqueta: "esta caja sólo puede contener zapatos". A partir de ese momento,

en esa caja sólo se pueden meter zapatos, hasta que la caja sea destruida.

En los lenguajes dinámicamente tipados, es el contenido el que tiene el tipo. En la caja no

Page 3: 1 Tipado de Datos

colocamos ninguna indicación acerca del contenido. Si metemos un par de zapatos será una

caja de zapatos, y si metemos un juguete será una caja de juguetes. Nadie impide que

metamos cualquier cosa.

Bueno la segunda opción parece, al menos intuitivamente, más sencilla más flexible ¿Por

qué no se utiliza siempre? Ah... amigo muy sencillo: en la segunda opción, hay que abrir las

cajas para saber lo que contienen.

Con el tipado estático, dadas dos variables enteras, si después queremos hacer una suma,

seguro que se puede hacer sin mirar, dado que el compilador sabe que seguro que contienen

un entero, por lo tanto, la suma se puede hacer sin comprobaciones previas. int i1=3; int i2=5; int i3=i1+i2; //No se hacen comprobaciones en la

suma: seguro que i1 e i2 contienen un entero.

Con el tipado dinámico, las operaciones son algo más costosas el intérprete deberá obtener

el contenido de las variables ("abrir las cajas") y decidir qué operación hacer y cómo,

suponiendo que ésta sea posible.

En Python, la tercera línea necesita comprobaciones adicionales a nivel interno, con respecto

al tipado estático.

i1=3

i2=5

i3=i1+i2

Fuertemente tipados, débilmente tipados(strong typing, weak typing)

En este punto, la controversia es algo mayor. No hay un criterio unánime acerca del grado de

fortaleza o debilidad en los tipos.

Comunmente, se entiende que un lenguaje tiene un sistema de tipos más fuerte si para una

determinada operación, que requiera un determinado tipo de datos, el lenguaje no acepta

tipos que pudieran ser "compatibles".

Por ejemplo, si un lenguaje nos permite declarar un método o función que acepte como

parámetro un número real de doble precisión (es decir, un double), consideraríamos que el

lenguaje está muy fuertemente tipado si sólo permitiese llamadas o invocaciones a esa

función o método pasándole como parámetro un dato con un tipo double.

A partir de ahí, podríamor ir rebajando el listón. Por ejemplo, en la situación descrita, casi

todos los lenguajes permiten una serie de conversiones implícitas. Es decir, muchos

lenguajes (como C# o Java, que son estáticamente tipados) permitirían invocar un método

que aceptase un double como parámetro pasándole un float (un número con decimales de

simple precisión), o incluso un entero. Es decir, en ese sentido, C# o Java están fuertemente

tipados, pero no todo lo fuertemente tipado que se puede estar.

Todavía se podría rebajar más el listón: si en el mismo caso, el método que acepta un

Page 4: 1 Tipado de Datos

double, intentásemos una llamada pasándole una cadena (que podría contener en sus

carácteres la representación de un double, y por lo tanto, la operación podría tener cierto

sentido, ej: "3.1416"), un lenguaje débilmente tipado permitiría la llamada, e intentaría, en el

interior del método o función, interpretar la cadena como un double.

Prácticamente todos los lenguajes permiten una cierta conversión implícita de tipos,

especialmente si se pueden considerar seguras. Por ejemplo, convertir un entero a un double

suele ser una operación segura, dado que un entero no tiene decimales, y un double sí... es

decir, es un tipo más amplio. Una conversión de éste tipo puede ser implícita con un alto

grado de seguridad. Al reves no es así. Si yo tengo un double (Ej: 2.68) y lo utilizo en un

contexto en el que se requiere un entero, ¿qué debería hacer el lenguaje con los decimales?

¿Los quita? ¿Los redondea?

Un lenguaje débilmente tipado, en general, permite éste tipo de conversiones implícitas

inseguras. Es su filosofía que el programador se encargue de programar, y el lenguaje se

encargará de hacer todo lo posible para que el programa ejecute, liberando al programador

de llevar también la cuenta de posibles conversiones de tipos.

Esta última forma de actuar proporciona, sin duda, una manera más sencilla de programar.

Es decir, en un lenguaje débilmente tipado, el lenguaje prestará poca atención a una

definición estricta de los tipos. Eso hace que el programador pueda centrarse en el objetivo

del problema que resuelve, que el lenguaje intentará encargarse de todo lo referido a los

tipos, sin embargo, la consecuencia lógica es que los posibles errores se detectarán más

tarde, en tiempo de ejecución.

Éste hecho de permitir una mayor o menor relajación en el uso de los tipos no está tan

íntimamente relacionado con la compilación o la interpretación. Ni siquiera tiene una relación

evidente con el tipado estático o dinámico. Sin embargo, sí puede verse una cierta tendencia

a que los lenguajes estáticamente tipados (como C# o Java) también tengan una cierta

fortaleza en el tratamiento de los tipos.

Conclusión

Sacar conclusiones es complicado. Valorar si es mejor tal o cual cosa es esfuerzo perdido...

para según que aplicaciones puede venir mejor una y para otras no.Valóralo tú mism@ y

saca tus propias conclusione: será el mejor criterio que puedas tener ;-)

ver: 1 Pseint es dinamicamente tipado.psc

Fuente:http://latecladeescape.com/articulos/1520-lenguajes-fuertemente-debilmente-estaticamente-y-dinamicamente-

tipados