Selon la description faite par les développeurs du langage, Wren est un petit langage de script concurrent rapide basé sur des classes. Il s’apparente à Smaltalk dans un package de Lua avec un soupçon d’Erlang et enveloppé dans une syntaxe moderne et familière, peut-on lire sur la page officielle du langage. Bien évidemment, chaque équipe de développement d’un langage peut aligner tous les superlatifs qui lui vient à l’esprit pour qualifier son langage. Aussi pour mieux comprendre les caractéristiques mis en avant par les développeurs, ces derniers donnent les détails suivants :
- Wren est petit, car l’implémentation de la machine virtuelle est inférieure à 4 000 points-virgules. Vous pouvez parcourir le tout en un après-midi. C’est petit, mais pas dense. C’est lisible et commenté avec amour ;
- Wren est rapide, car avec un compilateur rapide en un seul passage pour un bytecode réduit et une représentation d’objet compacte, Wren peut rivaliser avec d’autres langages dynamiques ;
- Wren est basé sur des classes : il existe de nombreux langages de script, mais beaucoup ont des modèles d’objets inhabituels ou inexistants. Wren place les classes au premier plan et au centre ;
- Wren est concurrent : les fibres légères sont au cœur du modèle d’exécution et vous permettent d’organiser votre programme en un ensemble de coroutines communicantes.
- Wren est un langage de script : il est destiné à être intégré dans des applications. Il n’a aucune dépendance, une petite bibliothèque standard et une API C facile à utiliser. Il se compile proprement en C99, C++98 ou quoi que ce soit de plus récent.
Ci dessous, un aperçu du code Wren :
Code Wren : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | System.print("Hello, world!") class Wren { flyTo(city) { System.print("Flying to %(city)") } } var adjectives = Fiber.new { ["small", "clean", "fast"].each {|word| Fiber.yield(word) } } while (!adjectives.isDone) System.print(adjectives.call()) |
Un premier parcours du code montre un code moins verbeux que d’autres langages de script. Toutefois, est-ce un argument de poids pour pousser les développeurs à se ruer vers lui ? Bien évidemment, non. Pour convaincre les programmeurs qui majoritairement sont réticents à apprendre de nouveaux langages, Bob Nystrom, le développeur à l’origine de Wren, ayant également développé Magpie et Finch, et travaillant actuellement sur Dart, explique que Wren a été créé sur les bases de Lua. SI vous aimez Lua et la programmation orientée objet, vous aimerez certainement Wren. En guise d’exemple, Nystrom présente ces deux bouts de code en appliquant le modèle de la programmation orientée objet.
En Lua, ça donne ceci :
Code Lua : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | -- account.lua Account = {} Account.__index = Account function Account.create(balance) local acnt = {} -- our new object setmetatable(acnt,Account) -- make Account handle lookup acnt.balance = balance -- initialize our object return acnt end function Account:withdraw(amount) self.balance = self.balance - amount end -- create and use an Account account = Account.create(1000) account:withdraw(100) |
En Wren, le même code donne cela :
Code Wren : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | //account.wren class Account { construct new(balance) { _balance = balance } withdraw(amount) { _balance = _balance - amount } } // create and use an Account var account = Account.new(1000) account.withdraw(100) |
Il explique que les classes ont la réputation d’être complexes, car la plupart des langages largement utilisés avec elles sont assez complexes : C++, Java, C#, Ruby et Python. Avec Wren, il espère montrer que ce sont ces langages qui sont complexes, et non les classes elles-mêmes. Il ajoute que Smalltalk, le langage qui a inspiré la plupart de ces langages, est célèbre pour sa simplicité. Sa syntaxe tient sur une fiche. Son objectif est donc de garder Wren aussi minimal tout en conservant le pouvoir expressif des classes.
En plus d’être concis, Wren se veut également performant. Après avoir exécuté un code à dix reprises avec plusieurs langages sur un MacBook pro 2,3 GHz Intel Core i7 doté de 16 Go de RAM DDR3 à 1 600 MHz et conservé le meilleur temps, Nystrom rapporte les résultats suivants :
Les barres plus courtes traduisent les meilleures performances
Dans la plupart des tests, Wren a la meilleure performance. Selon Nystrom, cela est dû aux décisions de conception qui ont été prises comme le fait que les classes sont définies de manière relativement statique, mais aussi l’implémentation du concept de signature de méthodes, du compilateur en une seule passe et l’usage par l’interpréteur de bytecode des boucles Goto calculés.
Toutefois, Wren n’a pas que de bons côtés. L’utilisateur Xscott fait remarquer que Wren semble assez élégant, mais il fait la même erreur que beaucoup de langages quand il s’agit de surcharger les opérateurs. Si vous mettez l’opérateur binaire comme méthode sur le premier objet, il n’y a pas de moyen simple d’avoir « builtin_object <operator> your_object ». De même, Wren ne fournit pas de nombres complexes, aussi vous n’obtiendrez donc pas une belle syntaxe pour « 1/z » ou quelque chose de ce genre. Et c’est le cas pour la multiplication scalaire avec les vecteurs, les matrices ou les tableaux de style Numpy, etc. Python et d’autres langages ont des solutions de rechange pour contourner ce problème, mais pas Wren. Pour ce dernier, les opérateurs binaires devraient être des fonctions à 2 arguments, pas des méthodes sur l’objet de gauche.
Mais pour l’équipe de Wren, ces reproches ne sont pas des erreurs, mais juste un compromis délibéré, Wren étant fondamentalement conçu pour être un langage très petit, simple, mais flexible. Elle souligne que la distribution unique fonctionne très bien comme pour 90 % des types d’opérations que vous souhaitez effectuer dans les programmes. Il lit très bien syntaxiquement et évite d’avoir à espacer chaque fonction avec son type d’argument comme vous le voyez en C et Scheme (hash-remove !, dict-remove !, set-remove !, etc.). Et il le fait sans avoir besoin de types ou de résolution statique. De plus, il est simple de compiler quelque chose d’assez efficace à l’exécution en utilisant une structure de type vtable. Concernant les opérateurs binaires, ça craint. Mais trouver une meilleure solution pour cela nécessite une solution trop élaborée. Les types statiques et les méthodes multiples représentent un énorme saut de complexité. L’approche de Python est vraiment lente. Pour Wren, un choix a été fait afin de le rendre petit et expressif, ce qui signifie que les opérateurs ne sont pas symétriques et c’est plutôt bien, conclut le mainteneur.
Wren est actuellement en version 0.4, ce qui signifie qu’il va falloir attendre un bout de temps avant de l’utiliser en production.
Source : Wren
Et vous ?
Que pensez-vous de Wren ?
Pourra-t-il s’imposer dans le monde des langages de script s’il parvient à atteindre sa première version stable ?
Selon vous, quels sont ses avantages et ses inconvénients ?
À votre avis, qu’est-ce que Wren devrait intégrer comme atouts pour pouvoir s’imposer dans le monde des langages de script ?