Nouveau backend C++ pour le compilateur OCaml
(github.com/ocaml)- Un nouveau backend prenant en charge la génération de code C++ a été proposé pour le compilateur OCaml, afin de compenser les limites du backend existant basé sur C
- Le code converti est écrit dans un style fonctionnel pur, sans état mutable ni utilisation de la bibliothèque standard, avec une réimplémentation partielle du module
List - L’exécution nécessite un compilateur C++ (
g++), avec prise en charge d’options pour lever la limite de profondeur des templates ou transmettre des arguments - Les performances varient selon le compilateur ; l’application d’un algorithme de crible amélioré basé sur une file de priorité améliore la vitesse et l’efficacité mémoire
- La communauté y voit une expérience combinant langage fonctionnel et métaprogrammation par templates, avec une possible extension à Rust également évoquée
Proposition d’ajout d’un backend C++
- Un patch proposant d’ajouter un backend C++ au compilateur OCaml (
ocamlc) a été soumis- Il s’agit d’une amélioration du backend C non incrémental déjà utilisé dans le runtime et la FFI
- La commande
ocamlc -incr-c primes.mlpermet de convertir du code OCaml en C++
- Le code C++ généré est écrit dans un style fonctionnel pur et ne prend pas en charge l’état mutable
- De ce fait, la bibliothèque standard ne peut pas être utilisée ; dans l’exemple, une partie du module
Listest réimplémentée en style purement fonctionnel - La sortie est représentée sous forme de structure imbriquée
Cons<hd, tl>, avec une structure distincte pour éviter le conflit avec l’opérateur::de C++
- De ce fait, la bibliothèque standard ne peut pas être utilisée ; dans l’exemple, une partie du module
- L’exécution nécessite un compilateur C++ (
g++), et l’option-Dlimit=100permet de transmettre des arguments- Le résultat d’exécution s’affiche sous la forme de messages d’erreur du compilateur
- Pour les calculs de grande taille, l’option
-ftemplate-depth=999999permet de lever la limite de profondeur des templates
- Les performances varient selon le compilateur
g++met environ 30 secondes et utilise 11GiB de mémoire pour calculer les nombres premiers jusqu’à 10000clang++affiche un avertissement en moins d’une seconde puis se termine par une erreur de segmentation- L’application de l’algorithme de crible de O’Neill basé sur une file de priorité améliore les résultats à 8 secondes et 3.1GiB
- Une prise en charge future de Rust est évoquée comme piste d’extension
- Il est mentionné que Rust pourrait exécuter des programmes OCaml une fois le
impl specializationpartiel finalisé
- Il est mentionné que Rust pourrait exécuter des programmes OCaml une fois le
Réactions et discussions de la communauté
-
Tests de fonctionnalité et retours
redianthusdemande si les types de données récursifs non uniformes sont pris en chargestedolancorrige une erreur due à l’absence d’implémentation de%predintet confirme que ce type fonctionne correctement
-
Humour et réactions
avsmplaisante : « On avait besoin de C--, et voilà du C++, faisons un compromis avec C# »stedolanrépond : « L’an prochain, j’essaierai les nombres complexes ℂ »- De nombreuses réactions en émojis comme 😂, ❤️ et 🚀 confirment l’accueil positif de la communauté
-
Propositions techniques
AdelKSpropose une alternative utilisant l’évaluationconstexprplutôt que les templates- Il partage un exemple de code qui calcule les nombres premiers à la compilation et les intègre directement dans le binaire
LoganDarkrépond avec humour : « Mais là, on perd tout le plaisir pur de la chose », pour expliquer l’usage des templates
-
Discussions supplémentaires
redianthusaffirme que « C++ est désormais devenu un véritable langage fonctionnel »- Il souligne qu’il est possible d’implémenter en C++ les structures de données purement fonctionnelles d’OCaml
dzmitry-lahodamentionne qu’il existe déjà un projet permettant d’exécuter OCaml sur Rust (contextgeneric/cgp)
Exemples de performances et d’exécution
- Exemple de base : programme de calcul des nombres premiers
ocamlc -incr-c primes.ml→ génération deprimes.cpp- exécution de
g++ -Dlimit=100 primes.cpppour afficher la liste des nombres premiers
-
Configuration haute performance
g++ -ftemplate-depth=999999 -Dlimit=10000 primes.cpp- environ 30 secondes, 11GiB de mémoire utilisés
-
Avec l’algorithme amélioré
- performances améliorées à 8 secondes et 3.1GiB
Conclusion
- Cette PR est une expérience de nouveau backend convertissant OCaml en C++, montrant la possibilité de combiner langage fonctionnel et métaprogrammation par templates
- La communauté y voit un exemple mêlant humour technique et expérimentation créative, et y réagit activement
- La possibilité d’une extension vers d’autres langages, comme Rust, est également évoquée
Aucun commentaire pour le moment.