les décorateurs, ou pourquoi j'aime toujours la programmation 19


Je programme des ordinateurs depuis 30 ans, et tous les 5 ans environ je me demande pourquoi je continue à aimer ça. Et à chaque fois je découvre quelque chose qui provoque un « éclair haha », une de ces illuminations cérébrales où l’on entrevoit le Génie dans toute sa Pureté avant de retomber sur sa chaise motivé pour les 5 ans suivants.

Le dernier a été provoqué cette semaine par les « décorateurs » de Python, dont je vous parlerai plus bas.

Ma première extase informatique date donc de 1980 environ, je m’en souviens comme si c’était hier. Mon PET 2001 se programmait en BASIC, un langage qu’on a bien fait d’oublier. Mais une astuce (ou plutôt une horreur) sur le PET permettait de faire en sorte que le programme s’ajoute des lignes de programme à lui-même ! J’avais ainsi modifié le jeu « animals » de Creative Computing pour qu’il « apprenne » de nouveaux animaux de façon permanente. Un programme qui s’améliore lui-même, ça me fait encore rêver, 30 ans après…

Le second flash date de 1985, la grande époque de Turbo-Pascal. Un jour j’ai vu quelque chose comme ça:

function factorielle(n: integer): integer;
begin
    if n <= 1 then result := 1 else result := n*factorielle(n-1);
end;

Une fonction qui s’appelle elle même ! Merveilleuse récursivité, chaque fois que je te revois, je me rappelle mon émoi à notre première rencontre.

Les années 1990 sont riches en « haha »s plus rapprochés mais moins intenses pendant mes études à l’EPFL : la programmation fonctionnelle (LISP), le moteur d’inférence de Prolog,  la généricité en d’ADA, qui semblait à l’époque bien plus importante que la programmation orientée objet, juste entrevue.  Et Occam, précurseur de la programmation parallèle trop tôt disparu.

Un peu avant 1995, je découvre LabView et le flash se produit lorsque je comprends que c’est un véritable langage de programmation complet… sans code ! Ou plus exactement que le langage graphique de LabView permet de programmer directement au niveau sémantique. Adieu « syntax error » ! Quel dommage que NI vende cette merveille si cher et l’aie blindé de brevets défendus avec vigueur : un des concepts les plus innovants en programmation reste confiné à un cercle d’initiés alors qu’il aurait pu révolutionner l’informatique.

un programme LabView avec blocs concurrents, boucles, tests etc.

Vers 2000, je constate qu’on m’avait menti : C++ est beaucoup plus qu’un C amélioré. C’est un grand festival de « haha » en quelques jours : les références, la const-correctness, l’héritage multiple, la surcharge des opérateurs, les exceptions , le RTTI, mais surtout la Standard Template Library(STL). Java et .NET ont des librairies de classes et fonctions à tout faire, mais C++ a une « méta-librairie », un système qui produit du code très optimisé pour chaque opération spécifique, en utilisant notamment le concept d’itérateur.

En 2005, je lis Andrei Alexandrescu "Modern C [plus plus] design: generic programming and design patterns applied" (2001) Addison-Wesley ISBN:0201704315 WorldCat Goodreads Google Books  . Flash d’illumination : c’est génial, mais j’ai pas tout compris. Je le relis: re-flash: c’est encore plus génial que je pensais. Je le lis une troisième fois (à part « Les Robots » d’Asimov je n’ai jamais lu un livre 3 fois) : ça y’est je suis converti au « policy based design« , une approche révolutionnaire de la programmation autorisée par une exploitation transcendantale de la combinaison C++, STL, et #macros. Les C++istes trouveront un petit tutoriel ici qui les convaincra à la fois de la puissance de cette approche, et de sa lourdeur d’écriture…

Et nous voici donc en 2010 où, poursuivant ma découverte de Python, je tombe sur ça:

@cache()
def fib(n):
    if n &lt; 2:
      return 1
    return fib(n-1) + fib(n-2)

Même ceux qui ne parlent pas Python reconnaîtront une fonction récursive calculant le n-ième terme de la suite de Fibonacci, mais il y a une astuce : le @cache().

