Lors d’un récent événement interne célébrant le lancement de Java 17, on m’a demandé de donner une conférence sur l’avenir du langage. Je n’ai pas de hotline vers Oracle, j’en ai donc profité pour dépoussiérer mon diplôme en linguistique et souligner à quel point la nature et l’évolution relativement glaciaire des langues humaines n’est pas sans rappeler ce que l’on peut voir dans les langages informatiques, compressés en quelques décennies. Ceci est le premier des deux messages basés sur cette conversation.
À bien des égards, Java, Perl, Haskell ou Lisp ne ressemblent en rien aux langages humains. Les lignes de code ne ressemblent à des phrases en anglais qu’à un niveau très superficiel. Java est l’une des nombreuses spécifications permettant à une machine numérique de répondre à vos attentes, exprimées à l’aide d’un petit ensemble de mots-clés anglais, de caractères spéciaux et de règles structurelles pour faciliter la tâche du cerveau du locuteur, c’est-à-dire du programmeur. Quelle que soit sa complexité, le comportement d’un programme découle sans ambiguïté de son contenu. Bien sûr, vous pouvez vous cogner la tête contre le mur Pourquoi il fait ce qu’il fait, mais avec suffisamment de globes oculaires, même le pire code spaghetti est déterministe.
Ce n’est pas le cas avec le langage humain. Transmettre des déclarations de fait (le train pour Amsterdam a cinq minutes de retard) n’est qu’un cas d’utilisation ennuyeux. Nous ne parlons pas seulement pour informer, mais aussi pour créer des liens, impressionner, menacer et persuader. Nos mots n’ont même pas besoin d’avoir un sens logique. Déformer le sens est tout l’intérêt de l’humour – et d’une grande partie de la politique aussi. La plupart d’entre nous choisissent de ne jamais programmer, mais tout le monde acquiert une maîtrise de base de sa langue maternelle avant l’âge de l’école primaire. Nous avons évolué pour parler ; la capacité est câblée dans des zones dédiées de notre cerveau et les langues humaines reflètent la complexité et la nature illogique et désordonnée des systèmes qui ont émergé au cours de l’évolution.
Une petite boîte à outils pour construire n’importe quoi
Et pourtant, il y a un grand point commun : les langages humains et informatiques doivent être Turing terminé. Un ensemble limité d’outils (mots et règles syntaxiques) peut exprimer une gamme infinie de sens. Si un nouveau concept a besoin d’un mot, la communauté linguistique en empruntera ou en inventera un, généralement en combinant des mots existants. La langue doit donc être suffisamment riche pour exprimer n’importe quel sens mais ne peut réussir si elle est trop difficile à apprendre. Il doit être gérable par le cerveau humain moyen.
Vous n’avez pas besoin de tous les outils exposés dans la quincaillerie pour faire votre travail. L’alphabet phonétique international fournit un symbole pour tout son utilisé dans les langues du monde. Vous seriez surpris de la polyvalence de votre langue, de vos lèvres, de votre gorge et de vos cordes vocales. Cependant, aucune langue ne les utilise tous. Ils font des compromis sur ce qu’ils emballent dans leur boîte à outils. Un exemple classique : le chinois mandarin est une langue à tons. Les variations dans la façon dont votre voix monte et descend (contour de hauteur) déterminent le sens d’un mot.
maman blanche – mère
engourdi a – le chanvre
Cheval m – cheval
gronder mais – gronder
Source : fluentu.com
Les quatre variétés tonales de ma sont aussi différents des locuteurs natifs du chinois que au revoir, branche, la baie, et huer sont aux oreilles anglaises. Le mandarin vous donne effectivement quatre voyelles distinctes pour le prix d’une. S’il est si puissant, pourquoi toutes les langues n’ont-elles pas adopté cette fonctionnalité ? Eh bien, le mandarin est restrictif dans d’autres domaines. Les syllabes ne peuvent commencer que par une seule consonne et doivent se terminer soit par une voyelle, soit par une m ou ng sonner. Un mot comme scénario, avec un nombre impressionnant de six consonnes, ne peut pas se produire et est prévisible difficile à maîtriser pour les locuteurs chinois – tout comme les Européens ont du mal à obtenir les bons tons.
Maîtriser l’absence d’état mutable et éliminer les effets secondaires dans un langage purement fonctionnel issu de Java, c’était comme réapprendre le chinois. Toute façon radicalement différente de faire les choses a cet effet. Et ils ne se combinent souvent pas bien. Scala essaie de marier orientation objet et programmation fonctionnelle. Même si j’aime Scala, la richesse des fonctionnalités n’est pas tout ce qui compte et je pense que la courbe d’apprentissage abrupte le maintient dans une niche.
Pas de révolution, mais évolution
Les langues évoluent lentement. Ce qui était parlé en Grande-Bretagne au début du Moyen Âge s’appelle anglo-saxon, alias le vieil anglais (500-800 après JC) et cela ne ressemble guère à l’anglais moderne. Prenez les premiers vers du poème épique Beowulf. Toute ressemblance avec la Terre du Milieu n’est pas une coïncidence ; Tolkien l’a enseigné à Oxford.
Comment ! Nous Gardena in geardagum,
eod-cyninga þrym gefrunon,
hu ða æþelingas ellen fremedon.
Les envahisseurs francophones ont apporté une refonte massive du vocabulaire, de l’orthographe et de la grammaire. À l’époque de Geoffrey Chaucer et de ses Contes de Canterbury (1400), on se débrouille sans recourir constamment aux notes de bas de page.
Qu’est-ce qu’April, avec ses shoures de suie,
La droghte de mars a perced à la racine,
Et baigné chaque veyne dans swich licour,
Dont la vertu engendrée est la farine ;
Notez maintenant comment notre orthographe actuelle est restée remarquablement stable depuis l’écriture de Shakespeare. Le Songe d’une nuit d’été (1595).
Maîtres, vous devriez réfléchir avec vous-mêmes. Faire entrer – Dieu nous protège – un lion parmi les femmes est une chose des plus terribles.
Des mots comme pensée et rire reflètent encore la façon dont ils étaient prononcés il y a mille ans (c’est-à-dire avec le son rauque comme dans le Loch écossais). L’orthographe anglaise est conservatrice, comme la syntaxe de Java, c’est pourquoi nous pouvons lire Shakespeare exactement comme il a été écrit il y a 400 ans et que la dernière JVM peut exécuter un code source vieux de vingt ans.
L’histoire de plus de 25 ans de Java semble turbulente par rapport à la période d’évolution de la langue anglaise. Nous avons eu de nombreuses améliorations syntaxiques majeures (génériques, boucles for), mais les changements de paradigme majeurs comme l’évolution vers les lambdas et les flux sont rares. L’immuabilité en sera probablement une autre, avec l’introduction des records. Voici comment nous faisions les sommes avant 1.5.
public double cumulativeSalaries(List employees){
double accum = 0;
for (int i=0; i<employees.size(); i++){
Object item = employees.get(i);
if ( item instanceof Employee){
Employee e = (Employee)item;
accum += e.isActive() ? e.getSalary() : 0;
}
}
return accum;
}
L’approche basée sur les flux avec les lambdas n’est pas du sucre syntaxique. Il fait abstraction de l’itération, du filtrage et de la sommation et s’éloigne d’un impératif vers un style fonctionnel. Ces changements radicaux doivent être introduits en douceur, ou ce ne sera plus le même langage.
public double cumulativeSalaries(List<Employee> employees){
return employees.stream()
.filter(Employee::isActive)
.mapToDouble(Employee::getSalary)
.sum();
}
Démocratie évolutionniste et dictature bienveillante
Le langage humain est dans le domaine public. Aucun pays ou communauté linguistique ne détient le droit d’auteur sur l’anglais. Le changement est progressif et non réglementé. Les gouvernements qui contrôlent la pensée par des réformes linguistiques imposées sont l’étoffe des romans dystopiques. L’évolution du langage informatique peut être démocratique, mais elle doit être réglementée de manière centralisée dans une large mesure. Et plus la communauté d’utilisateurs est grande, plus elle évite les changements de rupture. Plus le canon des textes ou du code source est grand, moins il devient intéressant d’introduire des changements qui rendent votre ancien code inutile ou vos livres illisibles. Introduisez trop de changements radicaux, et vous ne pouvez plus appeler cela le même langage. C’est arrivé à Perl 6. La compatibilité avec les anciennes versions de Perl n’était plus un objectif, et le nom a été changé en Raku.
Voici les deux points à retenir de ce petit exercice en comparaison : Premièrement, les langues sont pleinement expressives (Turing terminé) et elles n’ont pas besoin de partager le même ensemble d’outils grammaticaux pour l’être. Deuxièmement, leur évolution doit être progressive et ne pas introduire trop de changements de rupture, sinon ce ne sera plus le même langage. Dans la deuxième partie, nous verrons ce que cela peut signifier pour le développement futur des langues.
Photo de SHVETS production de Pexels