Créativité et langages de programmation

Dossier écrit par NicoTupe, présenté dans l’épisode #319.

La dernière fois que je vous ai parlé d’algorithmes dans PodcastScience, nous avons abordé la machine de Turing. Depuis la deuxième partie du 20e siècle, on sait que tout language dans lequel on peut programmer une Machine de Turing est un language dans lequel on peut écrire tous les algorithmes programmables. Dit autrement, depuis plusieurs d’années, on sait que tous les langages de programmation sont équivalents, fin de l’histoire, drop mic.

Alors voila, on pourrait vivre heureux dans un monde où l’on écrit tous les programmes dans le même language depuis 30 ans et pourtant ce n’est pas du tout le cas. Wikipedia recense plus de 700 langages différents (et je suis certain qu’il y en a bien plus)! Et encore ce sont que des langages, on ne parle même pas des bibliothèques qui parfois peuvent profondément modifier un langage a tel point qu’on croirait que c’est un nouveau dialecte.

En fait, les langages de programmation et même la programmation en général est le lieu trop méconnu d’une grande créativité. Passionné d’art, de théâtre, de cinéma, c’est pourtant dans ce domaine où j’ai été le plus surpris par les idées que l’on peut y trouver.

Je vous propose donc de faire le point : Pourquoi continue-t-on à créer des langages? Pourquoi sont-ils différents? Pourquoi est-ce créatif?

Le langage ultime

En fait le langage de programmation ultime a été tenté et ça n’a pas arrêté la création de nouveau langages. Avant de m’atirer la foudre des programmeurs qui ont chacun leur langage favori, je ne parle pas de langage ultime comme un fait mais plus comme une sorte d’idéal, d’idéologie bien représentée par l’un d’eux à mes yeux : LISP. Ce langage a été créé en 1958 ce qui en fait donc l’un des plus vieux langages de programmation (14 ans avant C, 32 ans avant Python dont vous avez sans doute déjà entendu parler). Pourquoi je dis que c’est le langage de programmation ultime, d’abord parce que beaucoup le disent, par exemple Richard Stallman le décrit ainsi :

« Le langage de programmation le plus puissant est Lisp. Si vous ne connaissez pas Lisp (ou sa variante, Scheme), vous ne savez pas ce qu’est un langage de programmation puissant et élégant. Après avoir appris Lisp, vous verrez ce qu’il manque dans la majorité des autres langages. Contrairement à la plupart des langages d’aujourd’hui, qui se concentrent sur la définition de types de données spécialisés, Lisp offre peu de types de données, mais ils sont génériques. Au lieu de définir des types spécifiques, vous construisez des structures à partir de ceux-là. Ainsi, au lieu d’offrir une méthode pour définir un type de liste-de-ceci ou un type de liste-de-cela, Lisp a un type de liste qui peut contenir n’importe quel genre de données. »

En effet LISP résume en quelques concepts simple les idées de Turing et Lovelace : C’est un langage qui permet d’écrire tout algorithme et où la donnée et le langage de programmation ne font qu’un. La syntaxe de LISP est très simple, des parenthèses, une fonction et des arguments et… c’est a peu près tout.

(fonction arg1 arg2 arg3)

Ce qui fait dire a beaucoup que c’est le langage ultime c’est qu’il n’y a aucune différence dans ce langage entre les variables (les entrées de nos algorithmes), et le langage dans lequel elles sont exprimées (le code qu’on écrit), exactement comme Ada Lovelace en avait l’intuition : Un algorithme est un texte, c’est de la donnée. On peut donc le modifier comme on modifie un texte puis l’executer comme on execute un algorithme. Dit autrement, on peut utiliser ce langage pour modifier son propre comportement et l’adapter à chacun de nos problèmes, il est parfaitement maléable.

Donc LISP, langage créé en 1958, permet non seulement de tout faire mais est totalement maléable pour faire évoluer sa syntaxe au grès des besoins. Pourquoi donc a-t-on eu besoin de nouveaux langages depuis?

Eh bien en fait pour des raisons très proches de ce pourquoi il n’a jamais eu un succès universel : il est difficile à lire, difficile à utiliser, difficile à maîtriser et pas forcément le plus efficace à executer pour toutes les applications.

Les langages de programmation ce n’est pas seulement une question de ce que vous pouvez faire avec ou encore de leur efficacité à le faire mais avant tout de comment transmettre une idée, un algorithme, en instruction pour un ordinateur. Et surtout, on l’oublie parfois trop, à transmettre cette idée à d’autres humains. D’autres programmeurs qui la feront évoluer.

Finalement, croire qu’il n’y a besoin que d’un langage de programmation c’est comme croire qu’il n’y a besoin que d’une forme artistique pour exprimer toutes les idées. C’est croire que l’on devrait arrêter de faire des films, des séries, des bandes dessinées, de la musique parce que l’on a les livres et que c’est bien suffisant.

La meilleure expression

“Godel, Escher et Bach” essaie de faire un rapprochement entre les travaux du mathématicien, du plasticien et du musicien. L’avant propos de la traduction française du livre a été écrite par l’auteur, en Français. Douglas Hofstadter explique que pour lui cette traduction Française n’est pas une sous-version, ni n’est une sorte de photocopie de la version anglaise qui en aurait perdu au passage un peu de sa substance. Non, il a travaillé avec les traducteurs pour que ce soit le même livre, mais écrit en Français. Ou plus précisemment, que ce soit la projection dans la langue de Molière de l’idée qu’il a voulu transmettre dans ce livre.

Parce que oui, un livre, une oeuvre, n’est la plupart du temps que la transmission, aussi bien que possible de ce qu’a voulu dire, exprimer, un auteur. Il peut y avoir du coup quelques “bugs” : quand Sam Ramy présente son film d’horreur Evil Dead et que le public rit alors qu’il voulait les effrayer c’est un bug (qu’il réutilisera largement dans les épisodes suivants).

Beaucoup d’oeuvres se voient exprimées grâce à différents mediums, parfois largement différents : “Seul sur Mars” d’abord un livre mais prend une dimension particulièrement prennante en livre audio alors que le personnage principal, seul sur mars, nous raconte au jour le jour ce qui lui arrive. Et le film nous fait quant à lui rêver avec les décors martiens.

D’autres oeuvres paraissent ne pas pouvoir sortir d’un seul médium. Dans le fantastique livre “Des fleur pour Algernon”, on lit le journal intime d’une personne peu éduquée et peu intelligente qui va suivre un traitement pour devenir intelligente. Alors qu’au début du livre il est très complexe de déchiffrer ses dires tant l’orthographe est approximative, au fil des pages son style évolue et l’image que l’on a de lui avec.

Certains auteurs vont encore plus loin, comme limités par leur langage ils en inventent un nouveau. Dans “La horde du contrevent”, Alain Damasio propose une syntaxe pour décrire le vent. Grâce à des virgules, des parenthèses, des apostrophes, on peut voir le vent s’écouler, frapper, tuer sur les pages du livre.

La horde du contrevent au complet telle que représentée dans le livre

Ainsi, les artistes se posent déjà une question prennante en programmation : quelle est la meilleure manière de raconter mon histoire?

Tel qu’on nous les présente la plupart du temps les langages de programmation servent à communiquer avec les machines, à leur expliquer ce que l’on veut qu’ils fassent. Or, une machine n’a pas (encore) d’émotions, n’est pas sensible à une forme de style, c’est plutôt l’aboutissement d’une rationalité poussé à l’extrême qui ne devrait pas se préoccuper de tant de sensibilité.

Et pourtant non, les langages de programmation ont bien plus d’objectifs :
– ils servent à produire des algorithmes efficaces en temps de clacul,
– ils servent à rentre plus productif un développeur,
– ils servent à faire travailler plus facilement des équipes ensemble…

Bref, autant de sujets qui ne concernent pas que la rationalité et l’efficacité froidement électronique.

Penser differement

A ce stade, on comprend qu’il y a plusieurs langages mais, après tout, qu’est-ce qui peut différentier tous ces langages? Ca reste des recettes de cuisine, une suite d’instruction, avec queqlues opérations qu’on répête, d’autres qui dépendent de condition. Alors oui on imagine bien que certains vont écrire

if(condition){action1();}

et d’autres

action1() if condition

mais est-ce que ça vaut vraiment le coup d’en faire tout un dossier…?

