Vous trouverez sur ce site mes publications concernant les technologies de l'information. Le contenu est disponible en français et en anglais.
dimanche, 27 mai 2007
Expressivité du langage et avantage compétitif

RailsConf est terminé et Martin Fowler poste ses impressions. La tendance de fond est là, le pouvoir d'expressivité des langages dynamiques leurs assurent une diffusion de plus en plus importante. Martin Fowler indique ainsi que 40% de leurs nouvelles affaires aux états-unis utilisent la plate-forme Ruby, il y a bien sûr un biais de par le positionnement de Thoughtworks, la compagnie pour laquelle travaille Mr Fowler, sur cette technologie mais je pense que cette tendance se confirme bien.
La plate-forme Java a clairement une carte à jouer et Sun l‘a bien compris. Aussi bien au niveau technique avec l‘intégration de la JSR-223 à Java 6 et JRuby qu‘au niveau promotion avec le sponsoring de Sun pour RailsConf.

La sortie de JRuby en version définitive donnera sûrement le coup d'envoi d'un engouement encore plus vif. Il est à noter que Groovy a quelques longueurs d'avance en terme d'implémentation. De manière plus générale la plate-forme d'exécution Java peut devenir le socle de base de beaucoup d'infrastructure ainsi que l'environnement hôte d'autres langages. La richesse de la plate-forme Java est conservée mais avec une ouverture vers des outils mieux adapté à d'autres tâches (Ruby et Rails pour le développement Web par exemple, un petit clin d'oeil à l'ami Gilles qui est parti avec cette technologie pour son projet).
Le pouvoir d'expressivité est pour moi un des principaux avantages compétitifs des languages de programmation, à cette comparaison, les languages dynamiques sont clairement gagnant. Attention néanmoins à ces métriques qui peuvent donner à des Domain-Specific-Language une mesure d'expressivité très importante mais avec peu de souplesse. D'où d'ailleurs l'interêt des techniques de meta-programming de ces languages dynamiques qui permet de bénéficier du meilleur des deux mondes.
La prédominance des langages de programmation avancés, comme les langages dynamiques, dans l'échelle de l'évolution est donc en marche même si elle reste lente.
Technorati Tags: jruby ruby dynamic languages
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: languages java ruby groovy functional
dimanche, 15 octobre 2006
Implémentation de ce site web
Mes besoins lors la mise en place de mon site personnel sur lequel vous naviguez sont les suivants :
- Me permettre de diffuser mes publications en français et en anglais
- Etre sous forme de blog pour l‘interactivité et l‘organisation
- Héberger mon CV
- Pouvoir diffuser des documents plus long hors blog afin qu‘ils aient une bonne lisibilité par une largeur plus grande
- Etre simple d‘administration et d‘utilisation
- Etre implémenté en Java pour faciliter les modifications (c‘est un language que je connais trés bien)
- Avoir un design sympa
J‘ai donc abouti à la sélection des composants logiciels suivants :
- Serveur sous Ubuntu linux pour la souplesse et la puissance de cette distribution
- Blojsom pour l'outil de Blog. Il a nécessité néanmoins des modifications pour intégrer deux langues de publication. Son but est d'être très simple, il stocke les billets dans des fichiers, ce qui me permet de les modifier avec un simple éditeur de texte (jedit en l'occurence). J'ai également ajouté le plugin Xilize à Jedit qui me permet d‘écrire les articles avec un langage très simple que je transforme en XHTML d‘un click.
- Sitemesh pour la décoration des documents HTML simple avec le même design de page
- Apache en frontal avec une redirection vers Tomcat qui héberge les composants précédent.
- subversion pour le partage des sources et des billets entre mes différentes machines
- Awstats pour les statistiques web et Munin pour le monitoring du serveur
- Mon.itor.us pour le monitoring extérieur du serveur
- Design Leaves trouvé sur le site Open Source Web Design et intégré dans un template Blojsom écrit en Velocity.
La machine qui héberge le tout est un de mes anciens PC fixe reconverti en serveur silencieux. Cette machine ne possède donc que le strict minimum :
- CPU Athlon thunderbird à 800 Mhz
- 768MO de RAM
- Un disque dur de 200 Go
- Un gros ventilateur silencieux Zalman avec potar pour réduire la vitesse au minimum l‘hiver et pouvoir augmenter un peu l‘été
- Un lecteur de CD
- Une alimentation sans ventilateur Antec Phantom.
- Il n‘y a PAS de carte graphique, carte son, clavier, souris, écran, etc... toute l'administration est faite à distance en SSH

Le tout est branché sur mon routeur qui expose le port 80 sur la DMZ lui-même branché sur la freebox. Le fournisseur d'accès Freeme fournit un débit montant de 100ko/s largement suffisant pour mes besoins actuels.

