Actualités

[08/09/2017] Breaking news ! Smile décroche le label Happy Trainees 2018

Après le label HappyAtWork, Smile s’offre celui décerné par ses stagiaires et alternants !

[21/07/2017] Smile lance les premiers vélos solaires connectés à l’occasion du Sun Trip Tour 2017

Smile, leader des solutions IoT et open source, confirme sa solide expertise sur le marché de l’embarqué en participant activement à la course de vélos solaires du Sun Trip Tour.

[03/07/2017] Smile remporte le Drupagora d'Or 2017 du meilleur site e-commerce

Le vendredi 30 juin, la 3ème édition des Drupagora d'Or s'est déroulée à Paris.

Toutes les actualités picto
       

Vous avez besoin de mettre à jour votre Lecteur Flash Flash 7

Guillemet ouvrant l'actualité des solutions
et des technologies open source Guillemet fermant
picto

Faut-il avoir peur de Python?

le langage Python vient de se hisser au 6ème rang des langages du marché. Porté par des mastodontes comme Google et moteur de nombreuses killer apps, Python a toutes les qualités pour continuer à croître et à s'imposer sur certaines solutions logicielles, parfois même au détriment de certains langages pourtant plus classiques.

Python: la force tranquille

Certes, sur le marché français, il reste plus facile de trouver des ressources PHP que Python par exemple. Pour autant, doit-on on craindre ce langage? Nous pensons que non car Python fait preuve de grandes qualités qui sont de plus en plus largement reconnues, puisque Python est en progression régulière soutenue et se classe désormais au 6ème rang des langages du marché (index TIOBE), juste après PHP et devant C#.

Python est pourtant antérieur à Java puisque Python a été crée en 1990 par Guido Van Rossum. En fait Python résolvait de nombreux problèmes du C/C++ que Java résolvait aussi et c'est l'incroyable essort de Java qui a éclipsé un temps Python de la scène. Reste que des entreprises à la pointe de la technologie comme Google misent toujours très lourdement sur Python, notamment avec Youtube, reste aussi que certains logiciels qui sortent du lot sont parfois écrits en Python, c'est le cas, par exemple, d'OpenERP, d'ERP5, de Trac (bug tracker), de Bazaar (sytème de version distribué d'Ubuntu), de Mercurial (autre système de version utilisé par Sun Microsystem), Google AppEngine, MoinMoin (très bon wiki, utilisé par Ubuntu).

Les caractéristiques de Python

objet

rappelons que les langages dits "objet", sont pourvu d'un ensemble de concepts de modélisation dont l' héritage des comportements et l' encaspulation des responsabilités dans l'objectif de se rapprocher de la représentation humaine du savoir, ainsi qu'on le formalise parfois avec ce qu'on appelle l'ontologie, le référencement des concepts.

Dans le monde open source, la modélisation objet est une grande force car l'encapsulation rend plus aisée la répartition des développements entre les équipes en évitant les effets de bord et en formalisant des frontières de responsabilité. Quand à l'héritage, il permet, lui, la réutilisation du code et sa spécialisation opportuniste au cas par cas selon les intégrations.

