Introducción y visión general
Python es actualmente uno los los lenguajes de programación dinámicos más populares, junto con Perl, Tcl, PHP y el recién llegado Ruby. Aunque es descrito a menudo como un lenguaje de "scripting", en realidad es un lenguaje de programación completo y de uso general, en la misma línea que Lisp o Smalltalk (Al igual que los anteriormente nombrados, por cierto). Hoy, Python se usa para todo, desde guiones ligeros de usar y tirar hasta servidores web de alta escalabilidad, que proporcionan servicios ininterrumpidos de tipo 24x7. Se usa para programas visuales, para acceso a bases de datos, para programación web tanto en el lado cliente como en el servidor, y para la ejecución de baterías de pruebas de aplicaciones. Lo usan tanto científicos escribiendo aplicaciones para superordenadores como niños que están aprendiendo a programar.
En este blog veremos las partes más destacadas de la historia de Python, especialmente la forma en que fue desarrollado, las principales influencias en su diseño, los errores cometidos, las lecciones aprendidas y la dirección futura del lenguaje.
Agradecimientos: Estoy en deuda con Dave Beazley por muchas de las mejores frases de este blog (Para saber más de los orígenes del blog, véase el blog principal de Guido Van Rossum)
Un vistazo general a Python
La primera vez que uno se encuentra con Python, lo primero que notará es que el código parece, al menos a primera vista, muy similar al código escrito en otros lenguajes de programación convencionales, como pueden ser C o Pascal. Esto no es una casualidad; la sintaxis de Python toma prestadas muchísimas cosas de C. La mayoría de las palabras reservadas de Python (if, else, while, for, etc...) son las mismas que en C, se siguen las mismas reglas para formar identificadores válidos en Python que en C, y la mayoría de los operadores estándar tienen el mismo significado en los dos lenguajes. Por supuesto, resulta obvio que Python no es C, y una de las diferencias que más llama la atención es el uso de la indentación, en vez de los corchetes, para agrupar sentencias. Por ejemplo, en vez de escribir un código en C como el siguiente:
if (a < b) {
max = b;
} else {
max = a;
}
Python simplemente se deshace de los corchetes (junto con los puntos y comas finales) y utiliza la siguiente estructura:
if a < b:
max = b
else:
max = a
El otro aspecto relevante en que Python difiere de otros lenguajes similares a C es en el uso de tipado dinámico. En C, las variables siempre deben ser declaradas explícitamente, y se les debe asignar un tipo, como int o double. Esta información se usa luego para realizar comprobaciones estáticas durante la fase de compilación, así como para reservar el uso de la memoria necesaria para almacenar el valor que almacenará la variable. En Python, los nombres de variables son sólo nombres que referencian objetos. Las variables no necesitan ser declaradas antes de ser asignadas, y pueden incluso cambiar de tipo durante la ejecución de un programa. Al igual que otros lenguajes dinámicos, toda la comprobación de tipos se realiza en tiempo de ejecución por un intérprete en vez de ser una parte del proceso de compilación.
Los tipos de datos primitivos de Python incluyen valores lógicos o booleanos, números (enteros a nivel máquina, enteros de precisión arbitraria y tipos reales y complejos con valores en coma flotante) y cadenas de texto o strings (tanto de 8 bits como unicode). Todos estos son tipos inmutables, lo que significa que sus valores se representan con objetos que no pueden ser modificados después de su creación. Los tipos de datos compuestos incluyen tuplas (arrays o vectores inmutables), listas (arrays o vectores modificables en tamaño) y diccionarios (tablas hash).
Para organizar los programas, Python soporta paquetes (packages), que son grupos de módulos y/o paquetes), módulos (código relacionado que se agrupa junto en un mismo archivo fuente), clases, métodos y funciones. Para control de flujo, proporciona las construcciones if/else, while y una sentencia for de alto nivel que realiza un bucle sobre cualquier objeto que sea "iterable". Para el manejo de errores, Python utiliza excepciones (no continuables). Una sentencia raise eleva una excepción, y las sentencias try/except/finally sirven para especificar manejadores de excepciones. Las operaciones y las funciones incorporadas elevan excepciones cuando se encuentran con una condición de error.
En Python, todos los objetos que pueden ser nominados se dice que son objetos de "primera clase". Esto significa que cualquier función, clase, método, módulo y cualquier otra cosa que tenga nombre pueden ser pasados como parámetros, inspeccionados y colocados en diferentes estructuras de datos. (por ejemplo, listas o diccionarios) en tiempo de ejecución. Y hablando de objetos, Python también tiene soporte completo para la programación orientada a objetos, incluyendo clases definidas por el usuario, herencia y polimorfismo, basado en la vinculación en tiempo de ejecución de los métodos.
Python dispone de una librería estándar bastante grande, una de las principales razones de su popularidad. La librería estándar consta de más de 100 módulos, y está siempre en continua evolución. Entre otras cosas, hay módulos para usar expresiones regulares, funciones matemáticas habituales, multiproceso ligero o threads, interfaces con diferentes sistemas operativos, redes, protocolos estándar de Internet (HTTP, FTP, SMTP, entre otros), manejo de correo electrónico, procesamiento de XML, analizado de HTML e interfaces gráficas (Tcl/Tk).
Además, hay una enorme cantidad de módulos y paquetes suministrados por terceras partes, la mayoría de los cuales son software libre. Aquí podemos encontrarnos con frameworks para la web (¡Demasiados para listarlos todos!), más sistemas de programación gráficas, librerías de cálculo numérico eficientes (incluyendo recubrimientos de algunos paquetes de Fortran muy populares), interfaces con bases de datos relacionales (Como Oracle y MySql, entre otras), SWIG (Una herramienta que permite realizar cualquier tipo de llamadas a librerías escritas en C/C++, que se verían como módulos Python) y mucho más.
Un atractivo importante que tiene Python (así como otros lenguajes de programación dinámicos, por cierto) es que tareas en principio aparentemente complicadas pueden ser expresadas con muy poco código. Como ejemplo, veremos un sencillo guión de Python que descarga una página web, inspecciona el código HTML de la misma buscando referencias URL, e imprime las diez primeras que encuentre:
# Scan the web looking for references
import re
import urllib
regex = re.compile(r'href="([^"]+)"')
def matcher(url, max=10):
"Print the first several URL references in a given url."
data = urllib.urlopen(url).read()
hits = regex.findall(data)
for hit in hits[:max]:
print urllib.basejoin(url, hit)
matcher("http://python.org")
Este programa puede ser modificado fácilmente para implementar una "araña" web, de hecho Scott Hassan me ha dicho que la primera araña de Google fue escrita en Python. A día de hoy, Google emplea millones de líneas de código Python para gestionar muchos aspectos de sus operaciones, desde compilación automatizada hasta la gestión de anuncios (Nota: Guido Van Rossom es actualmente un empleado de Google).
Si miramos en su interior, veríamos que Python está implementado usando una combinación de compilador a bytecode e interprete. La compilación se realiza de manera implícita cada vez que se importa un módulo, y hay varias primitivas del lenguaje que requieren que el compilador esté disponible en tiempo de ejecución. Aunque la implementación estándar de Python está escrita en C, y por tanto disponible para casi cualquier combinación de hardware/software, existen otras implementaciones que han llegado a ser populares. Jython es una versión que corre sobre la Maquina Virtual Java y tiene una integración magnifica con Java. IronPython es una versión para la plataforma .NET de Microsoft, que se integra de manera similar con los lenguajes incluidos en dicha plataforma. PyPy es un interprete/compilador de Python escrito en el propio Python (Es todavía un proyecto de investigación, basado en fondos de la Unión Europea). También hay que mencionar Stackless Python, una variante de la implementación en C que reduce la dependencia de la pila de C para las llamadas a funciones o métodos, permite corutinas, continuaciones y microthreads.
Índice de artículos · Siguiente: La filosofía de diseño de Python
Añadir un comentario