jeudi, janvier 15, 2009

Neuf langages pour 2009

Loin du fracas eschatologique des anticipations financières pour la nouvelle année tout autant que des « bonnes résolutions » des prosélytes de l'informatique « verte », l'An Neuf sera peut-être celui des habits neufs des langages de programmation. Outillage éprouvé des modestes soutiers, les programmeurs, d'une industrie informatique qui cherche aujourd'hui à se réinventer, les langages de programmation, qu'ils soient confinés à la confidentialité jalouse des laboratoires des grands éditeurs ou doctement débattus dans les sphères raréfiées de la casuistique Open Source, sont en pleine mutation et promettent en 2009 un retour triomphal au premier plan du Web.

En effet, les quelques années qui viennent de s'écouler ont vu renaître à la fois les travaux théoriques et les implémentations pratiques des langages de programmation, anciens comme neufs. Ce renouveau dans la recherche et dans les applications est évidemment à attribuer au premier chef à la généralisation de l'architecture informatique répartie du Web — tant dans ses usages grand public que professionnel. L'ascendant pris par Javascript pour les applications Web, par exemple, est tout à fait exemplaire de ce mouvement de fond. Plus généralement, beaucoup de ces nouveaux langages sont lancés sous la bannière du « langage de script » pour une classe d'applications particulière — le Web en général, mais aussi les jeux avec le brésilien Lua par exemple. Mais on trouve également dans cette nouvelle génération qui sort des bacs à sable expérimentaux des mathématiciens-logiciens, des tentatives inédites de solutions aux questions posées par les puces multi-cœurs qui ouvrent, depuis peu, l'accès à la terra incognita de la concurrence et du parallélisme extrême. D'autres enfin qui illustrent des percées théoriques commencent à trouver des implémentations efficaces permettant d'imaginer un emploi plus généralisé dans des applications d'entreprise.

Voici donc, pour 2009, neuf langages de programmation, méconnus ou pas, auxquels s'intéresser pour décrasser un peu nos talents de développeurs et explorer les nouvelles idées modernes sur la compilation, l'interprétation et l'exécution des programmes d'ordinateurs. (Qu'on se rassure d'emblée : aucun code ne sera ici présenté, par respect pour les âmes sensibles ; et aucun code n'a été exécuté dans ces langages pour rédiger cette chronique.)

Pour commencer, la banalisation de la machine virtuelle Java et l'amélioration constante des performances de ses diverses implémentations ces dernière années ont conduit à une floraison de langages, nouveaux ou portés, qui s'appuient sur la VM Java et son bytecode.

Scala

Scala est une fusion des programmations orientée objet et fonctionnelle dans un langage de programmation à types statiques. Non content de ressembler à Java, Scala est complètement interopérable avec des classes et du code écrit en Java.

Le modèle objet de Scala est uniforme : toute valeur est un objet, toute opération un appel de méthode. Scala est un langage fonctionnel au sens où toute fonction est elle-même un objet et peut-être traitée comme une valeur — on peut en particulier appeler la méthode apply pour l'exécuter sur une liste d'arguments.

Scala offre un modèle uniforme pour les deux grandes catégories d'abstraction indispensables dans les langages de programmation : la paramétrisation des types (comme les templates dans C++, et les generics dans les versions de Java supérieures à 5.0) et les méthodes abstraites, propres aux langages de programmation orientés objet ; Scala offre ces deux mécanismes uniformément tant sur les types que sur les valeurs. Pour les mécanismes de composition entre classes également, Scala se distingue par une grande richesse expressive : il y a évidemment héritage possible entre classes mais également composition par mélange (mixin comme dans les pionniers antiques Flavors et CLOS basé sur Lisp), ce qui permet une forme d'héritage multiple. Pour être complet, Scala offre également un mécanisme de décomposition qui, fonctionnant grâce à la reconnaissance automatique du type des arguments d'un appel, va exécuter la bonne méthode sur un objet composé. Ces objets composés peuvent également être décrits en XML directement dans le code source ; Scala offre nativement un modèle de données XML simplifiant le traitement des données structurées au format rendu populaire par les services Web.

La communauté Scala s'agrandit de jour en jour et explore activement le domaine des applications que ce langage particulièrement riche permet de développer efficacement et rapidement. Un framework pour Scala, Lift, et un plug-in Eclipse, par exemple, ont déjà vu le jour.

Clojure

Clojure est un autre langage de programmation qui tourne sur la VM Java. L'objectif initial est de fournir un langage de général programmation qui compile directement du bytecode Java tout en offrant au programmeur le confort d'un langage de script et une infrastructure robuste et fiable pour de la programmation multithread.

Clojure est un dialecte de Lisp (proche de Scheme, un autre dialecte antérieur de Lisp et relativement populaire) à considérer comme ressortissant principalement de la programmation fonctionnelle. Comme dans le cas de Scala, Clojure peut tout naturellement faire appel à des classes et à des bibliothèques Java dynamiquement et bénéficier ainsi de tout le travail de développement antérieur sur ce code Java.

Clojure présente un modèle d'agents qui s'appuie sur l'implémentation de l'exécution de threads en Java. Ainsi la programmation de tâches concurrentes et de leurs communications est largement simplifiée (comme dans le modèle d'acteurs du langage de programmation Erlang issu de l'industrie des télécoms).

Il existe déjà des initiatives intéressantes autour de Clojure qui a systématiquement figuré, en 2008, au sommaire de toutes conférences sur la programmation fonctionnelle : des frameworks comme Compojure et Webjure pour les applications Web, des plug-ins pour Netbeans et même un mode pour Emacs (la consécration !).

JRuby et Jython

Alors là, direz-vous, ce ne sont pas du tout de nouveaux langages mais bien des implémentations de langages de programmation par ailleurs fort connus — en l'occurrence Ruby et Python — en Java. Qu'y a-t-il de neuf là dedans ?

Le point intéressant est ici que Jython et JRuby illustrent une direction récente de développement prise par la communauté Java — et probablement inspirée du succès technique de la CLR concurrente de Microsoft qui, dans l'architecture .Net, permet de faire tourner des langages de programmations très variés (de Visual Basic et C# jusqu'à C++, JScript, IronPython, IronRuby, Phalanger/PHP, ou Boo) — autour du scripting des bibliothèques et de l'environnement Java. Cet aspect universaliste de la VM Java fait l'objet du JSR 223 qui spécifie les interactions entre un langage de script et Java (le paquet javax:script). Cette spécification et l'implémentation qui en est prévue dans Java 6 permet l'exécution, depuis un programme en Java, de scripts écrits dans un autre langage ; l'exposition d'objets Java comme variables ou objets dans des scripts ; la compilation des scripts ; l'invocation de méthodes ou de fonctions individuelles dans un script et la découverte au vol des moteurs de scripts présents au moment de l'exécution.

