[JOUR 17] II. Python, the right way : comprendre la nature de Python
Aux origines du péché originel de Python
Sommaire :
1.Introduction
2.Interprété vs compilé
3.Typage statique vs dynamique
4.Le type hinting
Article précédent :
I. Introduction
Python est réputé pour sa flexibilité, sa rapidité d'apprentissage et son grand nombre de librairies, mais il est aussi décrié pour sa lenteur et son ultra-permissivité.
Dans cet article, nous explorons les origines du péché originel de Python, qui a troqué sa place au paradis des langages performants pour de la popularité, lui valant ainsi un aller simple vers le purgatoire des langages régulièrement trollés* par les développeurs.
(*trollé = moqué)
Python est un langage interprété avec typage dynamique.
Mais qu'est-ce qu'un langage interprété ? Et qu'est-ce que le typage dynamique ?
II. Interprété vs compilé
Pour rappel, votre ordinateur ne comprend que les bits, des 0 et des 1. Lorsque vous écrivez du code dans un langage de programmation, il vous faut ensuite le convertir en "langage machine", nos 0 et 1. Cette traduction du code compréhensible par les humains en langage machine est assurée par le compilateur.
Le compilateur vérifie le code et, si tout est OK pour lui, il le réécrit en langage machine, faisant quelques optimisations au passage. Il fournit in fine un fichier compilé exécutable par la machine.
On dissocie donc deux temps dans l'exécution d'un langage compilé :
le temps de compilation, ou "compile time" en anglais, c'est le moment où le code est transformé en langage machine;
le temps d'exécution, ou "runtime" en anglais, qui est le moment où l'on exécute le code sur la machine.
Python ne fonctionne pas comme ça. Python est un langage interprété, ce qui veut dire qu'il utilise un interpréteur pour exécuter le code que vous avez écrit. L'interpréteur se charge d'interpréter le code (assez logique jusque-là), c'est-à-dire qu'il fait la traduction à la volée, en temps réel, ligne par ligne, vers le langage machine et l'exécute dans la foulée (c’est un petit peu plus complexe mais je vous passe les détails). Ainsi, en comparaison avec un langage compilé, il n'y a pas de "compile time" et de "runtime", mais un seul "runtime" !
Pas de phase de compilation donc plus simple à exécuter directement, que ce soit en script ou dans des notebooks. Mais cet avantage vient avec des inconvénients. Un compilateur optimise le code, l'interpréteur ne peut pas être aussi performant à ce niveau. Indubitablement, le code interprété sera plus lent que le code compilé.
De plus beaucoup d'erreurs sont détectées à la compilation avec les langages compilés. Avec Python, vous n'avez pas ce luxe, ce qui veut dire que vous constaterez vos erreurs au runtime.
Constater des erreurs au runtime dans un notebook ou dans un script sur votre ordinateur ce n'est pas très grave. Mais lorsque c'est sur une application déployée en production (c'est-à-dire au contact de vos utilisateurs), là c'est plus gênant.
III. Typage statique vs dynamique
Python n'est pas seulement interprété, il a également un typage dynamique.
Un typage dynamique est l'opposé d'un typage dit statique.
Un typage statique signifie qu'il est impératif que chaque variable ait un type bien défini. Les variables une fois typées ne peuvent pas changer de type.
Si par exemple en Java je crée un entier : int myInt = 5, je ne peux pas ensuite lui affecter un string, myInt = "60". Cela ne fonctionnera pas.
Tandis qu'avec des langages à typage dynamique comme Python, c'est tout à fait possible :
mon_int = 5
mon_int = "70"
Cela fonctionnera sans problème en Python.
C'est très flexible comme comportement, mais j'espère que vous entreapercevez que ça peut vite être un joyeux bazar si on joue comme on veut avec les types des variables dans notre code Python.
De plus, avec les langages compilés, la vérification des types se fait de nouveau à la compilation. Contrairement à Python, donc si nous avons fait n'importe quoi avec nos types, nous ne le saurons qu'après avoir exécuté notre code Python.
Si on reprend l'exemple de l'application utilisée par nos utilisateurs en production, imaginons que nous ayons mal conçu notre code. Nous avons une fonction qui sert à manipuler des entiers et nous lui passons des strings. Le code ne produira pas l'effet escompté et retournera une erreur à notre utilisateur, qui s'empressera d'aller voir la concurrence.
Moyen comme manière de produire du code professionnel...
IV. Le type hinting
Voilà pourquoi Python est en effet réputé pour son typage dynamique, offrant une grande flexibilité aux développeurs. Cependant, cette flexibilité peut parfois conduire à des erreurs plus ou moins difficiles à détecter.
Et c'est là que des outils de type hinting comme mypy entrent en jeu.
Les outils de type hinting permettent justement d'apporter une couche de typage statique optionnel à Python. C’est ce que nous verrons dans le prochain article ;).