Ca s’appelle un « décorateur » et en l’occurrence, le @cache() ajoute un comportement de « mémoization » (déjà mentionné ici) à la fonction : si on appelle la fonction fib pour un n déjà calculé précédemment, le @cache() va renvoyer le résultat mémorisé avec un gain de vitesse appréciable plutôt que de recalculer la fonction, et ceci sans rien changer à la fonction elle-même!

Et bien sur, le décorateur est lui-même écrit en Python : c’est , et c’est une version simplifiée d’un cache plus sophistiqué fourni avec la librairie Python. Une librairie de décorateurs très variés est en train de naître (voyez par exemple les machines d’états, chers collègues…), mais il me semble que les décorateurs permettent surtout de réaliser des choses ressemblant beaucoup aux « politiques » d’Alexandrescu avec une syntaxe plus simple qu’en C++. (Pythonistes, voyez ce tutoriel)

C’est pour cela que j’aime toujours la programmation : les langages gagnent en pouvoir d’abstraction en même temps que moi, et vice-versa. Chaque fois que je programme dans un nouveau langage, tout est plus simple, plus clair et plus vite juste que dans le précédent, et, luxe suprême,  je dois presser moins de touches. Les ordinateurs sont restés des esclaves qui camouflent leur stupidité derrière une vitesse stupéfiante, mais les concepteurs de langages, eux sont devenus vraiment malins. Merci Guido, grâce à toi j’en reprends pour 5 ans.

Laissez un commentaire

19 Commentaires on "les décorateurs, ou pourquoi j'aime toujours la programmation"


Invité
JPB
2 mois 3 jours plus tôt

AAhh le PET CBM, mon premier émoi début des années 1980 vers 14ans , également, son merveilleux clavier, son écran « vert », son super magnéto K7 pour enregistrer nos programmes en priant pour que la bande ne s’abime pas, le langage basic puis rapidement les interruptions assembleur et sa programmation pour avoir des affichages rapides dans la programmation de jeux…. un tout petit monde de passioné et déjà Apple en concurrence.. 😉

Invité
2 ans 6 mois plus tôt

oh ça donne envie, là je viens de mettre 14 ans de post-production au placard pour me lancer dans la grande aventure programmation plutôt web mais pas que, au menu des cours : html/css/javascript puis le binome php/sql suivi de java/objective-c … j’ai 18 mois de recablage du cerveau à faire ça va être amusant… à ce propos est-ce que ceci vous semble pertinent ?
http://courses.cs.vt.edu/csonline/Algorithms/Lessons/index.html

Invité
3 ans 1 mois plus tôt

Et pourtant, il vous reste tellement de choses à découvrir (tout comme à moi, et à chacun d’entre nous) !

Pour la suite, puis-je vous suggérer les langages fonctionnels, tel Haskell ? Les assistants de preuve comme Coq ? Et pourquoi pas des domaines inexplorés, comme l’écriture d’un petit compilateur pour votre propre langage ?

Quant à moi, je pense qu’il est grand temps que j’aille lire le Modern C++.

Invité
4 ans 6 mois plus tôt

c’est sûr que y’a plein de choses intéressantes là dedans et qu’une fois qu’on pourra diriger les machines par la pensée on pourra se voir trouver des réponses à nos pensées par des machines.
pour le moment je gère quelques trucs pour le web, le php, le sql, le css et le html, le Js et tous ces langages promettent de donner des choses encore passionantes :) je vais voir un peu ces liens

Invité
4 ans 6 mois plus tôt

Bouh tout ça me rend un peu triste…
je me souviens qu’il y a un an quand j’ai changé de job, je me suis dit la veille que c’était certainement la dernière fois de ma vie que je programmais…

J’ai eu la tentation d’apprendre Pyhton et j’ai renoncé en me disant qu’il était trop tard pour moi…votre évocation de Modern C++ me fait le même effet ! bouh moi aussi j’aime toujours la programmation!!!

Invité
4 ans 6 mois plus tôt

faut pas renoncer à un plaisir parce que vous ne le pratiquez plus professionnellement, voyons !
Un moyen très efficace de se frictionner les neurones tout en apprenant un nouveau langage comme Python, c’est le « Project Euler« . Une fois que vous avez trouvé une solution que vous trouvez acceptable à un problème, vous verrez les solutions 10’000x plus efficaces proposées par d’autres en divers langage, ça permet de progresser vraiment vite.