Jython et JRuby sont des implémentations respectivement de Python et de Ruby mettant en œuvre ces nouveaux mécanismes de la VM Java. Ces deux langages illustrent parfaitement l'idée de mêler dans une même application des modules écrits dans des langages de natures différentes — par exemple, en choisissant le plus adapté à la tâche en cours — et en s'abstrayant plus encore des différences de matériel et de systèmes d'exploitation d'une machine à l'autre.

Javascript

L'année qui s'annonce est particulièrement intéressante pour l'évolution du langage Javascript dont les modestes débuts sous le nom de scène LiveScript datent de l'époque de Netscape Communications restèrent longtemps inaperçus avant de connaître une gloire récente dans le grand mouvement Ajax et Web 2.0 dont il est devenu la cheville ouvrière.

Tout au long de l'année passée, Javascript a figuré dans l'actualité, en particulier dans celle de la fondation Mozilla. En août dernier était annoncé TraceMonkey, la nouvelle version du moteur Javascript du navigateur Firefox dans sa version 3.1. TraceMonkey intègre de nombreuses innovations pour le langage : un compilateur au vol (Just In Time Compiler ou JIT compiler) mettant en œuvre de nouvelles techniques de compilation (dites d'arbres de traces développées à l'Université de Californie, Irvine).

Au même moment le projet d'intégrer SpiderMonkey, la version précédente du moteur Javascript de Mozilla, avec Tamarin, un moteur développé par Adobe pour ActionScript à l'origine et donné en Open Source à la fondation Mozilla en 2006, était arrêté. Adobe a néanmoins déclaré vouloir continuer à utiliser Tamarin dans les versions ultérieures de son FlashPlayer.

