11.5.9 : Julia



La popularité grandissante du Python dans le domaine du calcul scientifique, alors que ce langage est peu adapté à cette tâche, ne peut que laisser songeur quant à l'efficacité des codes de calcul futurs. Le langage Julia tente de fournir une réponse à ce problème.

Comme Python, Julia part d'une base dynamiquement typée. Mais contrairement à Python, Julia offre un mécanisme de typage graduel, c'est-à-dire qu'il est facile pour un programmeur d'imposer progressivement des types de données explicite dans son programme lorsque c'est utile pour vérifier que le code est correct et améliorer ses performances noteIl existe actuellement un effort pour introduire des mécanismes de typage graduels en Python, via l'extension "mypy". Mais ce mécanisme est à un stade de développement très préliminaire, fait face à une forte opposition d'une partie de la communauté Python, et sera difficile à étendre à la grande quantité de code Python existant. Julia, en tant que langage conçu dès le dé part pour le typage graduel, ne rencontre pas ces problèmes..

Grâce à cette technique, le langage Julia est presque aussi simple à prendre en main que Python pour le néophyte, tout en permettant aux programmeurs confirmés de prendre progressivement le contrôle du système de type pour produire des abstractions aussi performantes qu'en C++. Pour cette raison, les auteurs de Julia le voient comme une solution possible aux problèmes des systèmes à deux langages, la totalité d'une application scientifique (de l'interface utilisateur au cœur de calcul) pouvant être en principe écrite en Julia.

Contrairement à Python, Julia considère la production de programmes efficaces comme une de ses priorités, et lui donne un poids comparable à celui de l'ergonomie dans sa conception. Ses choix de conception (comme les types numériques disponibles ou l'organisation des données en mémoire) sont donc davantage orientés vers la performance, avec pour résultat que l'on peut parfois produire des calculs aussi efficaces qu'un code C ou Fortran équivalent, bien que l'on doive pour cela composer avec quelques mécanismes "haut niveau" indésirables lorsqu'on cherche à obtenir un code optimal comme l'utilisation d'un ramasse-miettes.

Le modèle de programmation de Julia se veut plus orienté vers les opérations mathématiques que celui des langages orienté objets classiques basés sur l'héritage de classe. À la place, il repose sur un mécanisme fondé sur la séparation des données et des fonctions et la spécialisation desdites fonctions par surcharge. Cette conception, perturbante pour les programmeurs habitués à d'autres langages, facilite certaines optimisations comme la spécialisation des calculs d'algèbre linéaire pour des types de matrice particuliers. Mais elle encourage aussi une organisation du code moins compartimentée qui pourrait compliquer la maintenance de gros programmes. À ce stade, le langage est trop jeune pour pouvoir dire si ce risque se concrétise ou non en pratique.

Comme Fortran, et contrairement à Python, C++ ou Rust, Julia supporte nativement les types de données classiques du calcul numérique (tableaux multi-dimensionnels, matrices, etc). Ceux-ci sont donc mieux intégrés au langage et plus faciles à utiliser que dans des langages où ils sont fournis par des bibliothèques.

Dans l'ensemble, le langage Julia est donc aujourd'hui un candidat sérieux à la succession de Python comme langage phare du calcul scientifique. Mais comme tous les langages récents, il dispose de moins de bibliothèques que les langages établis et celles-ci sont moins matures. Le langage lui-même est aussi en cours de finalisation, par exemple le support du parallélisme multi-thread vient seulement d'être ajouté en septembre~2019. Ses utilisateurs doivent donc s'attendre à affronter quelques défauts de jeunesse.

L'utilisation d'un interpréteur pur étant incompatible avec l'obtention de bonnes performances, et la compilation statique se prêtant mal aux langages dynamiques, Julia utilise un modèle de compilation à la volée où les fonctions sont compilées au moment où elles sont appelées par le programme, un peu comme en Java.

Ce modèle permet de générer des versions des fonctions spécialisées pour leurs paramètres d'entrées, qui peuvent dans certains cas être encore plus efficaces que celles d'un programme compilé statiquement. En revanche, cette compilation est aussi source de latences indésirables pendant l'exécution d'un programme Julia, qui rendent l'utilisation interactive du langage désagréable et sont problématiques pour les applications temps réel en général. Ce problème devrait être soluble à l'avenir par des mécanismes de compilation et optimisation graduelle du code analogues à ceux utilisés par les implémentations JavaScript.