Invité
4 ans 6 mois plus tôt

houla on voit l’étoffe d’un touche à tout comme je les aime. j’ai un parcours plus modeste mais avec beaucoup de langages aussi

Invité
4 ans 6 mois plus tôt

J’ai rien compris, c’est normal docteur ?
😀

Sinon, je comprends aussi la frustration en ce qui concerne les sciences auprès de mes proches.

Invité
4 ans 6 mois plus tôt

Bien résumé !

Le @cache m’a moins impressionné, car j’avais déjà vu la même chose en PL/SQL (langage pas très sexy mais bien fichu pour développer la base de données d’Oracle). C’est tout con quand on y pense.

Invité
hyperbate
4 ans 6 mois plus tôt

J’aime bien ce texte. Je remarque que je manque de courage pour découvrir de nouveaux paradigmes, de nouveaux langages,… Pour la programmation « par icônes », il existe des systèmes dans le multimédia (avant tout destinés à gérer des entrées/sorties) : IconAuthor (mort), MaxMSP ou encore PureData.

Invité
4 ans 6 mois plus tôt

J’aime beaucoup votre néologisme « éclair haha ».
Dans un autre domaine beaucoup moins savant mais pourtant tout aussi abstrait, je ressens ce qui pourrait s’y apparenter dans une sorte de « flash inventif », c’est-à-dire quand une idée qui trottait floue dans mes rêves prend soudain forme lisible sous l’éclairage de ma propre compréhension. Bref c’est chouette tout ça ! ;o)

Invité
4 ans 6 mois plus tôt

merci, mais ce n’est pas de moi : « Haha » ou l’éclair de la compréhension mathématique est le titre d’un livre du regretté Martin Gardner. Mais on parle bien de la même chose :-)

Un pote m’a dit une fois qu’on peut ressentir ça à volonté prenant du LSD. Je lui ai répondu « peut-être, mais on a moins de mérite »…

Invité
Benoît
1 an 7 mois plus tôt

J’ai adoré ce livre. Mais je n’ai pas trouvé la réponse à certaines énigmes.

C’était dans ma jeunesse. Je vais essayer de le retrouver grace à votre pointeur.

Invité
4 ans 6 mois plus tôt

:-)
Nous ne sommes pas sur facebook, donc il n’y a pas de bouton « j’aime » sous la citation de la réponse à votre copain, mais nous sommes bien d’accord et je n’en pense pas moins 😉

Invité
Guillaume
4 ans 6 mois plus tôt

J’ai eu le même flash concernant Modern C++ Design et la même réaction -> relecture !

Allez, encore un flash sur C++ ? allez donc voir ce qu’on peut faire avec l’idiome SFINAE, ça vaut son pesant de cacahuètes !

Sinon pour le cas présent en plus propre (mais ça n’a pas la portée de ce que permet les décorateurs de python) Y’a gcc qui offre un attribute particulier :

long fib(long) __attribute__((pure));

c’est vraiment une chouette activité la programmation, intellectuellement y’a pas plus complet je pense !

Invité
4 ans 6 mois plus tôt

Ah oui, j’ai vu « substitution failure is not an error » une fois, mais je n’y ai pas trop réfléchi… A l’époque, la librairie Boost en était à ses débuts, là je vois « enable_if » pour la première fois et on dirait effectivement que Boost est devenue une super extension Alexandrecu-ifiée de la STL… intéressant… très intéressant…

Bon, quelqu’un connait un vrai beau projet en C++ qui tire vraiment parti de ces idiomes ? Ca m’intéresse de m’y replonger…

Invité
Culand
4 ans 6 mois plus tôt

Bravo pour ce stupéfiant et brillant résumé de nos 30 dernière années de passion informatique…

Puisse nonobstant ce qui sera lu comme un charabia++ toucher un tant soit peu le profane qui tomberait sur ces lignes !

J’ai bien pour qu’au contraire il nous perçoive, toi, moi, et nos semblables, comme des grands malades…

Aujourd’hui on dit geeks…

Combien de fois ne me suis-je senti incompris et surtout impuissant en rentrant chez les miens incapable de leur faire saisir et partager tout ce qui faisait mon passionnel bonheur d’informaticien touché par la grâce d’un nouveau paradigme de programmation…