Dans le même temps, sortait Rhino une implémentation Open Source de Javascript entièrement en Java, bénéficiant, comme mentionné plus haut, des nouveaux avantages de l'intégration explicite de langages de script dans la VM Java. Cette implémentation, hors du navigateur auquel Javascript était habituellement confiné, ouvre de plus à Javascript le terrain des applications côté serveur. La disponibilité de Rhino a elle-même encouragé de nombreuses initiatives visant à élargir le champ d'application du langage Javascript lui-même. Un seul exemple, celui de Rhino On Rails le formidable télescopage du framework Rails, principale raison du succès de Ruby auprès des développeurs d'applications Web, et de Javascript via le moteur Rhino. Au passage, on pourrait, ce faisant, totalement inverser l'architecture usuelle du client Javascript s'adressant à un serveur basé sur les servlets Java en utilisant, en miroir, Java sur le client, par exemple via le Google Web Toolkit, s'adressant à un serveur en Javascript avec Rhino on Rails !

Quant à la standardisation du langage lui-même et la nouvelle version de sa spécification si impatiemment attendue, l'heure est à l'apaisement des querelles internes et à l'œcuménisme depuis août dernier. La nouvelle spécification, Harmony, est espérée incessamment et devrait influer sur les nouvelles versions d’ActionScript chez Adobe et de JScript dans IE8 chez Microsoft. Sur ce front également les annonces devraient arriver en 2009.

Enfin des environnements très complets et exceptionnellement riches ont rapidement germés pour faciliter et accélérer l'emploi de Javascript dans les applications (Web) les plus variées. Citons, par exemple, les bibliothèques jQuery de John Resig, qui fêtent leur troisième année en 2009 et sans lesquelles il est inimaginable d'envisager un développement d'applications Web de quelque ampleur ; on peut également citer le projet Open Source DreamFace Interactive pour un environnement ouvrant aux non-programmeurs la création et le partage de mashups interactifs et personnalisés.

Java, C++

N'y en aurait-il que pour les nouveaux langages, dialectes obscurs et créoles abscons ou langages de script portés par la vague hypermoderne Ajax/Web 2.0 ? Les fiers et solides parlers de jadis auraient-ils péri fautes de locuteurs ?

Point du tout. Non seulement ils n'ont pas dit leur dernier mot — si l'on peut dire — mais leur usage continue à être prédominant : Java, C et C++ se classent aux première, seconde et troisième places.

Java continue sa route innovante depuis presque quinze ans. Chez Sun, on explore les territoires du calcul de haute performance (HPC) avec Fortress une évolution de Java ciblant les supercalculateurs et les applications scientifiques. Par ailleurs, le Java Community Process, mis en place par Sun pour accompagner l'évolution du langage fourmille de projets et de développements, témoignant de l'intense activité visant à étendre les domaines d'application du langage. La prochaine livraison, JDK 7, devrait intégrer des nouveautés pour la programmation d'applications parallèles sur multicœurs.

Le séminaire JVM Language Summit, organisé par Sun en septembre dernier, a permis de faire le point sur tous les développements de la machine virtuelle Java avec, en particulier la VM Parrot (visant principalement Python, Perl, PHP et Ruby) met en œuvre les continuations, une construction abstraite de l'état de l'exécution d'un programme, ou encore le projet Da Vinci Machine d'une nouvelle VM Java qui soit utilisable nativement pour d'autres langages que Java.

Les sigisbées de Stroustrup ne sont, quant à eux, pas en reste. Le vénérable C++ continue son développement au sein du Working Group 21 de l'ISO/IEC. Dans une interview datant d'août dernier le père du langage traçait les grandes lignes de la nouvelle spécification, répondant au nom poétique de C++0x, attendue pour 2009 — et logiquement rebaptisée C++09, le cas échéant. De nombreuses extensions sont prévues avec un effort particulier (comme pour Java, Scala, etc.) sur le parallélisme et la gestion des threads, les échanges asynchrones et toute une infrastructure de communication entre processus indispensable à la mise en oeuvre de programmes sur une architecture répartie. Dans les bibliothèques on nous promet des expressions régulières (regexp), des tuples, des hash tables, etc. autant de structures de données et de types rendus populaires par d'autres langages de programmation. Enfin — et C++ ne serait pas C++ s'il ne présentait quelque hapax technologique inaccessible au commun des mortels — nous assisterons, entre autres, à l'apothéose des variadic templates qui permettent de créer des classes et des fonctions templates acceptant un nombre arbitraire d'arguments (pour les fonctions) ou de paramètres (pour les classes et les structures) — variabilité extrême des modèles, modèles extrêmes de variabilité !

