J'ai écris ce petit billet pour présenter quelques évolutions dans le monde des compilateurs et des machines virtuelles.

En octobre dernier, je m'intéressais aux compilateurs C libres. Mis à part GCC, il n'y a aucun compilateur qui sort du lot. Et lundi, j'apprend que LLVM 2.2 est sorti. Pour la compilation C, LLVM repose actuellement sur gcc 4.2, mais le projet Clang vise à se débarasser de gcc ! Pour ceux qui ne connaissent pas LLVM, c'est un compilateur qui supporte de nombreux langages, mais c'est également un très bon optimiseur (20% plus rapide que gcc dans certains cas). Il ne contient pas de parseur qui traduit un fichier source en langage intermédiaire : c'est là qu'interviennent gcc/Clang pour le C. Les deux lettres « VM » de LLVM indiquent que c'est également une machine virtuelle. Le programme compilé peut embarquer un optimiseur temps réel qui va recompiler les fonctions les plus demandées pour générer un code plus rapide.

Sachant que PyPy supporte LLVM, je suis allé voir si le projet était encore vivant. Hé bien oui, un blog annonçant les derniers développements est même né fin octobre 2007 : PyPy Status Blog. J'apprend par exemple qu'ils ont écrit une nouvelle implémentation des chaînes de caractères basée sur des cordes. Le but est de limiter les recopies et allocations mémoire : un objet contient des portions des chaînes de caractères qui sont réassemblées à la demande. Concaténer deux chaînes de caractères ou extraire une partie d'une chaîne de caractère a un coût « nul ». C'est lorsqu'on va afficher la chaîne que Python va réassembler les bouts pour afficher la chaîne intégrale. C'est étonnant de voir que PyPy arrive à remettre en question les types de base en testant une nouvelle implémentation pour comparer les performances. C'est impossible de faire ça dans CPython. PyPy l'avait déjà fait pour les différentes implémentations de ramasse miettes : on peut en changer lorsqu'on compile PyPy.

Le langage Ruby n'est pas en reste : la machine virtuelle version 1.9, sortie pour Noël 2007, est trois fois plus rapide que la version 1.8 ! La nouvelle version est basée sur YARV (Yet Another Ruby VM), une nouvelle implémentation écrite en C datant de 2004. La page du projet indique l'unique but : développer la machine virtuelle pour Ruby la plus rapide du monde ! L'ancienne implémentation, MRI (Matz's Ruby Interpreter), est écrite en C et date de 1993. Je n'ai trouvé peu d'informations sur les améliorations de YARV sur MRI : pourquoi est-ce beaucoup plus rapide ? Il semble que MRI soit un interprète, alors que YARV utilise une machine virtuelle avec un bytecode (comme le fait Python depuis toujours).