jeudi 11 avril 2013

Python, succès étonnant d'un langage si peu orthodoxe


Langage populaire.
Ayant pratiqué de nombreux langage (Fortran, clipper, C, VBA, JSP, PHP, et j'en passe) mais sans jamais devenir expert, j'ai pu réaliser une grande variété de programmes pour répondre à toutes sortes de défis. A chaque fois, c'est uniquement pour m'adapter au besoin (exemple un site Web), que j'ai dû apprendre un nouveau langage. C'est en me plongeant dans l'univers du Raspberry (projet d'un ordinateur à 25$), que j'ai tenté d'apprendre Python, car la petite communauté à l'origine de ce projet utilise et popularise avec beaucoup d'énergie ce langage. J'ai donc tenté de sauter le pas, en partant à la découverte de ce langage. Ma première surprise fut de découvrir sa grande popularité dans différents domaines (site Web, batch, logiciel graphique, et même pour le HTML5). Inkscape en particulier utilise Python pour la partie conversion.

Premier pas.
Je tiens en premier lieu à rendre hommage à un livre PDF qui m'a enchanté, me rappelant le bon vieux temps de la micro-informatique, un temps où les livres et documentations étaient superbement écrits et constituaient un plaisir de lecture et de pédagogie. Actuellement pour apprendre un nouveau concept, nous sommes écrasé sous la quantité de document mal écrit et oubliant la dimension pédagogique. C'est donc grâce à l'ouvrage de Gérard Swinnen que j'ai pu débuter mon apprentissage. Heureusement qu'il existe encore aujourd'hui des documents pédagogiques donnant envie d'apprendre. A noter que pour moi la référence reste le Kernighan & Ritchie écrit pour apprendre et faire connaitre le langage C.




Caractéristiques (analyse personnelle).
Je définirais Python comme un langage de programmation orienté ligne de commande. En d'autre terme, un langage permettant la réalisation d’algorithmes complexes en ligne de commande (comparable à un shell unix). Pour caractériser concrètement ce langage, voici quelques particularités:
Le mode console qui permet d'exécuter en mode interactif des lignes codes. Ce mode console me semble-t-il relativement inutile car non persistant (les lignes de codes ne sont pas mémorisées) et rend difficile les interactions complexes.
Une autre caractéristique est son mode exécution en commande en ligne ("python script.py" par exemple), fort pratique.
Ce langage appartient à la très grande famille des langages interprétés.
Mais la caractéristique la plus étonnante (vis à vis de mon parcours de développeur) est la méthode de gestion des blocs logiques. Un bloc logique, comme par exemple un bloc conditionnel du type "If() ...endIf", est déterminé par les indentations de chaque ligne. En d'autre terme c'est le nombre d'espace en début de ligne qui détermine si cette ligne appartient à un bloc logique ou un autre.

Pourquoi je n'aime pas.
Les goûts et les couleurs sont difficiles à expliquer. Pour Python, je vais tenter de donner des exemples de choses qui me dérange et qui me pousse à ne pas investir de temps. Je vais en citer deux :
Le système d'indentation et la syntaxe légère. Il s'agit bel et bien d'impression, car n'ayant pas approfondi mon étude et l'apprentissage de ce langage, je ne puis en prendre toute la mesure. Mais l'avantage du monde d'aujourd'hui, c'est le luxe formidable dont jouit le développeur, avec la possibilité de choisir son langage. Il n'y a pas si longtemps, quand vous vouliez réaliser un certain type de traitement ou utiliser certains équipements, vous étiez contraint d'utiliser un système et nul autre. Heureusement les hackers et autres bénévoles ont développé les moyens de pouvoir choisir. Voici donc deux exemples qui me pousse à ne pas choisir ce langage.

Les blocs délimités par indentation.
C'est le point le plus grave. Ayant passé des centaines d'heure à débugger ou décrypter des programmes, je connais l'importance de la délimitation des blocs logiques décrivant des tests ou des boucles. L'idée de délimiter visuellement par indentation les blocs est intéressante théoriquement, mais dans la pratique c'est un cauchemar pour ceux aimant les choses biens rangées. Le plus grave est l'incapacité de "voir" la différence entre un espace, une tabulation ou les différents caractères exotiques de l’ASCII qui s'apparente à un espace (Je me souviens à ce propos avoir un jour perdu beaucoup de temps à cause du caractère ASCII SUB). Quid d'un mélange (invisible sur un éditeur classique) de tabulation et d'espaces. Les conséquences sont terribles: les algorithmes peuvent devenir erratiques et complexe à décrypter. La goute d'eau est le fait d'avoir étendu ce système de bloc à la notion de fonction. On crée déjà soi-même assez de bug, pas besoin d'en générer encore plus avec son éditeur de texte à cause de cette gestion de blocs logiques.

Syntaxe légère.
Sur ce point je ne suis pas un farouche opposant. Mais il existe la aussi des risques difficiles à évaluer. Voici un petit exemple de suite de Fibonacci, justement présenté dans le livre ci-dessus:

Cet exemple présente le dépouillement de la syntaxe. Cette dernière ligne en particulier :
     a, b, c = b, a+b, c+1
est en fait la contraction élégante de trois affectations.
Malheureusement, cette syntaxe pour un langage interprété destiné au plus grand nombre, pose un grave problème d'interprétation. Ce petit bout de code peut être "traduit" (ou plutôt interprété) de deux manières en algorythmie simplifié.
Interprétation 1: avec des valeurs évoluant au fil des affectations:
cela donnerait cela pour "traduire" la dernière ligne:
  a=b
  b=a+b
  c=c+1
Interprétation 2: avec des valeurs figées juste avant les affectations:
  temp_a= a
  temp_b= b
  temp_c= c
  a= temp_b
  b= temp_a + temp_b
  c= temp_c + 1

Chaque méthode d'"interprétation" donne des séries de trinômes (a,b,c) différentes:
  Trinômes      Trinômes
  Interpr. 1    Interprétation 2
  (1, 1, 1)     (1, 1, 1)
  (1, 2, 2)     (1, 2, 2)
  (2, 4, 3)     (2, 3, 3)
  (4, 8, 4)     (3, 5, 4)
  (8,16, 5)     (5, 8, 5)
  ......
On remarque d'ailleurs que les deux premières lignes sont identiques, ce qui peut impliquer des risques de camouflage de ce bug d’algorithmie, si seules les premières lignes sont testées. Cela montre le danger de type de syntaxe.

Conclusion
Ma première expérience n'étant pas convaincante, je n'utiliserais pas Python pour un certain temps. J'aime encore mieux les rigueurs et les dangers d'un langage C plutôt que de me lancer dans l'investissement d'un langage si peu orthodoxe. Le plus important pour un langage de programmation n'est pas sa facilité de programmation (syntaxique ou autre) mais sa facilité à debugger. Personnellement je passe bien plus de temps à chercher la "petite bête" que d'écrire des lignes de code. Cette gestion des blocs logiques risquerait bien trop de me procurer des sueurs froides lors de mes recherches quotidiennes de la grosse "petite bête".

Liens:
L'excellent livre d'apprentissage de Python de Gérard Swinnen.
Pour alez plus loin sur ce langage.
Raspberry



Aucun commentaire: