title: Pliant
text: # Pliant
  
  Dans l'histoire des langages informatiques, Pliant est la première tentative de connecter les branches C et LISP. Le langage de programmation Pliant a été initié en 1984 par Hubert Tonneau, et publié pour la première fois en 1999. Il est distribué sous la licence GNU GPL v2.
  
  ## Objectif et philosophie
  
  L'objectif de Pliant est de concilier l'efficacité d'exécution et l'expressivité.
  
  ## Positionnement de Pliant dans les langages de programmation
  
  Pliant est un sur-ensemble du langage C : tout programme écrit en C peut être traduit ligne à ligne en Pliant, bien que la syntaxe soit différente. En revanche, Pliant n'est pas un sur-ensemble du C++, car son modèle d'objet est différent, basé sur les instances et non sur des classes. Pliant présente l'efficacité brute du C, mais permet une bien meilleure expressivité et flexibilité grâce à trois de ses caractéristiques clés :
  
  * la métaprogrammation
  * la réflexivité
  * la compilation dynamique
  
  ### La syntaxe
  
  Contrairement à beaucoup de langages de programmation, la syntaxe par défaut de Pliant ne suit pas le modèle du C : elle aurait été choisie la plus simple et la moins "chargée" possible pour rendre les programmes plus faciles à lire et faciliter les petites extensions pour des applications particulières. Elle utilise l'indentation et supprime la plupart des parenthèses, crochets et autres accolades. À titre d'exemple, voici la comparaison de la fonction factorielle en C, en Pliant, et en Python (exemple d'un autre langage qui a adopté une syntaxe différente du C) :
  
  | Fonction factorielle en C | Fonction factorielle en Pliant | Fonction factorielle en Python |
  | - | - | - |
  | /* Fonction factorielle en C */ int factorielle(int x) { if (x < 2) { return 1; } else { return x * factorielle(x-1); } } | # Fonction factorielle en Pliant function factorielle x -> y arg Int x y if x<2 y := 1 else y := x*(factorielle x-1) | # Fonction factorielle en Python def factorielle(x): if x < 2: return 1 else: return x * factorielle(x-1) |
  
  NB : des accolades pourraient être retirées de la version en C mais, des erreurs pouvant être aisément commises en cas d'imbrication de plusieurs blocs, cela ne correspondrait pas aux normes de codages habituellement recommandées.
  
  Il convient de noter que Pliant permet en particulier de changer sa propre syntaxe.
  
  ## L'apport de Pliant à la métaprogrammation
  
  Un langage informatique défini les outils dont l'humain, en l’occurrence le programmeur, disposera pour spécifier à la machine ce qu'elle doit effectuer. Il existe de très nombreux langages informatiques. De chaque nouveau langage, on tend à argumenter qu'il est meilleur que tel autre car il dispose de telle ou telle fonctionnalité plus pratique, c'est-à-dire de tel ou tel moyen d'expression fourni au programmeur. De fait, les discussions concernant les langages informatiques ont souvent une forte connotation idéologique.
  
  Dans cette logique, le concepteur du langage et le programmeur ne sont pas sur un pied d'égalité. Le concepteur fixe les règles, le programmeur doit les appliquer. Si les règles fixées ne sont pas adaptées à la situation, c'est-à-dire au programme à écrire, le programmeur n'a pas de véritable marge de manœuvre, autre que de changer de langage, ce qui revient à déplacer le problème plutôt que le résoudre. En effet, les applications complexes nécessitent de faire face à toute une série de difficultés, ce qui nécessiterait de mettre en œuvre simultanément toute une série de langages pour bénéficier de toutes les fonctionnalités optimales, mais pose alors un problème insurmontable qui est l'interface entre ces différents langages qui ne va jamais de soi.
  
  Il existe deux exceptions à la règle du langage rigide où le concepteur fixe une fois pour toutes les règles :
  
  * LISP, créé en 1959.
  * Pliant, créé en 1999.
  
  Avec ces deux langages, quand on désire disposer d'une nouvelle fonctionnalité, on peut l'ajouter au langage plutôt que de devoir changer de langage. Il existe cependant deux différences fondamentales entre LISP et Pliant.
  
  Tout d'abord, dans LISP aucun garde-fou n'entrave cette liberté. Or, comme au niveau social, ce qui garantit la liberté maximale effective, ce n'est pas l'anarchie, c'est-à-dire l'absence totale de règles, mais quelques règles très générales qui facilitent la cohabitation des différentes activités.
  
  Ensuite, les concepteurs de LISP ne se préoccupaient pas tellement de la problématique d'efficacité, car à l'époque on pensait que l'augmentation exponentielle de la puissance des machines la rendrait rapidement sans objet, ce qui n'a pas eu lieu.
  
  Un langage de programmation fait l'interface entre le langage humain, représenté sous forme de graphe, et le langage machine qui est une liste d'instructions. Outre le fait qu'il n'a pas un mode d'exécution procédural, Lisp se distingue des autres langages par sa capacité de réécriture (métaprogrammation) ; en effet, la capacité réécriture de Lisp est Turing-complète sur la partie arbre (langage humain). Dans Lisp la puissance d'expression est maximale, mais l'exécution est figée, laissée au compilateur.
  
  La capacité de réécriture de Pliant est également Turing-complète sur la partie instructions, ce qui fait de Pliant le seul langage à faire le lien entre les deux représentations. À chaque nœud de l'arbre est rattaché une liste d'instructions élémentaires et l'argument résultat.
  
  