Si les différences entre les langages se résumaient à quelques petites variation syntaxiques clairement non, ça n’aurait aucun intérêt. Rassurez vous, les développeurs sont beaucoup plus créatifs. Après tout les différences entre des langues ne se résument pas à l’ordre des mots ou à leur écriture sinon les traductions seraient beaucoup plus simples.

Prennons un algorithme en exemple : comment colorier une carte de la France, la Belgique, la Suisse et l’Allemagne avec 3 couleurs (Rouge, Bleu, Vert) sans que deux couleurs se touchent? Avoir une approche “recette de cuisine” consiste à faire ce que l’on ferait à la main : On essaie de colorier le premier pays, on choisit alors une autre couleurs pour les voisins et ainsi de suite jusqu’à ce que ça marche. Au bout d’un moment on y arrive mais c’est un peu laborieux.

Une autre manière de faire est de sortir de la logique de la recette de cuisine pour rentrer dans une logique “déclarative”. Par exemple, en Prolog, on peut colorier une carte avec 5 pays de la manière suivante :

– D’abord on lui explique que les différentes couleurs ne sont pas les mêmes

different(red,green). different(red,blue).
different(green,red). different(green,blue).
different(blue,red). different(blue,green).

– Puis on lui donne les pays qui sont voisins :

coloring(France,Belgique,Suisse,Allemagne):-
different(France,Belgique),
different(France,Suisse),
different(France,Allemagne),
different(Belgique,Allemagne),
different(Suisse,Allemagne)

– Puis on lui demande la solution :

coloring(France,Belgique,Suisse,Allemagne)

Où est l’algorithme? Eh bien c’est justement le génie de cette façon de faire, l’algorithme c’est seulement la description du problème! On appelle ce type de langage “déclaratif”, on lui déclare des règles et l’algorithme construit un ensemble logique sur lequel on peut poser des questions. Un des langages déclaratif les plus utilisés aujourd’hui est SQL (qu’utilise d’ailleurs ce site web), un langage de base de données pour lequel on décrit nos données puis on peut poser des questions : “Combien j’ai de bières brunes?”, “Quelle bières brunes ont été créés avant 1990?”, etc.

On n’a pas besoin de se préoccuper de savoir comment est calculée la solution, c’est le langage qui s’en occupe!

Ici aucun doute sur le programme, on peut facilement vérifier les règles données alors que si on l’avait fait en “impératif”, comme une recette de cuisine, on aurait pris le risque d’avoir des bugs quand on se met à parcourir les pays, à les colorer, à essayer de nouveau, etc.

Il y a toute la liberté sur le fonctionnement d’un langage, les seules limites, sont commme souvent l’imagination. Par exemple dans le langage Haskell on peut définir des suites infinies! Bien sur l’ordinateur ne peut pas les afficher en entier et plante si on le demande mais le langage a été conçu pour être paraisseux, tant qu’on ne lui demande pas de les calculer il n’essaie pas de le faire.

Il existe aussi des langages de programmation qui sont des purs exercices de style comme l’obscur “Shakespeare programming language” qui propose de programmer comme si on écrivait une pièce de molière. Voici un programme dans ce langage qui permet d’écrire “Hello World”.

