5 langages sans programmeurs

Des langages de programmation quoi que bien conçu n'ont connu aucun succès. Pourquoi?

C'est une question qu'il faut se poser avant de créer un nouveau langage, car on voit qu'il en apparaît plusieurs chaque année, mais seront-ils adoptés par les programmeurs?

Les cinq langages suivants ont tous des caractéristiques intéressantes, des fonctions de haut niveau, une syntaxe claire à l'inverse de Perl ou PHP. Mais apparemment, il leur a manqué quelque chose pour devenir populaires.

Icon

L'idée était de combiner les capacités de pattern-matching de SNOBOL avec la structure d'un langage universel comme ALGOL. Sa syntaxe est proche de Pascal et C, il a la simplicité des langages de scripts, avec des générateurs, et autres fonctions innovantes pour l'époque de sa création.
Il veut se particulariser avec une pseudo orientation but: si a alors b devient ceci: si a (on essaie l'action a), alors b, (si cela réussit on passe à b, sinon on continue avec l'instruction suivante). On pourait faire la même chose avec un if classique.

Exemple de code:

procedure disp(s1)
   while i: s1[i] do {
      c = s1[i]
      write(i)
   }
end

s = "hello"
disp(s) 

Tout cela n'a eu aucun succès, peu d'adeptes sont venus adorer l'icône. Cela n'a pas découragé un groupe d'universitaires d'écrire une version orientée-objet, Unicon. Unicon n'a pas eu plus de succès bien qu'il y ait de nouvelles versions d'année en année.

Oz

Il se veut magique, ce pourquoi la référence au magicien d'Oz. La concurrence est intégrée au langage avec le mot réservé thread qui ouvre un bloc à exécuter en concurrence avec d'autres.
Il incorpore de multiples paradigmes, comme la programmation logique et fonctionnelle et par contraintes à coté d'un code impératif. Comme Python apparu la même année, il intègre Tcl/Tk pour la construction de GUI.
La syntaxe de base est claire, mais on peut arriver facilement à de la cryptographie comme on le voit sur l'algorithme du crible d'Eratosthènes écrit en ce langage:

fun {Sieve Xs}     
   case Xs of nil then nil     
    [] X|Xr then Ys in        
        thread Ys = {Filter Xr fun {$ Y} Y mod X \= 0 end} end
        X|{Sieve Ys}
   end
end

Son implémentation dans Mozart fonctionne sur une machine virtuelle qui le rend plutôt lent, son principal défaut.

Apparu en 1991, ce langage très complet a été maintenu jusqu'en 2008 mais la magie n'ayant pas opéré, on a refermé la partition.

Pike

Cette version de C en fait un langage moderne, doté de l'orientation-objet sans la complexité de C++. Il dispose d'un garbage collector. Ainsi il offre une syntaxe usuelle sans les inconvénients de C comme la gestion mémoire manuelle.
Mais il a cependant l'inconvénient d'être interprété. Même augmenté d'objets, si l'on n'a plus accès aux bibliothèques de fonctions compilées à partir de C on perd l'intérêt originel de ce langage: la portabilité.

Une classe en Pike:

class Car
{
  inherit Vehicle;
  int speed;

  void setSpeed(int s)
  {
    speed = s;
  } 
}

Apparu en 1994, il est toujours maintenu. Pike signifie brochet en anglais, c'est le logo du langage mais très peu de programmeurs ont mis ce poisson dans leur assiette.

Seed 7

C'est un langage qui se veut de plus haut niveau que Java. Il supporte le multiple dispatch et est orienté objet. Il est aussi extensible: le programmeur peut développer le langage lui-même et ajouter de nouvelles commandes.

Exemple montrant une structure de contrôle évoluée...

for a, b
where a.name = b.name do
   writeln( a <& " et " <& b <& " sont le même objet");
end for;

Mais le where aurait pu être remplacé par un if.

En voulant se montrer plus strict, il supprime le break et continue considérés comme des gotos cachés. Selon mon expérience, cela doit manquer.
Apparu en 2005, il est mis à jour jusqu'à aujourd'hui. Seed signifie graine, pour autant, elle n'a pas germé, peu de programmeurs sont venus l'arroser.

Euphoria

Conçu dans l'euphorie apparemment il se veut simple et permettant une programmation plus facile. Il a d'emblée plû aux programmeurs BASIC. Il a des variables dynamiques comme Python, est aussi interprété ou compilé, dispose d'un garbage collector et fonctionne sur Linux, Mac et Windows. Il dispose d'interfaces à plusieurs bibliothèques de GUI et de bases de données. A coté de cela, il dispose de type étranges, atom et sequence dont on ne discerne pas l'avantage.

function disp(atom str)
   for i = 1 to str.length
     puts(str[i])
   end for
end function

atom str="hello"
disp(str)

Il a été développé de 1993 à 2010 avant que l'euphorie ne se transforme en ennui, par manque d'adeptes pour participer à la partie.

Quelques leçons peuvent en être tirées...

Chacun de ces langages apporte des particularités dans les types ou la syntaxe. Mais on ne devrait pas changer ce à quoi sont habitués les programmeurs simplement parce que cela paraît mieux: il faut qu'il y ait un avantage pratique réel.
On de devrait pas créer un langage simplement pour être différent mais pour apporter quelque chose de plus. Ainsi, Niklaus Wirth n'a pas créé Pascal pour avoir son propre langage, il a d'abord proposé une version modifiée d'ALGOL pour en corriger les défauts. Et puisqu'ALGOL W a été ignoré par la profession, il a alors créé un langage qui a totalement eclipsé ALGOL, preuve que ses idées étaient justes.

Certaines idées paraissent intéressantes sur le papier mais une fois mise en pratique, le sembleront moins. Par exemple, faire un langage extensible. Réutiliser le code devient difficile si chaque programme a des types d'instructions qui lui sont propres!

Une autre leçon, c'est que pour devenir populaire, un langage a besoin avant tout d'une large bibliothèque de fonctions. Python par exemple, créé en 1991, bien que très simple d'emploi, n'a été largement adopté qu'en 2001, une fois doté de toutes les fonctions utiles dans tous les domaines. Julia comme Oz offre de nombreuses possibilités, mais il devient lui populaire grâce à ses bibliothèques scientifiques. PHP et Perl, tous deux d'une conception plus que discutable, sont largement utilisés parce que le langage en réalité, c'est l'API.

Donc il ne sert à rien de créer un nouveau langage avec un code si simple qu'on peut écrire 10 fois plus vite, de nouvelles structures de données et de nouvelles capacités pour transposer facilement la réalité en code, si l'on ne dispose à coté de cela de toutes les fonctions dont les programmeurs ont besoin pour réaliser leurs applications et qui permettent en fait de réaliser un programme 1000 fois plus vite.

Finalement si l'on veut créer un nouveau langage, on doit s'assurer de deux choses:

  1. Il apporte une fonctionnalité unique dans un domaine qui le rend indispensable.
  2. Il peut accéder d'emblée à une large bibliothèque de fonctions, permettant de réaliser des applications utilisables en production.
  3. Il n'est pas obligé qu'il ait une "killer app", mais si on veut qu'un nouveau langage retienne l'attention il ne devrait pas être rendu public sans une application qui démontre son intérêt.

Il n'est pas nécessaire qu'il soit soutenu par une grande marque, mais sans cela il lui faudra plusieurs années avant d'espérer une large adoption. La liste des langages les plus populaires confirmera tout cela.