Codon, un compilateur Python avec les performances qui seraient équivalentes à celles de C/C++, et parfois supérieures,
selon ses concepteurs
Python est l'un des langages de programmation les plus populaires, mais il est largement reconnu comme étant lent. Bien qu'il puisse être optimisé pour améliorer les performances, Python est apprécié pour des qualités autres que la vitesse, telles que la lisibilité, une courbe d'apprentissage gérable, un écosystème étendu et une utilité à la fois dans le monde universitaire et dans le monde des affaires.
Les informaticiens du Massachusetts Institute of Technology (MIT) et leurs collègues estiment avoir trouvé un moyen d’avoir l'accessibilité d'un langage de haut niveau et la vitesse d'un langage de bas niveau. Ils ont mis au point un compilateur Python appelé Codon qui transforme le code Python en code machine natif sans nuire aux performances d'exécution.
Codon est un compilateur Python haute performance qui compile le code Python en code machine natif sans aucune surcharge d'exécution. Les gains de vitesse typiques par rapport à Python sont de l'ordre de 10 à 100 fois ou plus, sur un seul thread, indiquent ses concepteurs. Selon eux, les performances de Codon sont généralement équivalentes (et parfois supérieures) à celles de C/C++. Contrairement à Python, Codon prend en charge le multithreading natif, ce qui peut entraîner des accélérations encore bien plus importantes. Codon est issu du projet Seq.
Seq un langage de programmation pour la génomique computationnelle et la bioinformatique
Grâce à une syntaxe compatible avec Python et à une multitude de fonctionnalités et d'optimisations spécifiques au domaine, Seq rend l'écriture de logiciels de génomique de haute performance aussi facile que l'écriture de code Python, et permet d'obtenir des performances comparables (et dans de nombreux cas supérieures) à celles de C/C++.
Imaginez Seq comme un Python fortement typé et compilé statiquement : toutes les fonctionnalités de Python, renforcées par un système de type fort, sans aucune surcharge de performance. Seq est capable de surpasser le code Python jusqu'à 160 fois. Seq peut également surpasser un code C/C++ équivalent jusqu'à 2 fois sans aucune intervention manuelle, et prend également en charge le parallélisme de manière native. Les détails de l'implémentation et les benchmarks sont discutés dans notre article.
Dans le but d’améliorer les performances du langage de programmation Python, Microsoft lance Faster CPython. L'équipe de développement de Python a annoncé le 4 octobre 2021 les améliorations et les nouvelles fonctionnalités de la version 3.11 de Python. Dans le but d’améliorer les performances du langage de programmation Python, Microsoft a lancé Faster CPython.
Il s’agit d’un projet financé par Microsoft, dont les membres comprennent l'inventeur de Python Guido van Rossum, l'ingénieur logiciel senior de Microsoft Eric Snow, et Mark Shannon qui est sous contrat avec Microsoft en tant que responsable technique du projet. « Python est largement reconnu comme étant lent. Alors que Python n'atteindra jamais les performances des langages de bas niveau comme C, Fortran, ou même Java, nous aimerions qu'il soit compétitif avec les implémentations rapides des langages de script, comme V8 pour Javascript », déclare Mark Shannon.
Pour être performantes, les machines virtuelles pour les langages dynamiques doivent spécialiser le code qu'elles exécutent en fonction des types et des valeurs du programme en cours d'exécution. Cette spécialisation est souvent associée aux compilateurs Just-in-time (JIT), mais elle est bénéfique même sans génération de code machine.
Notons que la spécialisation permet d'améliorer les performances, et l'adaptation permet à l'interprète de changer rapidement lorsque le modèle d'utilisation d'un programme change, limitant ainsi la quantité de travail supplémentaire causée par une mauvaise spécialisation.
Codon met en œuvre la plupart des éléments du langage Python, mais pas tous. Certains modules Python n'ont pas été intégrés dans Codon. Il omet également des fonctionnalités telles que la manipulation dynamique des types et la réflexion en cours d'exécution, qui rendent le code plus difficile à analyser et à optimiser. Ce faisant, il peut s'appuyer sur un moteur de compilation à typage statique qui, associé à d'autres innovations telles qu'une représentation intermédiaire (RI) plus optimisable et plus souple, génère un code plus rapide.
Représentation intermédiaire
La plupart des compilateurs traduisent d'abord le programme source en une forme de représentation intermédiaire, puis le convertissent en code machine. La représentation intermédiaire (RI) est une version du code source original indépendante de la machine et du langage. Bien que la conversion du code en deux fois introduise une étape supplémentaire, l'utilisation d'une représentation intermédiaire offre l'avantage d'une abstraction accrue, d'une séparation plus nette entre les extrémités avant et arrière, et ajoute des possibilités de reciblage/compilation croisée. Les représentations intermédiaires se prêtent également à la prise en charge d'optimisations avancées du compilateur, et la plupart des optimisations sont effectuées sur cette forme du code.
De nombreuses représentations intermédiaires sont utilisées (certaines suggèrent qu'il pourrait y avoir jusqu'à une unique pour chaque compilateur existant), mais les différentes représentations se ressemblent plus qu'elles ne diffèrent. Une fois que l'on s'est familiarisé avec l'une d'entre elles, il n'est pas difficile d'en apprendre d'autres. Les représentations intermédiaires sont généralement classées en fonction de la position qu'elles occupent. Elles se situent entre un langage de haut niveau et le code machine.
Les RI qui sont proches d'un langage de haut niveau sont appelées RI de haut niveau, et les RI qui sont proches de l'assemblage sont appelées RI de bas niveau. Par exemple, une RI de haut niveau peut préserver des éléments tels que les indices de tableau ou les accès aux champs, alors qu'une RI de bas niveau les convertit en adresses et décalages explicites.
Codon a été développé à l'origine comme un framework pour la création de langages spécifiques à un domaine (DSL) très performants en Python. Les DSL sont des langages axés sur un objectif spécifique, par opposition à un langage de programmation général comme Python ou C. Parmi les exemples de DSL, citons CSS et SQL.
Langage spécifique à un domaine (DSL)
Un langage spécifique à un domaine (DSL) est un langage informatique spécialisé dans un domaine d'application particulier. Il s'oppose à un langage à usage général (GPL), qui est largement applicable à tous les domaines. Il existe une grande variété de DSL, allant de langages largement utilisés pour des domaines communs, comme le HTML pour les pages web, à des langages utilisés uniquement par un ou quelques logiciels, comme le code logiciel MUSH.
Les DSL peuvent être subdivisés en fonction du type de langage, et comprennent les langages de balisage spécifiques à un domaine, les langages de modélisation spécifiques à un domaine (plus généralement, les langages de spécification) et les langages de programmation spécifiques à un domaine. Les langages informatiques spécialisés ont toujours existé à l'ère de l'informatique, mais le terme "langage spécifique à un domaine" est devenu plus populaire en raison de l'essor de la modélisation spécifique à un domaine. Les DSL plus simples, en particulier ceux qui sont utilisés par une seule application, sont parfois appelés de manière informelle des mini-langages.
La frontière entre les langages à usage général et les langages spécifiques à un domaine n'est pas toujours nette, car un langage peut avoir des caractéristiques spécialisées pour un domaine particulier mais être applicable plus largement, ou inversement, il peut en principe être capable d'une application large mais dans la pratique être utilisé principalement pour un domaine spécifique.
Par exemple, Perl a été développé à l'origine comme un langage de traitement de texte et de collage, pour le même domaine que AWK et les scripts shell, mais a été principalement utilisé comme un langage de programmation à usage général par la suite. En revanche, PostScript est un langage Turing-complet et peut en principe être utilisé pour n'importe quelle tâche, mais dans la pratique, il est étroitement utilisé comme langage de description de pages.
Dérivé de Seq, un DSL pour la bio-informatique et la génétique, Codon est devenu un compilateur de langage largement compatible avec Python 3. Comme le décrit un document fourni à The Register avant sa sortie prévue le 16 mars, « Codon : A Compiler for High-Performance Pythonic Applications and DSLs », la chaîne d'outils « permet de développer des DSL qui partagent la syntaxe et la sémantique de Python avec des fonctionnalités spécifiques au domaine et des optimisations IR ».
Les auteurs de l'article - Ariya Shajii (Exaloop), Gabriel Ramirez (MIT CSAIL), Haris Smajlović (Université de Victoria, Canada), Jessica Ray (MIT CSAIL), Bonnie Berger (MIT CSAIL), Saman Amarasinghe (MIT CSAIL) et Ibrahim Numanagić (Université de Victoria) - affirment que Codon peut produire du code machine natif sans aucune surcharge d'exécution de Python, ce qui leur permet d'obtenir des performances comparables à celles du langage C avec des scripts Python.
« Contrairement à d'autres implémentations de Python axées sur les performances (telles que PyPy ou Numba), Codon est conçu dès le départ comme un système autonome qui se compile à l'avance en un exécutable statique et n'est pas lié à un moteur d'exécution Python existant (par exemple, CPython ou RPython) pour l'exécution », indique l'article. « En conséquence, Codon peut atteindre de meilleures performances et surmonter les problèmes spécifiques à l'exécution tels que le verrouillage global de l'interpréteur ».
Les auteurs évoquent divers DSL performants basés sur Codon et conçus pour la bio-informatique, la compression de données et la programmation parallèle, qui tirent parti de l'infrastructure du compilateur Codon. Codon peut également accélérer considérablement les programmes Python standard, bien que ceux qui s'appuient sur des bibliothèques externes telles que Django ou DocUtils doivent utiliser une passerelle CPython qui limite les performances à celles de CPython. Par exemple, sur le forum Codon, un développeur entreprenant rapporte qu'un simple script Fibonacci compilé par Codon s'est exécuté plus de 70 fois plus vite que la version CPython.
Saman Amarasinghe, professeur au MIT et chercheur principal de CSAIL, a déclaré au service de presse du MIT dans un communiqué fourni à The Register que Python est souvent utilisé par des experts du domaine qui ne sont pas des experts en programmation et qui n'ont pas optimisé leurs applications en termes de performances.
« Au lieu de devoir réécrire le programme à l'aide d'une bibliothèque implémentée en C comme numpy ou de le réécrire entièrement dans un langage comme le C, Codon peut utiliser la même implémentation Python et offrir les mêmes performances que celles obtenues en réécrivant en C », a expliqué Amarasinghe. « Je pense donc que Codon est la voie la plus facile à suivre pour les applications Python réussies qui ont atteint une limite en raison d'un manque de performance. Codon, nous dit-on, est déjà utilisé commercialement dans des domaines allant de la finance quantitative et de la bio-informatique à l'apprentissage profond. Et dans les mois à venir, attendez-vous à ce que les développeurs de Codon mettent en œuvre certaines fonctionnalités Python manquantes. »
Bien que Codon prenne en charge la quasi-totalité de la syntaxe de Python, il ne s'agit pas d'un remplacement intégral, et les bases de code importantes peuvent nécessiter des modifications pour être exécutées par le compilateur Codon. Par exemple, certains modules de Python ne sont pas encore implémentés dans Codon, et certaines fonctionnalités dynamiques de Python ne sont pas autorisées. Le compilateur Codon produit des messages d'erreur détaillés pour aider à identifier et à résoudre les incompatibilités.
Source : MIT
Et vous ?
Quel est votre avis sur le sujet ?
Que pensez-vous du projet Codon ?
Voir aussi :
Python 3.11 gagnera en performance au prix d'un peu plus de mémoire, les gains de vitesse semblent se situer entre 10 % et 60 %
Python 3.11 est en moyenne 25 % plus rapide que 3.10, compilé avec GCC sur Ubuntu Linux, l'accélération peut aller de 10 à 60 %
Partager