Vous trouverez sur ce site mes publications concernant les technologies de l'information. Le contenu est disponible en français et en anglais.

mardi, 28 novembre 2006

La guerre des langages

Sujet polémique s‘il en est, le choix d‘un langage de programmation peut paraitre secondaire. Néanmoins, un langage apporte toujours ses paradigmes qui influenceront les programmeurs qui l‘utilisent. Les paradigmes de programmation les plus courants en informatique de gestion sont la programmation impérative et objet. La programmation fonctionnelle est, quant à elle, restée cantonnée à des domaines bien précis (universitaires, geeks, etc.). Le plus connu et le plus ancien, Lisp, n'a jamais réellement percé. Paul Graham raconte néanmoins son succès avec Lisp.

Le paradigme fonctionnel fait une percée récemment

Cette percée a pour origine :

  • Le succès de langages intégrant une approche fonctionnelle. Ce n‘est pas le langage lui même qui est populaire mais les possibilités qui lui sont associés. Ruby est populaire grâce au fabuleux framework web Rails, Javascript grâce au phénomène Ajax.
  • La facilité de l‘approche fonctionnelle pour l‘exécution parallèle de traitements. Google et son implémentation du fameux Map and Reduce en est un parfait exemple (même s'il est implémenté en C++ et je reviendrais plus loin sur ce point). Avec la généralisation des machines multi-processeurs, ce sujet va devenir de plus en plus important à l‘avenir.

Les lacunes du langage Java

Ces projecteurs braqués sur la programmation fonctionnelle ont fait ressortir les lacunes du langage phare de ces dernières années : Java. Bien que disposant de paradigmes de programmation nombreux et aboutit – à savoir impératif, orienté-objet, générique depuis la version 5.0 et multi-plateforme – Java manque cruellement du paradigme fonctionnel. Le paradigme de programmation concurrent est comblé par une superbe librairie intégrée à la plate-forme depuis la version 1.4 : java.util.concurrent. Enfin, Java est assez conservateur concernant le typage avec un typage fort et statique.
En résumé les lacunes du langage Java sont (et je parle bien du langage et non de la plate-forme..) :

  • typage fort et statique trop conservateur : Bruce Tate a fait un excellent article décrivant les différents types de binding (mécanisme de liaison entre une déclaration et une implémentation, souvent via un type) à l'oeuvre dans tout langage de programmation et fait le parallèle avec les frameworks "courant" en java que sont Spring et Hibernate. Il décrit ces frameworks comme mettant en oeuvre des mécanismes (interprétation de bytecode à la volée, dynamic proxy, décoration de classe) que l'on trouve nativement dans les langages dynamiques. Je ne peux pas m'empêcher d'afficher le dessin du Dr Larson, qui résume très bien le coeur du problème :
  • aucun paradigme fonctionnel : une fonction en Java est forcément associée à un type et n‘est pas traitée comme un objet de premier ordre. Il n‘est pas possible, en Java, de passer une fonction à une autre fonction sans passer par un type (la notion de fermeture n'existe pas). Steve Yegge, toujours lui, a signé un billet brillant sur ce sujet : Exécution dans le royaume des noms.

La puissance de la plate-forme Java

La plate-forme Java, et non uniquement le langage, reste une des plate-formes d'exécution les plus puissante. L'éco-système Java est l'un des plus riche à l'heure actuelle avec un nombre de librairies externes extrêmement élevé. Les caractéristiques avancées de la plate-forme avec Java EE sont dans certains environnement incontournable (clustering, transaction distribuée, sécurité, messagerie, services web, etc.). Reste néanmoins une certaine complexité de mise en oeuvre qui est atténuée par la dernière version de cette plate-forme : Java EE 1.5. La plate-forme Java reste très adaptable même si le processus est parfois long et contraignant. La JSR-223 vise justement à définir les interfaces d'interaction avec un langage dynamique (dit langage de script) tandis que la JSR-241 définit un langage fusionnant les caractéristiques de ruby, python et smalltalk (ambitieux !). D'autres part, des projets comme JRuby, sponsorisé par Sun, ou Groovy, visent à utiliser la machine virtuelle Java comme un conteneur d‘exécution pour ces langages.

Les compétiteurs

Java subit actuellement une poussée forte de la part de langages plus avancées. Cette poussée est bien sûr du aux capacité des langages eux-mêmes mais également à leurs plate-formes.
Ces compétiteurs se dénomment donc Ruby, Javascript ou Groovy. Je laisse de côté Smalltalk , Python et Lisp à qui ils manquent la petite "étincelle" pour devenir réellement populaire. Je laisse également de côté les 8512 moins 7 autres langages de programmation que l‘humanité a engendré….

Ruby

Rubyest la star du moment, notamment grâce à un framework web dénommé Ruby on Rails, qui a su exploiter toutes les possibilités du langage dynamique Ruby et être très pragmatique (configuration par convention, génération de code, structure de répertoire standard). Sun a embauché les deux développeurs principaux du projet JRuby visant à offrir un interpréteur Ruby écrit en Java et permettant une interaction entre ces deux langages. Grails peut être considéré comme un exemple des interactions possibles entre un langage dynamique et un langage “hôte” plus ancien.

Groovy

Groovy a pour force sa proximité avec la syntaxe Java et son intégration déjà très forte avec la JVM. La JSR-241 s'occupe de sa standardisation. L'équivalent de Rails est disponible avec Groovy et se nomme Grails.

Javascript

Javascript est un langage avancé malgré un à priori "gadget pour le web" et est revenu sur le devant de la scéne grâce au phénomène Ajax.

Oubliez le langage et concentrez vous sur la conception

Cet état des lieux des langages de programmation n‘est pour moi qu‘une introduction à l‘activité essentiel qu‘est la conception. Les langages et des différents paradigmes doivent être considérés comme un outil intellectuel et non comme une simple manière d‘implémenter un traitement. Quelque soit l‘implémentation que vous choisirez vous arriverez toujours à combler, avec plus ou moins de facilité, les lacunes du langage que vous utilisez. Ainsi vous pouvez mettre en oeuvre une approche fonctionnelle avec Java par passage d‘objet interfacé, faire du meta-programming avec de la reflection et de la génération de byte-code à la volée (ce que fait Hibernate par exemple), faire du late binding avec Spring.

L‘exemple le plus flagrant reste l‘implémentation du moteur de recherche Google qui utilise des techniques du paradigme fonctionnel sur la manière d‘aborder un problème (exécution parallèle de traitement sur un volume de données très important). L'implémentation est faite en...C++, langage loin de suivre le paradigme fonctionnel. Autre exemple assez connu, l'implémentation du système de fenêtrage X a été conçu de manière orienté objet mais implémenté avec le langage C non objet.

Je prédis un bel avenir aux langages dynamique, c‘est dans l‘ordre logique de l‘évolution des langages vers un pouvoir d‘expressivité toujours plus grand. Lequel l‘emportera…difficile à dire, je pense que Ruby a de beaux atouts et bénéficie du support (léger..) de Sun. Javascript et Groovy ont une syntaxe proche de Java et peuvent être des outsiders. Attendons de voir.

J‘ai intentionnellement omis C# de cette comparaison car il est extrêmement similaire à Java et n‘est donc pas pertinent dans cette comparaison. D‘autres part, cela m‘évite de rentrer dans la traditionnelle guerre Java vs .Net.

Technorati Tags:

Posted at 8:32 PM in fr/Technologies/
portage salarial freelance