Le blog de numerunique

VBA, Python, PHP ou C : c'est pareil ?
01/08/2020

Prenons un exemple quasi idéal pour un traitement informatique : le sudoku.

La première préoccupation de l'informaticien est de choisir une représentation des données et de préciser les interactions avec l'utilisateur.  Le sudoku étant une grille de nombres, on saute sur la facilité en choisissant d'emblée le contexte d'un tableur.

En VBA

Pour repérer les contraintes initiales on les met tout simplement en gras ; par exemple :

Voici alors une solution en VBA de ce problème :

Non seulement c'est illisible mais en plus c'est lent mais alors lent de chez lent.fr !

7 minutes (et 32 secondes) ! Il faut être patient et avoir confiance en la validité du code car Excel devient comateux pendant la durée du traitement.

Mais bon, ça fait le boulot ; voici la première solution trouvée :

Il faut avouer que les contraintes de ce sudoku ont été vicieusement choisies pour nécessiter un grand nombre d'itérations.

En Python

Considérons une version de ce traitement plus pédagogique, écrite cette fois en Python :

Et la même solution est obtenue en seulement 2.2 secondes :
 2 1 4 3 6 5 8 9 7
 3 5 6 7 8 9 1 2 4
 7 8 9 2 1 4 3 5 6
 4 9 5 1 3 7 2 6 8
 8 2 7 9 4 6 5 1 3
 1 6 3 8 5 2 7 4 9
 5 7 1 4 9 3 6 8 2
 6 4 2 5 7 8 9 3 1
 9 3 8 6 2 1 4 7 5

Trouvé en 1453557 itérations.

Le Python a en plus l'avantage d'imposer la présentation du code, ce qui en rend la (re)lecture plus accessible à tous (même à son auteur lorsqu'il doit y revenir plusieurs années après).

En PHP

Pour le fun, le même traitement mais en PHP :

Malgré une petite optimisation du traitement qu'un regard attentif aura repéré aux lignes 23-26, c'est un tout petit peu plus lent : 2.7 secondes.

C'est d'ailleurs cette proximité de temps de traitement qui aura motivé la recherche (empirique) de contraintes nécessitant un grand nombre d'étapes (itérations) pour obtenir une première solution, pas moins de 1 453 557 étapes de traitement pour trouver une première solution qui satisfait les contraintes choisies pour l'exemple.

En C

Mais alors en C, cela donne quoi ?

0,08 secondes.

Si, c'est bien 8 centièmes de secondes... c'est à dire plus de 5600 fois plus rapide qu'en VBA et 200 fois plus rapide qu'en Python !

En prime le code est bien plus beau :

Une démarche commune

Ces quatre exemples ont en commun un style de programmation procédural (à opposer par exemple à une approche orientée objet) et la démarche du traitement.

La grille du sudoku est gérée informatiquement dans un tableau dont chaque case, repérée par ses indices de ligne (l) et de colonne (c) contient la valeur numérique (v) du chiffre qu'elle contient. Un 0 code pour une case vide.

Le traitement est réparti en deux fonctions :

La première fonction vérifie la validité d'une valeur v mise dans la case (l,c). On y vérifie que la valeur v n'est pas déjà présente sur la ligne l, ni sur la colonne c ni dans la région de 3x3 cases à laquelle la case (l,c) appartient.

La deuxième fonction est récursive (elle s'appelle elle-même). Elle cherche d'abord quelle valeur serait valide dans la case en cours et elle s'assure ensuite que cette valeur est compatible avec une solution pour le reste de la grille, à commencer par la case suivante. Si cette deuxième condition n'est pas vérifiée, on essaye une autre valeur. Si on a épuisé toutes les valeurs possibles, on remet en cause la valeur choisie à la case précédente.

Et si on arrive à trouver une valeur valide pour la dernière case de la grille, on a trouvé une solution !

Des différences de "détails"

Mais écrire ce même traitement en VBA, Pyhton, PHP ou C n'est pas du tout la même histoire.

La solution en VBA comparée à celles en Python, PHP ou C se singularise par sa dépendance au contexte d'Excel. La différence saute aux yeux.

Les solutions en Python, PHP ou C se ressemblent beaucoup plus. Elles comportent néanmoins des subtilités qui pourraient faire perdre un temps fou à l'expert d'un de ces langages qui voudrait en utiliser un autre dont il est moins familier.

Quelques exemples :

La structuration du code

Les blocs d'instruction en Python sont définis par l'indentation (le décalage par rapport à la marge de gauche) et par des accolades en PHP ou en C. Cette contrainte de présentation du Python que l'on avait aussi en Fortran est une gène pour le programmeur expérimenté et isolé mais une aide pour le débutant ou les équipes de programmeurs.

La gestion des variables

En C, il faut déclarer préalablement chaque variable et préciser le type de données pour lequel elle sont prévues. Il faut même réserver (et ensuite libérer) explicitement de l'espace en mémoire dans certains cas (non illustré dans l'exemple).

En PHP, les variables sont identifiées par un $ et gérées automatiquement. On peut même utiliser la même variable pour y stocker des types de données différentes. Par rapport au C, c'est cool mais on se retrouve avec des $ partout.

En Python, les variables sont identifiées et gérées automatiquement.

Il y a aussi des différences sur la visibilités des variables. En C, les variables globales sont visibles partout ; une joyeuse source d'erreur. En Python ou PHP, il faut les introduire dans les fonctions avec le mot clé "global".

Cette évolution de la gestion des variables va dans le sens de la simplicité pour le programmeur. Un des prix à payer est une concession sur les performances.

Les aspects plus techniques

La différence entre le Python, le PHP ou le C est encore plus grande pour des aspects plus prosaïques mais néanmoins incontournables.

Les exemples donnés en illustration les masquent pudiquement. Il s'agit notamment des instructions qui affichent la solution trouvée ou, plus encore, qui initialisent la grille du sudoku et ses contraintes. La maîtrise de ces aspects plus techniques fait toute la différence entre un développeur débutant ou expérimenté ; et cela n'a rien à voir avec une question de syntaxe !

Il y a aussi une autre nuance importante qui distingue le Python ou le PHP avec le C. Les deux premiers langages sont interprétés, le C est compilé. Cette étape de compilation assure un gain de performance considérable à l'exécution mais entraîne une complexité et une charge supplémentaire pour le programmeur.

L'art de l'informaticien

Ce n'est pas la maîtrise d'un langage qui fait l'informaticien, pas plus que l'usage d'une souris ou d'un clavier ni la connaissance d'un "framework" ou d'un IDE.

Au final, l'ordinateur exécutera systématiquement et à un vitesse sur-humaine des instructions élémentaires (chaque instruction réalisant une action ridiculement simple).

L'art de l'informaticien s'exprime dans la conception d'une démarche de traitement bien adapté pour résoudre un problème donné.

Et c'est universel.

(Sources des exemples de code sur demande)


Précédent | Suivant