Ces évolutions récentes se déroulant au rythme alangui des organisations internationales de standardisation — qu'est ce qu'une décennie au regard de la formulation exacte de la catégorie de Kleisli définissant les variadic templates ? — n'ont donc pas empêché les plus pressés de définir dans l'interim de nouveaux langages de programmation visant clairement à compléter et améliorer C++ dans le contexte du succès croissant de quelques autres langages. Sur ce front, le langage de programmation (imaginativement baptisé) D est particulièrement intéressant — deux implémentations à suivre, celle de Digital Mars et celle de GNU par une extension de gcc. D dispose de bibliothèque de runtime; en fait il y en a deux quelque peu concurrentes : Phobos et Tango. D est un langage compilé en code natif (comme le C/C++) offrant un niveau de performance très élevé, tout en intégrant des facilités qu'on trouve dans des langages connus tels Java et C# : interfaces, réflexion, garbage collector (gestion de la mémoire automatisée), programmation par contrat, exceptions, etc. (Et les variadic templates, tout va bien !) Le référentiel dsource.org collecte les projets et les outils basés sur D.

Haskell

Quoi ? Comment ? Qu'est-ce, Haskell ? Haskell est un langage de programmation nommé en l'honneur du mathématicien logicien américain Haskell Curry spécialiste, non pas des plats épicés indiens, mais de la logique combinatoire ! (À vrai dire, le logicien a inspiré un autre langage de programmation fonctionnel, inévitablement appelé Curry.) On a également donné son nom, en mathématiques, à l'opération logique qui transforme une fonction de deux arguments :

f: X, Y -> Z

en une fonction associée à un argument qui renvoie elle-même une fonction à un argument :

curry(f): X -> (Y -> Z)

telle que Z = f( X, Y ) = (curry(f)( X ))( Y ). Voyez que vos premiers pas en programmation fonctionnelle ne sont pas si difficiles que ça...

Haskell n'est pas un langage réellement nouveau puisque les premiers travaux de recherche datent de 1990 environ (LISP date de 1960 avec les premiers papiers de John McCarthy). Mais il est devenu important aujourd'hui parce qu'il a inspiré et continue à inspirer les concepteurs de la nouvelle génération de langages de programmation et d'environnement de développement, voyez F# chez Microsoft Research — mais aussi ceux qui continuent à s'intéresser aux vénérables langages, voir FunctionalJ ou FC++ pour d'intéressantes variations sur le thème. (Il y a bien sûr un major mode Emacs pour Haskell !)

R

Pour conclure sur une note primesautière après l'originalité déroutante des monades et de l'évaluation paresseuse de Haskell, je cherchais un langage — dont le nom tienne encore en une lettre, comme il sied — plus proche des préoccupations des utilisateurs et des applications métier. Ce qui exclut d'emblée J, un langage dont les points forts brillent dans les applications mathématiques et statistiques. (Et puis la syntaxe inspirée d'APL peut rebuter les âmes mêmes les mieux trempées.)

À ce point de la réflexion, ayant constaté le peu de lettres libres restant pour désigner un langage de programmation avenant sur le site Hello World je tombe sur un récent article du New York Times qui, sujet tout à fait inhabituel pour ce quotidien historique, met en avant un langage de programmation sous les illustrations photographiques des figures réjouies de deux statisticiens érudits ! R est en fait un langage et un environnement exploratoire pour les statistiques, et l'analyse de données, en particulier, l'analyse graphique. La version 2.8.1 a été livrée en décembre dernier et tourne sur différents UNIX, sous Windows et sous MacOS. La conférence annuelle s'appelle évidemment « useR » et l'édition 2009 se déroulera précisément à Rennes, en juillet prochain : l'occasion rêvée de vacances estivales studieuses.

R est particulièrement adepte à la manipulation des listes, séquences et matrices de données qui font le quotidien du statisticien laborieux. De plus R intègre déjà toute une bibliothèque de modèles de données indispensables dans l'analyse et la représentation des données : régression linéaire, ANOVA, résidus, variance-covariance, déviations, kurtosis, moindre carrés, distribution de Poisson n'ont aucun secret pour R. Doté de primitives de dessin en 2 et 3 dimensions, R facilite la visualisation des données. R est l'exemple parfait du Domain Specific Language, le langage spécifique à un domaine ou à un compartiment fonctionnel donné.

Voilà donc le programme pour 2009, à raison d'une quarantaine de jours par langage, il n'est pas impossible d'élargir son horizon en découvrant neuf nouveaux langages pour la nouvelle année. Et ensuite ? Ensuite on en reviendra aux prédictions de Peter Landin, rédigées en 1966 à l'aube de l'explosion de l'informatique et de la recherche sur la programmation, et l'on attaquera haut les cœurs The Next 700 Programming Languages (les 700 prochains langages de programmation) !

ShareThis