jueves, abril 23, 2009

Uso del tipado dinámico en Python - Historia de Python

Uso del tipado dinámico en Python

Una diferencia importante entre ABC y Python es la esencia general del sistema de tipos. ABC es un lenguaje de tipado estático, lo que significa que el compilador de ABC analizaba el uso de los tipos en el programa y comprobaba si eran usados de forma consistente. Si no era el caso, se rechazaba el programa y nunca se llegaba a ejecutar. Al contrario de la mayoría de lenguajes de tipado estático de la época, ABC usaba inferencia de tipos (No muy diferente de Haskell) en vez de declaraciones explícitas del tipo que puedes encontrar en lenguajes como C. Python, por el contrario, tiene tipado dinámico. El compilador de Python no se ocupa para nada de los tipos de datos usados en el programa, y todas las comprobaciones de tipos se realizan en tiempo de ejecución.

Aunque esto puede parecer una gran diferencia con ABC, no lo es tanto. Al contrario que otros lenguajes de tipos estáticos, ABC no depende (¿o dependía? es en su mayor parte historia a fecha de hoy) exclusivamente del chequeo de tipos estático para evitar que el programa fallara, también tenía una librería en tiempo de ejecución que comprobaba los tipos de los datos pasados como argumentos en todas las operaciones, cada vez que se ejecutaban. Esto se hizo en parte como complemento de seguridad para los algoritmos de comprobación de tipos del compilador, que no estaba completamente terminado en los primeros prototipos. La librería también resultaba ser de gran ayuda en el depurado de errores, ya que las comprobaciones realizadas en tiempo de ejecución pueden proporcionar mensajes de error muy buenos (una de las metas del equipo de desarrollo), en vez de los volcados de memoria que se producirían si el interprete intentara la operación a ciegas, sin comprobar los parámetros.

En cualquier caso, la razón más importante para que ABC tuviera comprobación de tipos en tiempo de ejecución, además de la realizada en tiempo de compilación, era su naturaleza como lenguaje interpretado. En una sesión interactiva, el usuario teclearía sentencias en ABC que serían ejecutadas tan pronto como se pudiera. El usuario podría crear una variable como un número, borrarla y luego recrearla (es decir, crear otra variable con el mismo nombre) en forma de cadena de texto. Dentro de un procedimiento se produciría un error por usar la variable primero como si fuera un número y luego como si fuera un texto, pero no era razonable forzar este tipo de controles entre distintas sentencias introducidas durante una sesión interactiva; la creación accidental de una variable entera x impediría la creación de otra variable de otro tipo que se llamara también x. Así que ABC tomo el compromiso de usar comprobación de tipos dinámicos para variables globales, y comprobación estática para variables locales. Para simplificar la implementación, al final se hacía comprobación dinámica de tipos para las variables locales también.

Así que sólo había un pequeño paso desde la implementación de ABC de comprobación de tipos hasta la de Python, simplemente descartar las comprobaciones de tipo en tiempo de compilación. Esta decisión estaba en consonancia con la filosofía Python de "ahorro de costes", ya que simplificaba la implementación sin afectar a la seguridad; los errores de tipo serían capturadas en tiempo de ejecución, antes de que pudieran producir un error en el intérprete.

En cualquier caso, no hay marcha atrás una vez que decides ir por la vía del tipado dinámico. Las operaciones de ABC se diseñaron cuidadosamente para que los tipos de los argumentos pudieran deducirse de la forma de la operación. Por ejemplo, a partir de la expresión x^y, el compilador podía deducir que las variables x e y, así como el resultado de la operación, tenían que ser cadenas de texto. En Python, este tipo de deducciones resulta, por lo general, imposible. Por ejemplo, la expresión x+y podría tratarse de una concatenación, una suma aritmética o un operador sobrecargado de un tipo definido por el usuario.