Rust in peace

le lundi 14 octobre 2013

Notre prochain webinar

Les gens de Mozilla sont des poètes.

Quand ils n'arrivent pas, ou plus, à écrire des lettres d'amour à leur bien aimée, quand les mots ne suffisent plus, ils créent une nouvelle langue, enfin, un nouveau langage.

Il y a eu des précédents, les XPCOMs ou l'infâme mork. Mais bon, on peut difficilement les qualifier de langages, quoique pour le mork, personne n'arrive vraiment à le définir, et encore moins à le lire.

La démarche pour la création de Rust est plus saine, rassurez-vous. Ce n'est pas une réponse le nez dans le guidon, comme la plupart des innovations plus ou moins incongrues citées en exemple. Rust est une création à long terme, une prise de recul, pour apporter une réponse saine et pérenne à une question complexe. Rust est tout simplement un langage de programmation de bas niveau pour répondre aux questions contemporaines de parallélisations massives et de gestions des accès (disques, réseaux, mémoires...).

Cela fait quelque temps que l'on s'en doute, mais rien ne remplace l'intégration de certaines fonctionnalités au sein d'un langage. Des bibliothèques tierces ne suffisent pas à répondre à tous les besoins. Oui, il est possible de faire tout et n'importe quoi en C++, et il y a de fortes chances que quelqu'un l'ai déjà fait avant vous et propose une bibliothèque. L'argument classique pour différencier les langages est le niveau nécessaire pour avoir un codeur efficace (avantage PHP) et le temps pour développer une fonctionnalité. Le mythe étant, si ça rame, je referai le bout en C. Eh bien non, il peut exister des goulets d'étranglement que la violence du C peut annihiler, mais c'est souvent un souci global d'architecture, ou juste TOUT qui va plus lentement. Les langages de bas niveau sont efficaces pour discuter avec le processeur et la RAM, mais ils ont les mêmes accès disques et réseau, ou même GPUs que tout le monde. Comme souvent, l'efficacité ne vient pas des efforts individuels et localisés, mais tout simplement de la coordination. Erlang en est la parfaite démonstration, pour les mathématiques, c'est tout simplement un veau, mais pour gérer des services réseau de manière résiliente et distribuée, il n'a pas de concurrent. C++ a été conçu à une époque quand même différente de maintenant, avec du matériel et des besoins tout aussi différents. Pour dire, à l'époque, la loi de Moore existait encore. L'empilement des spécifications et certains choix regrettés depuis en font quand même un cas à part dans le monde de la programmation : une religion à temps complet. Il faut une bonne dizaine d'années de pratique pour commencer à apprécier. Un peu comme les épinards, en fait. Cela fait quelque temps qu'un remplaçant de C++ est attendu. Java a relevé le challenge avec beaucoup d'humour. Plus récemment Go a proposé de belles choses. Ces deux chalengeurs ont en fait triché, ils ont cannibalisé de belles niches autrefois occupées par le C++. Cela représente beaucoup d'applications (applications métier, coordination de services), mais laisse une large part à C++ : tout ce qui est bas niveau et temps réel. C'est dans ce domaine que se positionne Rust.

Créée pour servir de socle au Firefox du futur : le projet Servo, Rust est un langage de bas niveau, fortement typé et compilé. Il ne s'accroche pas à un paradigme de programmation, il sait utiliser des modèles objets, acteurs, procéduraux ou fonctionnels. La mémoire est utilisée de manière sure, il permet l'usage de thread léger communiquant par messages (et non par mémoire partagée), un ramasse-miette est proposé, il s'intègre simplement avec du code en C et C++ (dans les deux sens), le tout servis par une gestion des erreurs saines, et une compilation rapide. Le cahier des charges ressemble beaucoup à Go, en fait. Un go qui aurait les indispensables génériques. Rust est encore en phase de conception, il est en version 0.8, tous les choix ne sont pas encore arrêtés. Il y a en ce moment une petite polémique qui pourrait se transformer en une très bonne nouvelle. Sortir le ramasse-miette du coeur du projet et le proposer sous forme de bibliothèque. La gestion de la mémoire fait partie des plaies de l'informatique, mais penser pouvoir sauver le monde en la confiant à un ramasse-miette est une grosse erreur. Rust propose déjà de désallouer les objets en dehors de leur scope, ce qui règle de manière tacite une partie de la gestion de la mémoire. Pour les éléments moins éphémères, sur un langage de bas niveau, il est indispensable de pouvoir choisir quand est-ce que l'on fait le ménage. Pas moyen de faire des moteurs de jeux vidéos, du traitement de vidéos ou de son en temps réel sans cette maitrise-là. Avec cette simple décision, Rust se démarquerait de Go et de Java, et pourrait enfin aller joyeusement piétiner les platebandes de C++. Pour l'instant, Rust est très mozillien. Ce qui est pour l'instant normal, c'est un projet interne à Mozilla, mais il aura besoin rapidement besoin d'autonomie et de visibilité, comme un langage à part entière, et non comme un jouet perso. Java a dû attendre le tannage d'IBM pour sortir du giron de Sun, et Golang s'est soucié très tôt de son lien avec Google.

Curieusement, il existe peu de bibliothèques rust, les libs système sont de bas niveau et parfois anecdotiques (super, du md4 en standard). On est loin des habitudes de "battery include" de python reprise par tous les projets contemporains (golang, nodejs...). Il faut tout simplement aller voir ce qu'utilise Servo, le projet de Mozilla, et d'autres fans de la première heure. Il ne faut pas oublier que la syntaxe de Rust n'est pas encore fixée, et qu'il arrive encore des changements qui casse tout (un hommage à Nodejs?), et que surtout, Rust est conçu pour échanger avec C et C++, les bindings sont donc simple et élégant (là, je vois plus un hommage ironique à SWIG). Pour la gestion des images png et jpeg, c'est tout simplement du code déjà existant en C qui est utilisé. Mozilla oblige, un effort tout particulier est fait pour le cross plateforme avec des bindings vers Cocoa ou des bibliothèques UI de Linux. L'architecte du projet vient du monde du jeu vidéo. C'est en soi est une bonne idée d'avoir un oeil neuf pour des besoins web et réseau, mais c'est surtout une belle porte ouverte pour que le jeu vidéo s'en empare et le pousse dans ses retranchements. Les gamers ont plus fait pour la cryptographie en finançant Nvidia que la NSA, il ne faut pas l'oublier!

Rust est un langage jeune et novateur. Il manque clairement de stabilité (dans ses spécificications) et d'outils, mais il est extrêmement prometteur, j'ai hâte de voir ce que les gens en feront en se l'appropriant.

Pour l'instant, il faut le ranger dans la catégorie arme secrète pour des besoins précis et court dans le temps. Il faut surtout le surveiller pour faire partie des premiers à l'utiliser quand il sera suffisamment prêt.


Partager cet article :