Python appartient à cette catégorie des langages objets, tout comme Java, PHP5 ou Ruby. On pourrait même le classer comme plus pur que Java (qui sacrifie beaucoup à la modélisation objet avec ses types natifs, compromis pour plus de performance) ou PHP5 (auquel les concepts objets ne sont qu'une sur-couche tardive), mais moins que Ruby ou Smalltalk qui pour lesquels tout est objet.

dynamique

Parmi les langages objets, il y a deux grandes familles: les statiques et les dynamiques. Dans les langages statiques, comme Java ou C++, les classes, c'est à dire les concepts de modélisation doivent être déclarées au moment d'une phase préalable de compilation. Ensuite, lors du 'runtime', c'est à dire à l'utilisation du logiciel, ces types ne peuvent plus trop bouger, sauf à employer alors de lourds stratagèmes d'ingénierie logicielle comme les design pattern décorateurs qui permettent d'acquérir une certaine souplesse de modélisation objet au runtime ou encore grâce au pseudo dynamisme de Java et son API de réflection mais qui n'offre pas de programmation objet de première classe.

Or ces stratagèmes sont lourds à mettre en place, on en vient à écrire du code pour le code, le fameux 'boilerplate' et il faut avoir recours à des spécialistes des langages qui ne maîtrisent souvent plus que ces aspects techniques au détriment des problématiques fonctionnelles tant le degré d'expertise devient élevé. Des exemples réussis des ces prouesse d'ingénierie logicielle en code statique (Java ici) sont les frameworks OSGI ou Swing par exemple, mais leur développement a nécessité des ressources colossales. Pire, de nombreux logiciels, notamment open source, sont issus de quelques compétences fonctionnelles qui sont malheureusement trop rarement panachées des ces compétences d'ingénierie logicielle. Les langages statiques sont donc très adaptés aux frameworks d'infrastructures mais peu à l'intégration.

Reste que déclarer les types avant une phase de compilation permettait surtout de générer du code compilé ou pseudo-compilé très optimisé comme avec le C++. Aujourd'hui c'est de moins en moins vrai, la vitesse de Java flirte allègrement avec celle du C++, car les facultés d'analyse et d'optimisation du code à chaud des meilleurs machines virtuelles telles que HotSpot de Sun Microsystem rivalisent avec les facultés d'optimisation manuelle du codeur C++ moyen et, de plus, on connaît à l'exécution plus d'information sur l'état des ressources matérielles et l'usage réel de chaque partie du code qu'au moment d'une éventuelle compilation. Or les langages dynamiques sont progressivement portés sur ces machines virtuelles et celles-ci se perfectionnent aussi dans cette même optique comme nous allons le voir plus tard.

Les langages dynamiques, eux, permettent de définir et redéfinir les types à n'importe quel moment de l'exécution. Cela offre une très grande souplesse de modélisation et de paramétrage. Cette souplesse est même parfois trop grande et mieux vaut alors, sur des projets d'entreprise à très large échelle, savoir poser quelques jalons en code statique pour ramener plus de programmation par contrat (l'implémentation d'interface est vérifiée par le compilateur) et laisser au compilateur faire une partie des tests d'intégration.

Python appartient à cette seconde famille, les langages dynamiques.

typé fort

Les langages objets peuvent être typés forts ou faibles. Un langage faiblement typé, comme PHP ou Javascript, convertit de façon implicite les types entre eux. Par exemple, en Javascript, on peut allègrement écrire var ma_variable = "quatre" / 2, ce qui donnera NaN mais sans générer aucune erreur! Ca peut être utile mais ça peut masquer des erreurs et propager de calcul intermédiaires faux sans détecter les erreurs là où elles se produisent. Python tout comme Ruby ou Java est typé fort, c'est à dire que les conversion de type doivent être explicites, c'est un gage de sécurité, un peu comme le typage statique, mais plus léger.

mantra: 'il ne doit y avoir qu'une seule façon de faire les choses'

Perl avait été conçu en disant qu'il devait y avoir plein de façons de transcrire une opération en code. Cela a sans doute participé à la réputation de Perl de n'être qu'un langage propre à l'écriture des programmes, mais pas à leur relecture et leur maintenance. Python n'y est pas allé par quatre chemins et son créateur a décrété qu'en Python il n'y aurait qu'une seule façon de faire le choses. Cela vaut même pour l"indentation du code qui reflète sa structure sous peine d'invalidité et permet ainsi à Python de s'affranchir de crochets devenus alors 100% inutiles alors qu'ils constituent une information partiellement redondante dans des langages comme Java au gré des habitudes d'indentation de chacun.

Une conséquence de cet axiome est que Python est très facile à lire, sans surprise, et que c'est aussi un des langages objets les plus faciles à apprendre.

Python constitue un très bon compromis entre vitesse et niveau d'abstraction

Tout en bénéficiant d'un niveau d'abstraction légèrement supérieur à PHP5 (notamment en terme de méta-programmation, c'est à dire la génération dynamique de modèles objets eux même), Python se révèle pourtant presque 2 fois plus rapide que PHP en moyenne. Il reste cependant 50 fois plus lent que Java, mais offre en contrepartie des abstractions permettant un code environ 4 fois plus concis et sensiblement plus puissant.

En conséquence Python est un langage efficace

Si, par exemple, les deux ERP open source qui ont sans conteste la plus grande étendue fonctionnelle sont sans doute ERP5 et OpenERP (voir notre livre blanc; sachant que la couverture fonctionnelle ne doit pas être le seul critère de choix et qu'à ce titre Openbravo ne doit pas être négligé non plus) sont tous deux programmés en Python, il y a sans doute une corrélation forte à y voir entre productivité et langage dynamique. D'autant que les ERP's mid market sont des produits dont une qualité principale est la facilité d'adaptation à des contextes d'entreprise différents, c'est à dire justement la faculté à remettre en cause un modèle objet, par exemple pour ajouter un champ à un produit, une nouvelle relation entre une vente et un canal de distribution etc...
Cela corrobore l'observation de la montée en puissance des langages dynamiques qu'on observe par exemple sur l'index TIOBE:

Python bénéficie désormais d'IDE de qualité

Longtemps, l'entreprise a cantonné Python à un simple statut de langage utilitaire de script. L'une des raisons sans doute était le manque de support par des outils, d'édition de code notamment, digne de ceux qu'on pouvait trouver du côté de Java par exemple, grâce à l'engagement de mastodontes tels que Sun Microsystem ou IBM, ou encore du côté de .Net porté par Microsoft.

Mais la situation a changé! De très grosses entreprises, telles que Google, reconnaissent aujourd'hui les mérites de Python et en conséquence le support de outils d'édition s'améliore grandement.

Saviez-vous qu'on pouvait déboguer un serveur OpenERP dans Eclipse, même à distance, avec une interface très comparable à celle Java? Non? Eh bien voici un exemple:

Nous venons de voir ce qu'on pouvait faire avec Eclipse et le plugin PyDEV. Mais dans l'éternelle rivalité constructrice entre Sun et IBM, Sun n'est pas en reste et annonce son tour un support massif de Python dans son IDE open source Netbeans pour lequel Sun a des projets ambitieux:

Performances: l'avenir de Python sur la plateforme Java?

Qui dit langage dynamique dit performance inférieure à celle d'un langage statique compilé ou pseudo-compilé. Cependant, il n'y a pas d'obligation que le caractère dynamique du typage d'un langage le limite à un usage exclusivement interprété donc spécialement lent! Pour vous en convaincre, regardez JRuby ou Groovy sur la plateforme Java: grâce aux travaux de Sun, une application web JRuby on Rails est compilée à la volée en bytecode Java portable au même titre qu'une application Java classique! Certes la structure du bytecode reflète le caractère dynamique du langage et donne des performances inférieures à celui généré à partir du langage Java, mais cela reste environ 5 fois plus rapide au moins que le code interprété pur!

Bref les langages dynamiques peuvent aussi avoir leur machine virtuelle pour booster leurs performances. Par exemple, le langage Smalltalk (un autre langage dynamique très mature, là avant Java mais eclipsé par ce dernier), peut être exécuté par la machine virtuelle de Gemstone à une vitesse proche de celle du Java depuis des années!

PyPy

Du côté de Python on est pas en reste. Cela fait longtemps que des gens essaient de bâtir une machine virtuelle pour Python, son nom: PyPy. Ne riez pas, dans la langue de Shakespeare, PyPy exprime surtout le fait qu'on cherche à implémenter le maximum de Python et de sa librairie standard en... ... Python! Eh oui, on cherche en premier lieu à limiter au maximum le code natif C (approche très différente de PHP par exemple). En second lieu, on construit une machine virtuelle performante. Dès lors, notre machine virtuelle est capable d'optimiser tout le code Python à la volée à l'instar du JIT sur Java et cela peut payer plus que d'optimiser chaque méthode en C, à condition bien sûr que la machine virtuelle soit excellente. Et donc, naturellement, plus il y a de Python et moins il y a de C et plus la machine virtuelle peut dynamiquement optimiser l'exécution du code. Les gens de Ruby font la même chose avec le projet Rubinius.
Reste qu'une bonne machine virtuelle ne se décrète pas mais nécessite des dizaines d'années hommes de travail acharné si on veut vraiment battre les performances d'un interpréteur C.

Jython

C'est là que la plateforme Java entre en scène à nouveau. Depuis les années 90, les investissement de R&D de Sun Microsystem dans la machine virtuelle Java ont été colossaux et ont justement permis à la machine virtuelle Java de s'approcher voir parfois dépasser la vitesse du code C/C++ tout en offrant des abstractions de plus haut niveau (garbage collector et API de réflection notamment). Et qui a dit que la machine virtuelle Java n'était apte qu'à optimiser le langage Java? En fait, l'ajout d'interpréteur de langages dynamiques avec pseudo compilation sur la plateforme Java avait déjà commencé depuis un moment beaucoup de développeurs l'utilisent même sans le savoir. Les templates JSP du J2EE avec le moteur Jasper, ou encore le dialecte HQL de Hibernate en sont des exemples parfaits. Mais c'est peut être JRuby qui a prouvé depuis l'an dernier que certains langages dynamiques peuvent tourner plus rapidement (jusqu'à 5 fois environ) une fois qu'ils utilisent la machine virtuelle Java et qu'ils sont pourvu d'un compilateur dynamique de bytecode Java.

Fort de son succès avec JRuby qui se voit de plus en plus largement utilisé, Sun Microsystem a donc décidé d'en remettre une couche avec Python. Sun a ainsi débauché deux pointures de Python en Mars dernier: Ted Leung, développeur Python membre de la fondation Apache et Frank Wierzbicki, fer de lance du projet open source Jython, implémentation d'un interpréteur et pseudo-compileur de Python en Java, à l'image de JRuby. Notons que Jython n'est pas nouveau, ce projet a été créé en 1997, au tout début de l'ère Java, par Jim Hugunin au cours de sa thèse. Mais c'est Microsoft qui a senti le premier le vent de langages dynamiques tourner et a débauché Jim Hugunin dès 2004 pour créer IronPython, une implémentation de Python en C#, donc sur la plateforme .Net qui s'affiche ouvertement comme ployglotte depuis plus longtemps.

Fort de ces nouveaux investissements, le mois dernier, Jython annonçait fièrement une version 2.5 alpha, c'est à dire qu'on est à deux doigts de voir débouler sur la plateforme Java une version de Python compatible avec la version 2.5, version très répandue, par exemple suffisante pour faire tourner des killer apps Python comme Django ou OpenERP sur la JVM! Bien sûr, les appels de code natifs ne sont pas encore toujours évidents depuis Jython mais les choses s'améliorent grandement, à l'instar des projets FFI ou JNA pour JRuby.

Enfin, les gens de PyPy et Jython de Sun se parlent enfin et projettent de travailler ensemble.
L'avenir des machines virtuelles pour Python est donc plus que prometteur! Google ne nous gratifiera t'il pas non plus d'une petite contribution lui qui utilise tant Java et Python et a même été capable de ré-écrire une machine virtuelle Java (Dalvik) pour sa plateforme Android?

Da Vinci Machine to the rescue

La stratégie officielle de Jonathan Schwartz, CEO de Sun est bien de mener la plateforme Java au même niveau de popularité, d'ouverture et de polyvalence que la plateforme LAMP. La totale ouverture open source GPL de Java avec OpenJDK en 2006 puis le rachat de MySQL en 2008 s'inscrivent pleinement dans cette optique.

Mais pour offrir des performances encore plus incontournables pour ces implémentations Java de langages dynamiques classiques comme Jython ou JRuby, ou spécifiques à Java comme Groovy ou le récent JavaFX (langage de script dédié à la programmation déclarative d'interfaces riches, comme Flex), Sun a récemment décidé d'aller encore plus loin et de modifier sa machine virtuelle Java pour mieux optimiser l'aspect dynamique de ces langages. Ce projet s'appelle "Da Vinci Machine" et comprend, entre autres, un nouveau jeu d'instructions dans le bytecode de la JVM pour autoriser un appel plus rapide des méthodes dont on ne connaît pas à l'avance les types signature comme c'est le cas dans les langages dynamique (JSR 292 InvokeDynamic)

Si pour l'instant, une performance accrue de Jython reste un vœu pieu, il est important de garder en tête ces possibilités d'évolutions car les enjeux économiques sont importants et rien n'interdit à Jython de suivre la voie ouverte par JRuby. Et quoi qu'il en soit, indépendamment des performances, Python offre dès ajourd'hui un excellent compromis entre vitesse et puissance de modélisation et il ne faut pas s'étonner que certains logiciels doivent une partie de leur succès à son utilisation plutôt que celle de langages statiques plus pesants et moins agiles et donc pas adaptés à tous les cas d'usages. Quant au passage massif de langages dynamiques sur la plateforme Java, les détails de cette nouvelle ère feront l'objet d'un autre post à venir.

Raphael Valyi
picto

Commentaires

       
Encolpe Degoute
Analyse très pertinente, mais au niveau des IDE Eclipse n'est pas le seul et des outils comme WingIDE permettent depuis plusieurs années de faire cela, même avec des serveurs d'application comme Zope.
lundi 25 août 2008 @ 12:40
       

       
Nicolas Steinmetz - http://www.unelectronlibre.info/
Intéressant.

Toutefois, il est dommage que l'arrivée de frameworks tels que Django (mais également Turbogears ou Pylons dans une moindre mesure) qui contribuent au regain d'intérêt pour python ne soient pas mentionnés
lundi 25 août 2008 @ 12:40
       

       
Jean-Sébastien Mansart - http://www.jsmansart.com
Il ne faut pas oublier Zope et Plone qui sont aussi écrits en Python.

Zope est un serveur d'application écrit entièrement en Python, et Plone, un CMS basé sur Zope.

Dans les grosses boites qui utilisent Python, on pourra aussi citer la NASA.
lundi 25 août 2008 @ 12:40
       

       
Bruno Desthuilliers - http://websiteburo.com
"moins ['objet' - nda] que Ruby ou Smalltalk qui pour lesquels tout est objet"

Certes, Python ne force pas à tout mettre dans des classes, mais tout y est bel et bien objet, y compris les modules, classes, fonctions, et même le code des fonctions...
mardi 10 février 2009 @ 22:10
       

       
Bruno Desthuilliers - http://websiteburo.com
J'auris dû lire plus avant de poster le commentaire précédent !-)

"mantra: 'il ne doit y avoir qu'une seule façon de faire les choses'"
"son créateur a décrété qu'en Python il n'y aurait qu'une seule façon de faire les choses"

Le "mantra" (extrait du 'python zen') est en fait: ""il devrait y avoir une (et de préférence une seule) façon évidente de faire" (quelque chose). Accessoirement, c'est un guideline, et non une règle absolue. Accessoirement toujours, ce "mantra" ne vient pas de GvR (l'auteur de Python), mais de Tim Peters (un contributeur du projet).

" Du côté de Python on est pas en reste. Cela fait longtemps que des gens essaient de bâtir une machine virtuelle pour Python"

Hem. A vrai dire, CPython est compilé en byte-code depuis toujours. Ce qui manque (et à quoi travaillent, entre autres, des projets comme Pypy), c'est l'optimisation aggressive (compilation JIT ou autre).

Voili voilà... Désolé pour la pédanterie de ce commentaire, et bravo pour le reste de l'article.
mardi 10 février 2009 @ 22:11
       
Ecrire un nouveau commentaire