[Romeo](https://en.wikipedia.org/wiki/Romeo "Romeo"), a young man with a remarkable patience.
[Juliet](https://en.wikipedia.org/wiki/Juliet "Juliet"), a likewise young woman of remarkable grace.
[Ophelia](https://en.wikipedia.org/wiki/Ophelia "Ophelia"), a remarkable woman much in dispute with Hamlet.
[Hamlet](https://en.wikipedia.org/wiki/Prince_Hamlet "Prince Hamlet"), the flatterer of Andersen Insulting A/S.

Act I: Hamlet's insults and flattery.
Scene I: The insulting of Romeo.
[Enter Hamlet and Romeo]
Hamlet:
You lying stupid fatherless big smelly half-witted coward! You are as
stupid as the difference between a handsome rich brave hero and thyself!
Speak your mind!
You are as brave as the sum of your fat little stuffed misused dusty
old rotten codpiece and a beautiful fair warm peaceful sunny summer's
day. You are as healthy as the difference between the sum of the
sweetest reddest rose and my father and yourself! Speak your mind!
You are as cowardly as the sum of yourself and the difference
between a big mighty proud kingdom and a horse. Speak your mind.
Speak your mind!
[Exit Romeo]
Scene II: The praising of Juliet.
[Enter Juliet]
Hamlet:
Thou art as sweet as the sum of the sum of Romeo and his horse and his
black cat! Speak thy mind!
[Exit Juliet]
Scene III: The praising of Ophelia.
[Enter Ophelia]
Hamlet:
Thou art as lovely as the product of a large rural town and my amazing
bottomless embroidered purse. Speak thy mind!
Thou art as loving as the product of the bluest clearest sweetest sky
and the sum of a squirrel and a white horse. Thou art as beautiful as
the difference between Juliet and thyself. Speak thy mind!
[Exeunt Ophelia and Hamlet]

Act II: Behind Hamlet's back.
Scene I: Romeo and Juliet's conversation.
[Enter Romeo and Juliet]
Romeo:
Speak your mind. You are as worried as the sum of yourself and the
difference between my small smooth hamster and my nose. Speak your
mind!
Juliet:
Speak YOUR mind! You are as bad as Hamlet! You are as small as the
difference between the square of the difference between my little pony
and your big hairy hound and the cube of your sorry little
codpiece. Speak your mind!
[Exit Romeo]
Scene II: Juliet and Ophelia's conversation.
[Enter Ophelia]
Juliet:
Thou art as good as the quotient between Romeo and the sum of a small
furry animal and a leech. Speak your mind!
Ophelia:
Thou art as disgusting as the quotient between Romeo and twice the
difference between a mistletoe and an oozing infected blister! Speak
your mind!
[Exeunt]

Et ce language, aussi étrange soit-il, permet de programmer une machine de Turing, c’est donc aussi un langage dans lequel tous les programmes peuvent être écrit. Oui, on pourrait écrire Word en Shakespeare Programming Langage, et ça serait assez classe!

Communiquer entre humains

Des différences comme celles que l’on vient de voir sont légion. Et s’il y a beaucoup de langages de programmation c’est entre autre pour cela. D’une part donc, des langages peuvent être différents pour qu’ils soient plus lisible et plus adaptés à certains types de problèmes. En fait, il est même amusant de remarquer que certains paradigmes de langages et ou de bibliothèques (ensemble de fonction dédiée pour une application) se basent sur les mêmes différences culturelles que la communication entre humains.

Dans le livre “The Culture Map“, Erin Meyer propose d’analyser les habitudes de fonctionnement des différentes cultures selon une échelle de 8 critères :

  • La communication : Est-ce que tout est sous-entendu ou tout est précisé?
  • La manière de faire son feedback : Est-ce qu’on le fait directement, à la française ou indirectement?
  • La manière de convaincre : Par l’application ou par les grand principes?
  • La manière de manager : De manière égalitaire ou de manière hierarchique?
  • La manière de faire confiance : via les taches accomplies ou via les relations?
  • La manière de montrrer son désacord : Avec de la confrontation ou sans confrontation?
  • La gestion du temps : linéaire ou plus flexible

Sur cette grille par exemple, on peut par exemple comparer plus finement la culture française et américaine :

  • Les francais discutent beaucoup plus via sous-entendu alors que les américains sont plus directs
  • Les français n’hésitent pas à faire des retours négatifs là où les américains ont tendance à les éviter
  • Les français sont plus attachés à la hierarchie que les américains
  • Les américains jugent quelqu’un beaucoup plus par ce qu’il a accompli que par du relationnel
  • Les américains ont une gestion du temps plus linéaire que les français

Bien sur tout cela sont des généralités et ne sont pas toujours vraies selon les personnes. Reste que cette grille de lecture permet de comprendre des paradigmes très différents dans les langages de programmation.

Par exemple, certains langages et plus particulièrements certaines bibliothèques font appel à un contexte fort. Dans “Ruby on Rails” par exemple, écrire seulement has_many friends dans un fichier user.rb permet au langage de comprendre qu’on a une base de donnée de “User” et une base de données “Friend”, que la base de données “Friend” va référencer un utilisateur qui nous permettra de demander quels sont les “friends” (amis) d’un utilisateur donné. Autant dire qu’avec une petite ligne de code, on s’épargne une dizaine de lignes de programmation. Tout comme la communication entre humain, discuter au sein d’un fort contexte suppose que tout le monde a ce contexte en tête sinon cela peut poser de gros problèmes de communication.

La manière de faire son feeback est aussi un sujet récurrent en programmation. En effet, les “variables” des langages de programmation ont ce que l’on appelle des types. Par exemple 1 est un entier alors que "1" est un texte. Certains langages font le choix d’être souples : on peut additionner 1 et "1", le langage va transformer "1" en entier et faire l’addition sans rien dire. D’autres vont planter et expliquer que non, on n’additionne pas des entiers et du texte, ça n’a pas de sens.

Plus intéressant encore est la gestion du temps. Finalement, tout comme une recette de cuisine, on s’attend à ce qu’un programme execute ligne après lignes. Hors certains langages ne font pas ce choix, chaque ligne s’execute sans attendre que la précédente soit finie. Vous pouvez penser que c’est l’anarchie mais cela permet d’être parfois plus efficace est plus rapide.

Et ceux-ci ne sont que queqlues choix parmis toutes les différences qui peuvent exister. En fait, il n’y a pas vraiment de limite à ce que l’on peut imaginer, créer un langage correspond en général à un besoin, une envie de pouvoir s’exprimer d’une manière particulière. Finalement, on retrouve la même chose en littérature, certains auteurs créent tout un univers fait de magiciens, d’elfes, de trolls qu’ils trouvent plus adapté pour raconter leur histoire.

Le plus étonnant dans les langages de programmation, c’est que non seulement des personnes créent des nouvelles manières de communiquer avec les ordinateurs mais que d’autres les suivent et apprennent et utilisent cette nouvelle façon de travailler. Parfois au prix d’efforts idéologiques importants. Finalement, de tous ces auteurs qui ont inventé des nouveaux vocabulaires dans leur oeuvres, combien ont été repris? Très peu. Bien sur certain univers ont perduré, les Zombies ont été réutilisés dans beaucoup d’oeuvres mais la plupart n’ont pas été plus diffusés que leur auteur initial.

Pour les langages de programmation c’est une autre histoire, de nombreuses personnes se mettent à les utiliser, les transformer, etc. La plupart des développeurs sont polyglottes et choisissent leur langue selon ce qu’ils ont besion de faire un peu comme si un auteur choisissait l’italien pour écrire une romance amoureuse et l’anglais pour un livre d’aventure.

Communiquer avec des machines

Hors de la communication avec des humains c’est bien sûr aussi la communication avec des machines qui guide l’élaboration de nouveau langages. L’essort d’internet et du Web fait qu’aujourd’hui c’est rarement une seule machine qui execute un algorithme mais plutots des dizaines voir des milliers en parallèle.

Imaginez votre bonne vieille recette de cuisine pour faire des crèpes executée par 1000 commis. De deux choses l’une, soit 999 commis ne feraient rien et un seul travaillerai soit on se retrouverai avec des commis en train de faire cuire des crèpes alors que l’on n’a pas encore de patte. Il est très compliqué d’orchestrer autant de machines et les derniers développements sont allés dans ce sens : rendre plus facile le travail en parallèle de plusieurs machines.

Ainsi il y a beaucoup de nouveaux langages de programmation et il y en aura toujours beaucoup de nouveaux créés, parce que les cultures changent, parce que les habitudes changent, parce que les besoins changent, parce que c’est intéressant, parce que c’est amusant, parce que c’est un des nombreux moyens qu’a trouvé l’être humain pour exprimer sa créativité.

 

Références

  • https://en.wikipedia.org/wiki/Semantics#Computer_science : Plein de syntaxe différentes pour la même chose
  • https://en.wikipedia.org/wiki/Comparison_of_programming_languages : Comparaison langages
  • Seven languages in seven weeks : https://www.amazon.fr/Seven-Languages-Weeks-Bruce-Tate/dp/193435659X/ref=sr_1_1?ie=UTF8&qid=1524127105&sr=8-1&keywords=seven+languages+in+seven+weeks

 

Derniers épisodes