29/10/2009

L'histoire de python - Introduction et vue d'ensemble

Traduction Xavier Combelle

Introduction

Python est actuellement, avec Perl, Tcl, PHP et le nouveau venu Ruby, l'un des plus populaire langage de programmation dynamique. Bien qu'il soit souvent vu comme un langage de script, c'est en réalité un langage de programmation à visée générale comme le sont Lisp et Smalltalk (comme les autres à propos). Aujourd'hui, Python est utilisé aussi bien pour des scripts jetable que pour des serveurs web extensible qui fournissent un service ininterrompu 24h/24 7j/7. Il est utilisé pour des IHM et de la programmation de base de donnée, de la programmation web aussi bien client que serveur et le test d'application. Il est utilisé par des scientifiques écrivant des application pour les plus rapides superordinateurs et pour les enfants qui débutent l'apprentissage dela programmation.

Dans ce blog, je vais mettre en relief les points marquants de l'histoire de Python. En particulier, comment python s'est développé, les influences majeures de sa conception, les erreurs faites, les leçons apprise et les futures directions envisagées pour le langage.

Remerciements: Je suis redevable à Dave Beazley pour beaucoup des meilleurs phrases de ce blog. (Pour l'origine de ce blog voir mon autre blog.)

Un survol de Python

Quand on est pour la première fois exposé à Python, on est souvent frappé par le fait que le code ressemble en surface à du code similaire écrit dans d'autre langage de programmation conventionnel tel que le C ou le Pascal. Ce n'est pas un accident, la syntaxe de Python emprunte largement au C. Par exemple beaucoup de mot clef de Python (if, else, while, for, etc.) sont identique à ceux du C, Les identifiants de Pythons ont les même règles de nommage que le C et la plus part des opérateurs standard ont le même sens qu'en C. Bien sur, Python n'est évidemment pas du C et l'une des majeurs parties ou il diffère est qu'au lieu d'utiliser des accolades pour regrouper les instructions, il utilise l'indentation. Par exemple, au lieu d'écrire les instruction en C comme ceci:

  if (a < b) {
max = b;
} else {
max = a;
}

Python supprime seulement les accolades (ainsi que les points-virgules finaux pour faire bonne mesure) et utilise la structure suivante

  if a < b:
max = b
else:
max = a

L'autre majeur partie où Python diffère des langages tel que le C est son utilisation du typage dynamique. En C, les variables doivent toujours être explicitement déclarées et assignées à un type spécifique tel que int ou double. Cette information est ensuite utilisée pour exécuter des vérification du programme de façon statique lors de la compilation ainsi que pour allouer des espaces mémoires utilisés pour stocker les valeurs des variables. En Python, les variables sont simplement des noms qui se réfèrent aux objets. Les variables n'ont pas besoin d'être déclarée avant d'être assignées et peuvent même changer de type au milieu d'un programme. Comme d'autres langages dynamiques, toutes les vérifications de types sont faites lors de l'exécution du programme par un interpréteur au lieu de se dérouler dans une étape de compilation séparée.

Les types primitifs (natifs) de Python incluent les booléens, kes nombres (entier de taille machine, entier à taille arbitraire, nombre réels et complexes à virgule flottante), et les chaines de caractère (8 bits et unicode). Ces objets sont tous des types non modifiable et leur valeurs sont représentées par des objets qui ne peuvent pas être modifiés après leur création. Les types composés (natifs) incluent les tuples (tableaux non modifiables), les listes (tableaux redimentionnables) et les dictionnaires (tables de hachage).

Pour organiser les programmes, Python supporte les package (groupes de modiles et/ou package), modules (code cohérent regroupé dans un seul code source), classes, méthodes et fonctions. Pour le contrôle de flux , il fournit les if/else, while, et une instruction for de haut niveau qui boucle sur n'importe quel objet "itérable". Pour la gestion des erreurs, Python utilise des exceptions (non récupérables). Une instruction raise lance une exception, et les instruction try/except/finally spécifient les gestionnaire d'exception. Les opérations natives rejettent des exceptions quand des conditions d'erreurs sont rencontrées.

En python, tous les objets qui peuvent être nommés sont dit de "première classe". Ce qui signifie que les fonctions, les classes, les méthodes, les modules, et tous les autres objets nommés peuvent être passé en paramètre, inspecté, et placé dans des structures de données variées (par exemple les liste ou les dictionnaires) au moment de l'exécution. En parlant des objets, Python a également un complet support des la programmation orientée objet incluant les classes définies par l'utilisateur, l'héritage, et la liaison lors de l'execution de méthode à un objet.

Python a une librairie standard étendue, qui est l'une des principales raisons de sa popularité. La librairie standard a plus de 100 modules et est toujours en évolution. Certains de ces modules incluent les expressions rationnelles, les fonctions mathématique standard, les threads, les interfaces avec le système d'exploitation, la programmation réseau, les protocoles interne standard (HTTP, FTP, SMTP, etc.), la gestion des email, la manipulation de fichier XML, le parsing de fichier HTML, et une boite à outil de gestion d'IHM (Tcl/tk).

En plus, il y a une large fourniture de modules et packages tiers qui sont pour la pluspart open source. On peut trouver des framework web (top pour être listé), d'autre boite à outil de gestion d'IHM, des librairies numériques efficaces (incluant des wrappers pour de nombreux packages Fortran populaires) des interfaces à des bases de données relationnelles (Oracle, MySQL, et d'autres), SWIG (un outil pour mettre des librairies C++ arbitraires comme des modules python), et plus encore.

Un des majeurs avantages de Python (et d'autres langages dynamique pour ce qui est important) est que des taches qui peuvent sembler compliquées ssont souvent expriçmées en peu de lignes de code. Comme exemple, voici un simple script Python qui va chercher une page web, cherche les référneces aux URL et affiche les 10 premières d'entre elles.

  # 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")

Ce programme peut être facilement modifié pour faire un robot d'indexation, et en fait Scott Hassan m'a dit qu'il avait écrit le premier robot d'indexation de Google en Python. Aujourd'hui, Google emploie des millions de lignes de code Python popur gérer beaucoup d'aspect de ses opérations, depuis l'automatisation des build jusqu'à la gestion des publicités (Averissement: Je suis actuellement un employé de Google.)

Sous le capot, Python est typiquement implémenté en utilisant une combinaison de compilateur de bytecode et un interpréteur. La compilation est implicitement executée lorsque les modules sont chargés, et plusieurs primitives du langage nécessitent que le compilateur soit disponibles à l'exécution. Bien que l'implémentatoin standard de fait soit écrite en C, et disponible pour toutes les plateformes matérielles et logicielles imaginables, plusieurs a&utres implémentations sont devenues populaires. Jython est une version qui tourne sur la JVM et qui s'intègre sans frein à Java. IronPython est une version pour la plateforme .NET de microsoft et qui s'intègre similairement avec les autres langages tournant sur .NET. Pypy est un compilateur/interpreteur optimisant écrit en python (encore à l'état de projet de recherche, financé par l'Union Européenne). Il existe aussi Stackless Python, une variante de l'implémentation en C qui réduit la dépendance à la pile d'appel C pour les appels de fonctions et de méthodes qui permte les coroutines, les continuation et les microthreads.

Guido van Rossum

25/10/2009

Python proposition: frozen syntax

J'ai récemment lu sur python-idea l'idée de faire un frozen sur les syntaxes et les builtins de python. (idée faite par Guido van Rossum (Benovolant dictator for life de python) Ce qui n'empêcherait pas l'évolution de la stdlib. Les arguments avancés sont que ca rendrait la vie des autres implémenteurs de python (autre que Cpython) plus facile. Les retours ont l'air positif. Certains ont même ajouté que ca permettrait de concentrer les efforts des développeurs sur ce qui est le plus important.