<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Julia</title>
		<link>https://www.developpez.net/forums/</link>
		<description><![CDATA[Forum d'entraide sur la programmation en langage Julia]]></description>
		<language>fr</language>
		<lastBuildDate>Wed, 23 Sep 2026 01:36:39 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Julia</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>La version 1.13 du langage de programmation Julia est disponible</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185640&amp;goto=newpost</link>
			<pubDate>Mon, 14 Sep 2026 11:21:05 GMT</pubDate>
			<description>*La version 1.13 du langage...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La version 1.13 du langage de programmation Julia est disponible, avec des gains de vitesse significatifs au niveau de la précompilation, du démarrage et du ramasse-miettes</font></b><br />
<br />
<b>Le projet Julia a publié la version 1.13 de son langage de programmation. Cette version met fortement l'accent sur la réduction de la latence, l'un des points faibles de longue date de Julia. Selon l'annonce, la précompilation des paquets prend désormais environ 30 % moins de temps que dans Julia 1.12, et 10 à 20 % moins de temps que la version 1.10 à support à long terme, selon la machine, tandis que le démarrage lui-même est environ 20 % plus rapide que dans la version précédente. Un autre point fort majeur est une modification apportée au ramasse-miettes. Le coût d’un ramassage complet évolue désormais en fonction du tas effectivement créé par un programme plutôt que de la quantité de code chargé.</b><br />
<br />
Julia est un langage de programmation de haut niveau, performant et dynamique conçu pour le calcul scientifique et les applications de calcul numérique. Sa syntaxe est familière aux utilisateurs d'autres environnements de développement tels que MATLAB, R, Scilab, et Python. Julia est connue pour sa vitesse et ses capacités avancées en termes de calcul parallèle et de gestion de données volumineuses. Julia combine les avantages des langages compilés (tels que C et Fortran) avec la flexibilité des langages dynamiques.<br />
<br />
Bien qu'étant un langage généraliste dans sa conception, Julia est majoritairement utilisé dans le monde scientifique. On le retrouve notamment dans des domaines tels que la science des données, la modélisation numérique, la statistique, l'apprentissage automatique ou encore la biologie et la climatologie. Les utilisateurs du langage sont en majorité des ingénieurs, des chercheurs ou des étudiants, qui l'utilisent pour faire de la recherche scientifique ou comme un passe-temps. Certains utilisateurs trouvent dans Julia un langage avec une syntaxe simple comme Python tout en ayant des performances élevées.<br />
<br />
Le projet Julia a publié la version 1.13 de son langage de programmation. Cette version met fortement l'accent sur la réduction de la latence, l'un des points faibles de longue date de Julia. Selon l'annonce, la précompilation des paquets prend désormais environ 30 % moins de temps que dans Julia 1.12, et 10 à 20 % moins de temps que la version 1.10 à support à long terme, selon la machine, tandis que le démarrage lui-même est environ 20 % plus rapide que dans la version précédente. Afin de limiter les régressions futures, le projet a également intégré la surveillance de la latence dans son propre pipeline de développement : des tâches d’intégration continue dédiées au temps de premier tracé/exécution (TTFX) s’exécutent désormais sur les pull requests et à chaque commit vers la branche master, les résultats étant suivis publiquement.<br />
<br />
Un autre point fort majeur est une modification apportée au ramasse-miettes. Les objets présents dans l’image système et les images de paquets sont désormais chargés en tant qu’objets marqués de manière permanente et ignorés par la phase de marquage du ramasse-miettes, les rares mutations qui se produisent étant suivies séparément. En conséquence, le coût d’un ramassage complet évolue désormais en fonction du tas effectivement créé par un programme plutôt que de la quantité de code chargé. La différence est frappante au vu des chiffres présentés dans l’article de blog : le temps d’exécution d’un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">GC.gc<span class="br0">&#40;</span><span class="br0">&#41;</span></span> complet dans une nouvelle session était d’environ 0,035 seconde dans Julia 1.12, contre environ 0,0005 seconde dans la version 1.13, soit une réduction de près de 70 fois.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/jPDCSG-GCYQ?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
Au-delà des performances, cette version apporte toute une série de fonctionnalités pratiques destinées aux développeurs. Une nouvelle macro publique <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@__FUNCTION__</span></span> vient s’ajouter à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@__MODULE__</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@__FILE__</span></span> pour référencer la fonction contenante la plus interne, y compris les fonctions anonymes. En coulisses, l’algorithme de hachage par défaut pour les chaînes de caractères et de nombreux types numériques a été remplacé : MurmurHash3 a cédé la place à RapidhashNano, un hachage en continu écrit en Julia pur qui, selon les développeurs, est nettement plus rapide et plus facile à maintenir.<br />
<br />
Le débogage bénéficie également d’améliorations : un nouvel indicateur de ligne de commande <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--trace-eval</span> affiche la progression de l’évaluation au niveau supérieur afin de faciliter la détection des blocages dans les scripts et les suites de tests ; il est activé automatiquement lorsque la journalisation de débogage est activée pour les exécutions en intégration continue (CI). Enfin, l’outil expérimental de « trimming » <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">juliac</span> est désormais disponible sous la forme d’un véritable paquet appelé <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">JuliaC.jl</span>, prenant en charge le « trimming » d’un plus grand nombre de constructions telles que les finaliseurs, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@cfunction</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">mapreduce</span>, ce qui constitue une avancée pour la production de binaires Julia compilés plus légers.<br />
<br />
Voici quelques points forts de Julia 1.13 :<br />
<br />
<b><font size="3">Améliorations de la latence (TTFX)</font></b><br />
<br />
Julia 1.13 met environ 30 % moins de temps à précompiler les paquets que la version 1.12, et environ 10 à 20 % moins de temps que la version 1.10 (LTS), selon la machine.<br />
<br />
Le « Time To First X » (TTFX), c'est-à-dire le temps écoulé entre le démarrage de Julia et l'obtention d'un premier résultat, se compose de trois coûts principaux : la précompilation des paquets, leur chargement et l'exécution du code. Grâce aux workflows proposés par la communauté sur Julia-TTFX-Snippets, nous avons commencé à mesurer ces coûts de manière plus systématique à partir d’exemples concrets et à optimiser Julia en fonction de ceux-ci.<br />
<br />
Le graphique ci-dessous présente la moyenne géométrique des 39 workflows actuellement proposés, sur deux machines. La précompilation correspond au meilleur temps sur deux exécutions ; les temps de chargement et d’exécution correspondent au meilleur temps sur trois exécutions.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678780d1789389177/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 537
Taille : 77,7 Ko"  style="float: CONFIG" /></div><br />
Ce suivi fait désormais partie intégrante du processus de développement de Julia : de nouvelles tâches de CI TTFX sont exécutées sur les pull requests pertinentes et à chaque commit sur la branche master, et les résultats sont suivis sur perf.julialang.org/ttfx. Ce suivi a été mis en place le 7 septembre 2026 ; les mesures effectuées avant cette date étaient ponctuelles.<br />
<br />
Le démarrage de Julia 1.13 est également environ 20 % plus rapide que celui de la version 1.12.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td valign="top"><pre style="margin: 0">% hyperfine --warmup <span style="color: #cc66cc;">3</span> --runs <span style="color: #cc66cc;">20</span> -N \
  --command-name <span style="color: #FF0000;">&quot;julia 1.12&quot;</span> <span style="color: #FF0000;">&quot;julia +1.12 --startup-file=no -e ''&quot;</span> \
  --command-name <span style="color: #FF0000;">&quot;julia 1.13&quot;</span> <span style="color: #FF0000;">&quot;julia +1.13 --startup-file=no -e ''&quot;</span>
Benchmark <span style="color: #cc66cc;">1</span>: julia <span style="color: #cc66cc;">1.12</span>
  Time <span class="br0">&#40;</span>mean &plusmn; &sigma;<span class="br0">&#41;</span>:      <span style="color: #cc66cc;">69.1</span> ms &plusmn;   <span style="color: #cc66cc;">1.0</span> ms    <span class="br0">&#91;</span>User: <span style="color: #cc66cc;">50.1</span> ms, System: <span style="color: #cc66cc;">18.1</span> ms<span class="br0">&#93;</span>
  Range <span class="br0">&#40;</span>min &#133; max<span class="br0">&#41;</span>:    <span style="color: #cc66cc;">68.0</span> ms &#133;  <span style="color: #cc66cc;">72.6</span> ms    <span style="color: #cc66cc;">20</span> runs
&nbsp;
Benchmark <span style="color: #cc66cc;">2</span>: julia <span style="color: #cc66cc;">1.13</span>
  Time <span class="br0">&#40;</span>mean &plusmn; &sigma;<span class="br0">&#41;</span>:      <span style="color: #cc66cc;">56.7</span> ms &plusmn;   <span style="color: #cc66cc;">0.5</span> ms    <span class="br0">&#91;</span>User: <span style="color: #cc66cc;">49.1</span> ms, System: <span style="color: #cc66cc;">18.9</span> ms<span class="br0">&#93;</span>
  Range <span class="br0">&#40;</span>min &#133; max<span class="br0">&#41;</span>:    <span style="color: #cc66cc;">56.0</span> ms &#133;  <span style="color: #cc66cc;">58.1</span> ms    <span style="color: #cc66cc;">20</span> runs
&nbsp;
Summary
  julia <span style="color: #cc66cc;">1.13</span> ran
    <span style="color: #cc66cc;">1.22</span> &plusmn; <span style="color: #cc66cc;">0.02</span> times faster than julia <span style="color: #cc66cc;">1.12</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<b><font size="3">Améliorations du REPL</font></b><br />
<br />
<b>Mise en évidence de la syntaxe</b><br />
<br />
Le REPL de Julia dispose désormais d’une mise en évidence de la syntaxe (sans avoir à charger un paquet externe tel que OhMyREPL.jl) :<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678781d1789389181/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/2.jpg/" border="0" alt="Nom : 2.jpg
Affichages : 442
Taille : 45,4 Ko"  style="float: CONFIG" /></div><br />
Par défaut, le jeu de couleurs est assez sobre, mais il est facile à personnaliser (voir la documentation du REPL). À titre d’exemple, voici le même code en utilisant le jeu de couleurs Monokai :<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678782d1789389185/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/3.jpg/" border="0" alt="Nom : 3.jpg
Affichages : 444
Taille : 45,4 Ko"  style="float: CONFIG" /></div><br />
<b>Nouvelle recherche dans l’historique de type fzf</b><br />
<br />
La recherche dans l’historique (accessible par défaut via Ctrl-R) a été repensée et fonctionne désormais de manière similaire à l’outil de recherche floue en ligne de commande <i>fzf</i> :<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678783d1789389189/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/4.jpg/" border="0" alt="Nom : 4.jpg
Affichages : 443
Taille : 66,2 Ko"  style="float: CONFIG" /></div><br />
Entre autres, la nouvelle recherche dans l’historique prend en charge :<br />
<br />
- La recherche floue dans l’historique.<br />
- L’affichage du mode REPL utilisé pour la commande.<br />
- La sélection de plusieurs résultats de recherche à placer dans le tampon de l’invite.<br />
- La mise en évidence de la syntaxe du code, en accord avec celle du REPL lui-même.<br />
<br />
Accédez à la recherche dans l’historique et tapez <i>?</i> pour consulter l’aide complète.<br />
<br />
<b>Collage entre crochets sous Windows</b><br />
<br />
Le collage entre crochets permet à une application s’exécutant dans un terminal de savoir quand du texte est collé (par opposition à une simple saisie). Cela permet un traitement plus efficace et plus précis du texte collé. Cette fonctionnalité est disponible depuis longtemps sous Linux et macOS, mais elle est désormais enfin disponible sous Windows. <br />
<br />
<b><font size="3">@__FUNCTION__</font></b><br />
<br />
À l’instar des macros existantes <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@__MODULE__</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@__FILE__</span></span>, la nouvelle macro <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@__FUNCTION__</span></span> fait référence à la fonction contenante la plus interne, même si cette fonction est anonyme. Cela devrait fonctionner dans tous les types de fonctions et constitue une API publique, contrairement à la variable interne <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #808080;">#self#</span></span>.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">julia&gt; fact = n -&gt; n &lt;= <span style="color: #cc66cc;">1</span> ? <span style="color: #cc66cc;">1</span> : n * <span style="color: #339933;">@__FUNCTION__</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#40;</span>n - <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;
&nbsp;
julia&gt; fact<span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>
<span style="color: #cc66cc;">120</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<b><font size="3">Modifications apportées au hachage</font></b><br />
<br />
La fonction de hachage a été remplacée. L’algorithme de hachage par octet est désormais RapidhashNano. Ce hachage est utilisé par défaut pour <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">AbstractString</span></span> et de nombreux types numériques tels que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">BigInt</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Rational</span></span>, ainsi que les valeurs <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Real</span></span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Integer</span></span> de grande taille. Il est désormais également beaucoup plus facile pour les types personnalisés d’adopter les implémentations génériques sans avoir à se convertir au préalable en un type pris en charge (comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">String</span>). Ce changement offre plusieurs avantages par rapport à l’implémentation préexistante basée sur MurmurHash3. Il offre des performances nettement supérieures, s’agit d’un hachage en continu qui ne nécessite donc plus de connaître la longueur de l’entrée à l’avance, et a été réécrit en Julia pur (au lieu de C) pour une meilleure lisibilité et maintenabilité.<br />
<br />
Pour illustrer l’amélioration des performances sur les longues chaînes de caractères :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">using</span> BenchmarkTools, Downloads
&nbsp;
io = IOBuffer<span class="br0">&#40;</span><span class="br0">&#41;</span>
Downloads.download<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;https://www.gutenberg.org/cache/epub/1080/pg1080.txt&quot;</span>, io<span class="br0">&#41;</span>
s = String<span class="br0">&#40;</span>take!<span class="br0">&#40;</span>io<span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #808080;"># 1.12</span>
<span style="color: #339933;">@btime</span> hash<span class="br0">&#40;</span>$s<span class="br0">&#41;</span>
  <span style="color: #cc66cc;">8.555</span> &mu;s <span class="br0">&#40;</span><span style="color: #cc66cc;">0</span> allocations: <span style="color: #cc66cc;">0</span> bytes<span class="br0">&#41;</span>
<span style="color: #cc66cc;">0x5fbd2717019846ea</span>
&nbsp;
<span style="color: #808080;"># 1.13</span>
<span style="color: #339933;">@btime</span> hash<span class="br0">&#40;</span>$s<span class="br0">&#41;</span>
  <span style="color: #cc66cc;">1.742</span> &mu;s <span class="br0">&#40;</span><span style="color: #cc66cc;">0</span> allocations: <span style="color: #cc66cc;">0</span> bytes<span class="br0">&#41;</span>
<span style="color: #cc66cc;">0x718308e795047519</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Et une démonstration de l’utilisation d’une solution de repli plus rapide :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">struct</span> MyString &lt;: <span style="color: #0080ff;">AbstractString</span>
    s::String
<span style="color: #0000ff;">end</span>
m = MyString<span class="br0">&#40;</span>s<span class="br0">&#41;</span>;
&nbsp;
<span style="color: #808080;"># 1.12</span>
<span style="color: #0080ff;">Base</span>.iterate<span class="br0">&#40;</span>m::MyString<span class="br0">&#41;</span> = iterate<span class="br0">&#40;</span>m.s<span class="br0">&#41;</span>
<span style="color: #0080ff;">Base</span>.iterate<span class="br0">&#40;</span>m::MyString, i::Integer<span class="br0">&#41;</span> = iterate<span class="br0">&#40;</span>m.s, i<span class="br0">&#41;</span>
<span style="color: #339933;">@btime</span> hash<span class="br0">&#40;</span>$m<span class="br0">&#41;</span>
  <span style="color: #cc66cc;">204.583</span> &mu;s <span class="br0">&#40;</span><span style="color: #cc66cc;">21</span> allocations: <span style="color: #cc66cc;">107.02</span> KiB<span class="br0">&#41;</span>
<span style="color: #cc66cc;">0x5fbd2717019846ea</span>
&nbsp;
<span style="color: #808080;"># 1.13</span>
<span style="color: #0080ff;">Base</span>.codeunit<span class="br0">&#40;</span>m::MyString<span class="br0">&#41;</span> = codeunit<span class="br0">&#40;</span>m.s<span class="br0">&#41;</span>
<span style="color: #0080ff;">Base</span>.codeunits<span class="br0">&#40;</span>m::MyString<span class="br0">&#41;</span> = codeunits<span class="br0">&#40;</span>m.s<span class="br0">&#41;</span>
<span style="color: #339933;">@btime</span> hash<span class="br0">&#40;</span>$m<span class="br0">&#41;</span>
  <span style="color: #cc66cc;">1.750</span> &mu;s <span class="br0">&#40;</span><span style="color: #cc66cc;">0</span> allocations: <span style="color: #cc66cc;">0</span> bytes<span class="br0">&#41;</span>
<span style="color: #cc66cc;">0x718308e795047519</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Le hachage des petites données à largeur fixe a également été modifié. L’étape finale de mélange est désormais une construction XMX à un seul tour avec des constantes soigneusement ajustées, et l’étape de mélange produit désormais correctement un effet d’avalanche lors de la composition d’appels de hachage ; auparavant, l’étape de mélange se simplifiait toujours en une fonction linéaire à chaque profondeur de composition. Cette modification de l’étape de mélange introduit une dépendance aux données (et donc potentiellement une baisse de performances) lors du hachage séquentiel d’éléments dans une boucle serrée, par exemple <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">foldr<span class="br0">&#40;</span>hash, collection<span class="br0">&#41;</span></span>, mais l’algorithme de hachage d’<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">AbstractArray</span></span> a été partiellement déroulé pour les tailles petites à moyennes, en maintenant plusieurs accumulateurs de hachage en parallèle, et sera bien plus rapide pour la plupart des longueurs.<br />
<br />
Quelques rappels importants : la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">hash</span> reste non cryptographique. De plus, la graine par défaut a changé. Les méthodes de hachage personnalisées doivent toujours accepter la graine en tant qu’argument, comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">hash<span class="br0">&#40;</span>x::MyType, h::UInt<span class="br0">&#41;</span></span>, et ne jamais fournir de valeur par défaut, comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">hash<span class="br0">&#40;</span>x::MyType, h::UInt=<span style="color: #cc66cc;">0</span><span class="br0">&#41;</span></span>, car la graine correcte est déterminée par l’appelant.<br />
<br />
<b><font size="3">Accélération du ramasse-miettes (GC) en ignorant les objets d’image lors du marquage</font></b><br />
<br />
Chaque session Julia commence avec un grand nombre d’objets chargés à partir de l’image système, et chaque paquet chargé apporte sa propre image de paquet contenant encore davantage d’objets : tables de méthodes, informations de type, code compilé, constantes, etc. Ces objets ne sont jamais libérés et sont rarement modifiés ; pourtant, jusqu’à présent, un ramasse-miettes complet les parcourait tous pour les marquer comme accessibles, au même titre que n’importe quel autre objet du tas. Pour une session comportant quelques paquets volumineux chargés, cela pouvait facilement constituer le coût principal d’un ramassage complet.<br />
<br />
Dans Julia 1.13, les objets de l’image système et des images de paquets sont chargés en tant qu’objets marqués de manière permanente, et la phase de marquage ne les parcourt jamais. Les rares modifications qui affectent les objets d’image (par exemple, lorsqu’une méthode est ajoutée à une fonction existante) sont suivies séparément, de sorte que tout nouvel objet vers lequel ils pointent reste en vie. Il en résulte que le coût d’un ramassage complet évolue désormais en fonction de la taille du tas effectivement créé par votre programme, et non plus en fonction de la quantité de code chargée.<br />
<br />
Le moyen le plus simple de constater la différence est de chronométrer un ramassage complet dans une nouvelle session :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;"># 1.12</span>
julia&gt; <span style="color: #339933;">@time</span> GC.gc<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span style="color: #cc66cc;">0.035493</span> seconds <span class="br0">&#40;</span><span style="color: #cc66cc;">99.90</span>% gc time<span class="br0">&#41;</span>
&nbsp;
<span style="color: #808080;"># 1.13</span>
julia&gt; <span style="color: #339933;">@time</span> GC.gc<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span style="color: #cc66cc;">0.000528</span> seconds <span class="br0">&#40;</span><span style="color: #cc66cc;">99.08</span>% gc time<span class="br0">&#41;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Le tableau ci-dessous indique la durée d’un ramassage complet (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">GC.gc<span class="br0">&#40;</span><span style="color: #339933;">true</span><span class="br0">&#41;</span></span>) sur un Apple M4 Pro, d’abord dans une session vierge, puis après le chargement de plusieurs paquets de taille croissante. Les collectes incrémentielles (jeune génération) ne sont pas affectées par ce changement et sont tout aussi rapides sur les deux versions.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678784d1789389198/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/5.jpg/" border="0" alt="Nom : 5.jpg
Affichages : 93
Taille : 23,9 Ko"  style="float: CONFIG" /></div><br />
Étant donné que les collectes complètes sont déclenchées plus souvent pour les programmes disposant d’un tas actif volumineux, cela se traduit également par une réduction du temps global de GC dans les charges de travail réelles. L’exemple suivant insère des vecteurs aléatoires dans un Dict qui est conservé d’une itération à l’autre, de sorte qu’une grande partie des objets alloués soit promue vers l’ancienne génération :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">function</span> work<span class="br0">&#40;</span>n<span class="br0">&#41;</span>
    d = Dict<span class="br0">&#123;</span>Int,Vector<span class="br0">&#123;</span><span style="color: #0080ff;">Float64</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">for</span> i <span style="color: #0080ff;">in</span> <span style="color: #cc66cc;">1</span>:n
        d<span class="br0">&#91;</span>i % <span style="color: #cc66cc;">50_000</span><span class="br0">&#93;</span> = rand<span class="br0">&#40;</span><span style="color: #cc66cc;">64</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">end</span>
    <span style="color: #0000ff;">return</span> length<span class="br0">&#40;</span>d<span class="br0">&#41;</span>
<span style="color: #0000ff;">end</span>
&nbsp;
<span style="color: #808080;"># 1.12</span>
julia&gt; <span style="color: #339933;">@time</span> work<span class="br0">&#40;</span><span style="color: #cc66cc;">5_000_000</span><span class="br0">&#41;</span>
  <span style="color: #cc66cc;">1.699095</span> seconds <span class="br0">&#40;</span><span style="color: #cc66cc;">10.00</span> M allocations: <span style="color: #cc66cc;">2.688</span> GiB, <span style="color: #cc66cc;">79.80</span>% gc time<span class="br0">&#41;</span>
&nbsp;
<span style="color: #808080;"># 1.13</span>
julia&gt; <span style="color: #339933;">@time</span> work<span class="br0">&#40;</span><span style="color: #cc66cc;">5_000_000</span><span class="br0">&#41;</span>
  <span style="color: #cc66cc;">0.566276</span> seconds <span class="br0">&#40;</span><span style="color: #cc66cc;">10.00</span> M allocations: <span style="color: #cc66cc;">2.688</span> GiB, <span style="color: #cc66cc;">44.32</span>% gc time<span class="br0">&#41;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<b><font size="3">Corrections du planificateur et des interruptions</font></b><br />
<br />
Les threads inactifs sont désormais placés dans une tâche dédiée du planificateur au lieu de rester attachés à la dernière tâche qu’ils ont exécutée, ce qui permet aux tâches terminées d’être collectées rapidement par le ramasse-miettes. Cette modification s’accompagne d’un ensemble de corrections liées au planificateur, notamment celles qui rétablissent la fiabilité des interruptions :<br />
<br />
- La combinaison Ctrl-C atteint à nouveau le code utilisateur, y compris les scripts bloqués en mode veille ou en E/S, et la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Distributed.interrupt</span> fonctionne.<br />
- Le REPL résiste à des appuis répétés et mal synchronisés sur Ctrl-C.<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@spawn</span></span> réveille un seul thread inactif dans le pool de threads de la tâche au lieu de tous les threads. Le code faisant un usage intensif de spawn gagne en vitesse : pas du tout sous macOS, de 1,1 à 1,6 fois sur une machine Linux à 16 cœurs, et de 10 à 300 fois sous Windows et sur les machines fortement surchargées, où le réveil de chaque thread constituait le coût principal.<br />
- Plusieurs problèmes de perte de tâches et de blocages ont été corrigés.<br />
<br />
Le développement d’un mécanisme d’annulation de tâches approprié est en cours et prévu pour Julia 1.14.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://julialang.org/blog/2026/09/julia-1.13-highlights/index.html" target="_blank">Annonce de Julia 1.13</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette version est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://programmation.developpez.com/actu/376632/La-version-1-12-du-langage-de-programmation-Julia-est-disponible-avec-la-redefinition-des-constantes-et-des-structures-de-nouvelles-fonctionnalites-de-multithreading-et-bien-plus-encore/" target="_blank">La version 1.12 du langage de programmation Julia est disponible, avec la redéfinition des constantes et des structures, de nouvelles fonctionnalités de multithreading et bien plus encore</a><br />
<br />
:fleche: <a href="https://programmation.developpez.com/actu/363677/La-version-1-11-du-langage-de-programmation-Julia-est-disponible-apportant-un-nouveau-type-Memory-et-de-nouvelles-fonctionnalites-a-l-inference/" target="_blank">La version 1.11 du langage de programmation Julia est disponible, apportant un nouveau type &quot;Memory&quot; et de nouvelles fonctionnalités à l'inférence</a><br />
<br />
:fleche: <a href="https://programmation.developpez.com/actu/351501/Le-potentiel-du-langage-de-programmation-Julia-pour-le-calcul-en-physique-des-hautes-energies-un-domaine-qui-necessite-d-enormes-quantites-de-calcul-et-de-stockage-selon-une-etude-scientifique/" target="_blank">Le potentiel du langage de programmation Julia pour le calcul en physique des hautes énergies, un domaine qui nécessite d'énormes quantités de calcul et de stockage, selon une étude scientifique</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p678780d1789389177/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/1.jpg/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p678781d1789389181/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/2.jpg/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p678782d1789389185/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/3.jpg/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p678783d1789389189/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/4.jpg/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p678784d1789389198/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/5.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2204/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/">Julia</category>
			<dc:creator>Jade Emy</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185640/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-13-langage-programmation-julia-disponible/</guid>
		</item>
		<item>
			<title>La version 1.12 du langage de programmation Julia est disponible</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2179791&amp;goto=newpost</link>
			<pubDate>Sat, 11 Oct 2025 10:34:27 GMT</pubDate>
			<description>*La version 1.12 du langage...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La version 1.12 du langage de programmation Julia est disponible, avec la redéfinition des constantes et des structures, de nouvelles fonctionnalités de multithreading et bien plus encore</font></b><br />
<br />
<b>Julia 1.12, la dernière version du langage de programmation, est officiellement disponible, apportant des améliorations significatives en termes de performances, de multithreading et de productivité des développeurs. Cette version introduit notamment une nouvelle fonctionnalité expérimentale --trim pour des binaires de plus petites tailles et des temps de compilation plus rapides, un multithreading amélioré avec un thread interactif dédié, la redéfinition des structures, des builds optimisés par l'outil BOLT et des capacités étendues de gestion des packages.</b><br />
<br />
Julia est un langage de programmation de haut niveau, performant et dynamique conçu pour le calcul scientifique et les applications de calcul numérique. Sa syntaxe est familière aux utilisateurs d'autres environnements de développement tels que MATLAB, R, Scilab, et Python. Julia est connue pour sa vitesse et ses capacités avancées en termes de calcul parallèle et de gestion de données volumineuses. Julia combine les avantages des langages compilés (tels que C et Fortran) avec la flexibilité des langages dynamiques.<br />
<br />
Bien qu'étant un langage généraliste dans sa conception, Julia est majoritairement utilisé dans le monde scientifique. On le retrouve notamment dans des domaines tels que la science des données, la modélisation numérique, la statistique, l'apprentissage automatique ou encore la biologie et la climatologie. Les utilisateurs du langage sont en majorité des ingénieurs, des chercheurs ou des étudiants, qui l'utilisent pour faire de la recherche scientifique ou comme un passe-temps. Certains utilisateurs trouvent dans Julia un langage avec une syntaxe simple comme Python tout en ayant des performances élevées.<br />
<br />
Julia 1.12 vient de sortir. Cette version stable apporte des améliorations du langage et des corrections de bogues, mais elle devrait également être entièrement compatible avec le code écrit dans les versions précédentes de Julia. Certaines des fonctionnalités et améliorations introduites dans cette dernière version de Julia sont présentées ci-dessous. La liste complète des modifications est <a rel="nofollow" href="https://github.com/JuliaLang/julia/blob/release-1.12/NEWS.md" target="_blank">disponible ici</a>.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/rSrhKkk70M0?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">Nouvelle fonctionnalité --trim</font></b><br />
<br />
Julia dispose désormais d'une nouvelle fonctionnalité expérimentale <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--trim</span>. Lorsque vous compilez une image système avec ce mode, Julia supprime statiquement le code inaccessible, ce qui améliore considérablement les temps de compilation et la taille des fichiers binaires. Pour l'utiliser, vous devez également passer le drapeau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--experimental</span> lors de la création de l'image système.<br />
<br />
Pour pouvoir l'utiliser, tout code accessible depuis les points d'entrée ne doit comporter aucun dispatch dynamique, sinon le trimming ne sera pas sûr et une erreur se produira lors de la compilation.<br />
<br />
La manière prévue pour l'utiliser est via le package <b>JuliaC.jl</b>, qui fournit une CLI et une API programmatique.<br />
<br />
Voici par exemple un package simple avec une fonction @main :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">module</span> AppProject
&nbsp;
<span style="color: #0000ff;">function</span> <span style="color: #339933;">@main</span><span class="br0">&#40;</span>ARGS<span class="br0">&#41;</span>
    println<span class="br0">&#40;</span><span style="color: #0080ff;">Core</span>.stdout, <span style="color: #FF0000;">&quot;Hello World!&quot;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #cc66cc;">0</span>
<span style="color: #0000ff;">end</span>
&nbsp;
<span style="color: #0000ff;">end</span></pre></td></tr></table></code><hr />
</div><br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">juliac --output-exe app_test_exe --bundle build --trim=safe --experimental ./AppProject</code><hr />
</div><br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">./build/bin/app_test_exe
Hello World!
&nbsp;
ls -lh build/bin/app_test_exe
-rwxr-xr-x@ <span style="color: #cc66cc;">1</span> gabrielbaraldi  staff   <span style="color: #cc66cc;">1.1</span>M Oct  <span style="color: #cc66cc;">6</span> <span style="color: #cc66cc;">17</span>:<span style="color: #cc66cc;">22</span> ./build/bin/app_test_exe*</pre></td></tr></table></code><hr />
</div><br />
<br />
<b><font size="3">Redéfinition des constantes (structures)</font></b><br />
<br />
Les liaisons participent désormais au mécanisme « world age » précédemment utilisé pour les méthodes. Cela permet de redéfinir correctement les constantes et les structures. Par exemple :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;"># Define a struct and a method on that struct:</span>
julia&gt; <span style="color: #0000ff;">struct</span> Foo
          a::Int
       <span style="color: #0000ff;">end</span>
&nbsp;
julia&gt; g<span class="br0">&#40;</span>f::Foo<span class="br0">&#41;</span> = f.a^<span style="color: #cc66cc;">2</span>
g <span class="br0">&#40;</span>generic <span style="color: #0000ff;">function</span> with <span style="color: #cc66cc;">1</span> method<span class="br0">&#41;</span>
&nbsp;
julia&gt; g<span class="br0">&#40;</span>Foo<span class="br0">&#40;</span><span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span style="color: #cc66cc;">4</span>
&nbsp;
<span style="color: #808080;"># Redefine the struct (julia pre-1.12 would error here)</span>
julia&gt; <span style="color: #0000ff;">struct</span> Foo
          a::Int
          b::Int
       <span style="color: #0000ff;">end</span>
&nbsp;
<span style="color: #808080;"># Note that functions need to be redefined to work on the new `Foo`</span>
julia&gt; g<span class="br0">&#40;</span>Foo<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
ERROR: <span style="color: #0080ff;">MethodError</span>: no method matching g<span class="br0">&#40;</span>::Foo<span class="br0">&#41;</span>
The <span style="color: #0000ff;">function</span> `g` exists, but no method is defined <span style="color: #0000ff;">for</span> this combination of argument types.
&nbsp;
Closest candidates are:
  g<span class="br0">&#40;</span>::<span style="color: #339933;">@world</span><span class="br0">&#40;</span>Foo, <span style="color: #cc66cc;">39296</span>:<span style="color: #cc66cc;">39300</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #808080;"># &lt;- This is syntax for accessing the binding in an older &quot;world&quot;</span>
   @ Main REPL<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span>:<span style="color: #cc66cc;">1</span>
&nbsp;
julia&gt; g<span class="br0">&#40;</span>f::Foo<span class="br0">&#41;</span> = f.a^<span style="color: #cc66cc;">2</span> + f.b^<span style="color: #cc66cc;">2</span>
g <span class="br0">&#40;</span>generic <span style="color: #0000ff;">function</span> with <span style="color: #cc66cc;">2</span> methods<span class="br0">&#41;</span>
&nbsp;
julia&gt; g<span class="br0">&#40;</span>Foo<span class="br0">&#40;</span><span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span style="color: #cc66cc;">13</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Des travaux sont également en cours dans Revise.jl pour redéfinir automatiquement les fonctions sur les liaisons remplacées. Cela devrait réduire considérablement le nombre de redémarrages de Julia nécessaires lors de l'itération sur certains morceaux de code.<br />
<br />
<b><font size="3">Nouveaux indicateurs de suivi et macros pour inspecter ce que Julia compile</font></b><br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--trace-compile-timing</span> est un nouvel indicateur de ligne de commande qui complète <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--trace-compile</span> en affichant la durée (en millisecondes) de chaque méthode compilée avant la ligne <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">precompile<span class="br0">&#40;</span>...<span class="br0">&#41;</span></span> correspondante. Cela permet de repérer plus facilement les compilations coûteuses.<br />
<br />
De plus, deux macros permettant un suivi ad hoc sans redémarrer Julia ont été ajoutées :<br />
<br />
<ul><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@trace_compile</span> expr</span> exécute <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">expr</span> avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--trace-compile=stderr --trace-compile-timing</span> activé, en émettant des entrées <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">precompile<span class="br0">&#40;</span>...<span class="br0">&#41;</span></span> chronométrées uniquement pour cet appel.</li><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">@trace_dispatch</span> expr</span> exécute expr avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--trace-dispatch=stderr</span> activé, en signalant les méthodes qui sont dispatchées dynamiquement.</li></ul><br />
Voici un exemple :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td valign="top"><pre style="margin: 0">julia&gt; <span style="color: #339933;">@trace_compile</span> <span style="color: #339933;">@eval</span> rand<span class="br0">&#40;</span><span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> * rand<span class="br0">&#40;</span><span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>
<span style="color: #808080;">#=   79.9 ms =#</span> precompile<span class="br0">&#40;</span><span style="color: #0080ff;">Tuple</span><span class="br0">&#123;</span>typeof<span class="br0">&#40;</span><span style="color: #0080ff;">Base</span>.rand<span class="br0">&#41;</span>, <span style="color: #0080ff;">Int64</span>, <span style="color: #0080ff;">Int64</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
<span style="color: #808080;">#=    4.4 ms =#</span> precompile<span class="br0">&#40;</span><span style="color: #0080ff;">Tuple</span><span class="br0">&#123;</span>typeof<span class="br0">&#40;</span><span style="color: #0080ff;">Base</span>.:<span class="br0">&#40;</span>*<span class="br0">&#41;</span><span class="br0">&#41;</span>, Array<span class="br0">&#123;</span><span style="color: #0080ff;">Float64</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#125;</span>, Array<span class="br0">&#123;</span><span style="color: #0080ff;">Float64</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
<span style="color: #cc66cc;">2</span>&times;<span style="color: #cc66cc;">2</span> Matrix<span class="br0">&#123;</span><span style="color: #0080ff;">Float64</span><span class="br0">&#125;</span>:
 <span style="color: #cc66cc;">0.302276</span>  <span style="color: #cc66cc;">0.14341</span>
 <span style="color: #cc66cc;">0.738941</span>  <span style="color: #cc66cc;">0.396414</span>
&nbsp;
julia&gt; f<span class="br0">&#40;</span>x<span class="br0">&#41;</span> = x
&nbsp;
julia&gt; <span style="color: #339933;">@trace_dispatch</span> map<span class="br0">&#40;</span>f, Any<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
precompile<span class="br0">&#40;</span><span style="color: #0080ff;">Tuple</span><span class="br0">&#123;</span>Type<span class="br0">&#123;</span>Array<span class="br0">&#123;</span><span style="color: #0080ff;">Int64</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#125;</span><span class="br0">&#125;</span>, UndefInitializer, <span style="color: #0080ff;">Tuple</span><span class="br0">&#123;</span><span style="color: #0080ff;">Int64</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
precompile<span class="br0">&#40;</span><span style="color: #0080ff;">Tuple</span><span class="br0">&#123;</span>typeof<span class="br0">&#40;</span><span style="color: #0080ff;">Base</span>.collect_to_with_first!<span class="br0">&#41;</span>, Array<span class="br0">&#123;</span><span style="color: #0080ff;">Int64</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#125;</span>, <span style="color: #0080ff;">Int64</span>, <span style="color: #0080ff;">Base</span>.Generator<span class="br0">&#123;</span>Array<span class="br0">&#123;</span><span style="color: #0080ff;">Any,</span> <span style="color: #cc66cc;">1</span><span class="br0">&#125;</span>, typeof<span class="br0">&#40;</span>Main.f<span class="br0">&#41;</span><span class="br0">&#125;</span>, <span style="color: #0080ff;">Int64</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
<span style="color: #cc66cc;">3</span>-element Vector<span class="br0">&#123;</span><span style="color: #0080ff;">Int64</span><span class="br0">&#125;</span>:
 <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">3</span></pre></td></tr></table></code><hr />
</div> <br />
 <br />
<b><font size="3">Nouvelles fonctionnalités multithreading</font></b><br />
<br />
<b><font size="2">Un thread interactif par défaut</font></b><br />
<br />
Julia démarre désormais avec un thread interactif par défaut (en plus du default thread). Cela signifie que, par défaut, Julia s'exécute avec une configuration multithreading comprenant 1 thread par défaut et 1 thread interactif.<br />
<br />
Le pool de threads interactifs est l'endroit où s'exécutent le REPL et les autres opérations interactives. En les séparant du pool de threads par défaut (où @spawn et @threads planifient le travail lorsqu'aucun pool de threads n'est spécifié), le REPL peut effectuer des opérations telles que les requêtes d'autocomplétion en parallèle avec l'exécution du code utilisateur, ce qui se traduit par une expérience interactive plus réactive.<br />
<br />
<b>Comportements clés :</b><br />
<br />
<ul><li style=""> Par défaut : Julia démarre avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-t1,<span style="color: #cc66cc;">1</span></span> (1 thread par défaut + 1 thread interactif)</li><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-t1</span> explicite : si vous demandez explicitement 1 thread avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-t1</span>, Julia vous donnera exactement cela — aucun thread interactif supplémentaire ne sera ajouté (ce qui donne <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-t1,<span style="color: #cc66cc;">0</span></span>)</li><li style=""> Threads multiples : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-t2</span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-tauto</span> vous donnera les threads par défaut demandés plus 1 thread interactif</li><li style=""> Contrôle manuel : vous pouvez toujours spécifier explicitement les deux pools, par exemple <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-t4,<span style="color: #cc66cc;">2</span></span> pour 4 threads par défaut et 2 threads interactifs</li></ul><br />
Cette modification améliore l'expérience prête à l'emploi tout en conservant la rétrocompatibilité pour les utilisateurs qui demandent explicitement une exécution à thread unique.<br />
<br />
<b><font size="2">Les paramètres des threads respectent l'affinité CPU</font></b><br />
<br />
Julia respecte désormais les paramètres d'affinité du CPU, tels que ceux définis via <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">cpuset</span>/<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">taskset</span>/<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">cgroups,</span> etc. Il en va de même pour le nombre par défaut de threads BLAS, qui suit désormais la même logique. Cela peut également être observé lors de l'exécution de Julia dans Docker. Actuellement, vous disposez de :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">$ docker run --cpus=<span style="color: #cc66cc;">4</span> --rm -ti julia:<span style="color: #cc66cc;">1.11</span> julia --threads=auto -e <span style="color: #FF0000;">'@show Threads.nthreads(); using LinearAlgebra; @show BLAS.get_num_threads()'</span>
Threads.nthreads<span class="br0">&#40;</span><span class="br0">&#41;</span> = <span style="color: #cc66cc;">22</span>
BLAS.get_num_threads<span class="br0">&#40;</span><span class="br0">&#41;</span> = <span style="color: #cc66cc;">11</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Lorsque vous démarrez Julia avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--threads=auto</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Threads.nthreads<span class="br0">&#40;</span><span class="br0">&#41;</span></span> est égal au nombre total de processeurs du système au lieu des 4 processeurs réservés par Docker. De même, le nombre de threads BLAS, qui peut être obtenu avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">BLAS.get_num_threads<span class="br0">&#40;</span><span class="br0">&#41;</span></span> et qui, sur les systèmes x86-64, correspond par défaut à la moitié du nombre de cœurs disponibles, est de 11 au lieu de 2. Avec Julia v1.12, ce problème est résolu, et le nombre de threads Julia et BLAS respectera le nombre de processeurs réservés par Docker :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">% docker run --cpus=<span style="color: #cc66cc;">4</span> --rm -ti julia:<span style="color: #cc66cc;">1.12</span> julia --threads=auto -e <span style="color: #FF0000;">'@show Threads.nthreads(); using LinearAlgebra; @show BLAS.get_num_threads()'</span>
Threads.nthreads<span class="br0">&#40;</span><span class="br0">&#41;</span> = <span style="color: #cc66cc;">4</span>
BLAS.get_num_threads<span class="br0">&#40;</span><span class="br0">&#41;</span> = <span style="color: #cc66cc;">2</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Ce nouveau comportement est également important pour éviter la sursouscription dès le départ lors de l'exécution de Julia sur des systèmes HPC où les planificateurs définissent l'affinité du CPU lors de l'utilisation de ressources partagées.<br />
<br />
<b><font size="2">OncePerX</font></b><br />
<br />
Certains modèles d'initialisation ne doivent s'exécuter qu'une seule fois, en fonction de leur portée : par processus, par thread ou par tâche. Pour faciliter et sécuriser cette opération, Julia propose désormais trois types intégrés :<br />
<br />
<ul><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OncePerProcess<span class="br0">&#123;</span>T<span class="br0">&#125;</span></span>: runs an initializer exactly once per process, returning the same value for all future calls.</li><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OncePerThread<span class="br0">&#123;</span>T<span class="br0">&#125;</span></span>: runs an initializer once for each thread ID. Subsequent calls on the same thread return the same value.</li><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OncePerTask<span class="br0">&#123;</span>T<span class="br0">&#125;</span></span>: runs an initializer once per task, reusing the same value within that task.</li></ul><br />
Ils remplacent les solutions courantes développées manuellement, telles que l'utilisation directe de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">__init__</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">nthreads<span class="br0">&#40;</span><span class="br0">&#41;</span></span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">task_local_storage<span class="br0">&#40;</span><span class="br0">&#41;</span></span>.<br />
<br />
Exemple simple d'utilisation de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OncePerProcess</span> :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">julia&gt; <span style="color: #0000ff;">const</span> global_state = <span style="color: #0080ff;">Base</span>.OncePerProcess<span class="br0">&#123;</span>Vector<span class="br0">&#123;</span><span style="color: #0080ff;">UInt32</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">do</span>
           println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Making lazy global value...done.&quot;</span><span class="br0">&#41;</span>
           <span style="color: #0000ff;">return</span> <span class="br0">&#91;</span>Libc.rand<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
       <span style="color: #0000ff;">end</span>;
&nbsp;
julia&gt; a = global_state<span class="br0">&#40;</span><span class="br0">&#41;</span>;
Making lazy <span style="color: #0000ff;">global</span> value...done.
&nbsp;
julia&gt; a === global_state<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span style="color: #339933;">true</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<b>Cas d'utilisation :</b><br />
<br />
<ul><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OncePerProcess</span> : caches, constantes globales ou initialisation qui doivent avoir lieu une seule fois par processus Julia (même lors de la précompilation).</li><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OncePerThread</span> : état par thread nécessaire à l'interopérabilité avec les bibliothèques C ou les modèles de threading spécialisés.</li><li style=""> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OncePerTask</span> : état léger de la tâche locale sans gestion manuelle de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">task_local_storage</span>.</li></ul><br />
Ces types offrent un moyen plus sûr et modulable d'exprimer la sémantique « initialiser une seule fois » dans le code Julia concurrent.<br />
<br />
<b><font size="3">Compilation de Julia et LLVM à l'aide de l'outil Binary Optimization and Layout (BOLT)</font></b><br />
<br />
BOLT est un optimiseur post-liaison de LLVM qui améliore les performances d'exécution en réorganisant les fonctions et les blocs de base, en séparant le code chaud et le code froid, et en regroupant les fonctions identiques. Julia prend désormais en charge la compilation de versions optimisées par BOLT de libLLVM, libjulia-internal et libjulia-codegen.<br />
<br />
Ces optimisations réduisent le temps de compilation et d'exécution dans les charges de travail courantes. Par exemple, les benchmarks d'inférence globale s'améliorent d'environ 10 %, une charge de travail LLVM intensive affiche un gain similaire d'environ 10 %, et la compilation de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">corecompiler.ji</span> s'améliore de 13 à 16 % avec BOLT. En combinaison avec PGO et LTO, des améliorations totales pouvant atteindre environ 23 % ont été observées.<br />
<br />
Pour créer une version optimisée de Julia pour BOLT, exécutez les commandes suivantes à partir de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">contrib/bolt/</span> :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">make stage1
make copy_originals
make bolt_instrument
make finish_stage1
make merge_data
make bolt</pre></td></tr></table></code><hr />
</div><br />
<br />
Les binaires optimisés seront disponibles dans le répertoire <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">optimized.build</span>. Un workflow analogue existe dans <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">contrib/pgo-lto-bolt/</span> pour combiner BOLT avec PGO+LTO.<br />
<br />
BOLT ne fonctionne actuellement que sur Linux x86_64 et aarch64, et les fichiers .so résultants ne doivent pas être dépouillés. Certains avertissements <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">readelf</span> peuvent apparaître pendant les tests, mais ils sont considérés comme inoffensifs.<br />
<br />
<b><font size="3">La famille de macros @atomic prend désormais en charge la syntaxe d'affectation de référence</font></b><br />
<br />
La famille de macros @atomic prend désormais en charge l'indexation (par exemple <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">m<span class="br0">&#91;</span>i<span class="br0">&#93;</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">m<span class="br0">&#91;</span>i,j<span class="br0">&#93;</span></span>) en plus de l'accès aux champs. Cela permet d'effectuer des opérations atomiques de récupération, de définition, de modification, d'échange, de comparaison et d'échange, et de définition unique directement sur des références de type tableau. Les macros se développent en nouvelles API : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">getindex_atomic</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">setindex_atomic!</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">modifyindex_atomic!</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">swapindex_atomic!</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">replaceindex_atomic!</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">setindexonce_atomic!</span>. L'indexation Vararg et CartesianIndex est prise en charge.<br />
<br />
Par exemple :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0">mem = AtomicMemory<span class="br0">&#123;</span>Int<span class="br0">&#125;</span><span class="br0">&#40;</span><span style="color: #339933;">undef</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>
&nbsp;
<span style="color: #339933;">@atomic</span> mem<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> = <span style="color: #cc66cc;">2</span>                 <span style="color: #808080;"># atomic set</span>
x = <span style="color: #339933;">@atomic</span> mem<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>                 <span style="color: #808080;"># atomic fetch</span>
<span style="color: #339933;">@atomic</span> :monotonic mem<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> += <span style="color: #cc66cc;">1</span>     <span style="color: #808080;"># atomic modify with order</span>
old = <span style="color: #339933;">@atomicswap</span> mem<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> = <span style="color: #cc66cc;">4</span>       <span style="color: #808080;"># atomic swap (returns old)</span>
res = <span style="color: #339933;">@atomicreplace</span> mem<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> <span style="color: #cc66cc;">4</span> =&gt; <span style="color: #cc66cc;">10</span>  <span style="color: #808080;"># (old=4, success=true)</span>
ok  = <span style="color: #339933;">@atomiconce</span> mem<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span> = <span style="color: #cc66cc;">7</span>         <span style="color: #808080;"># set once (Bool)</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<b><font size="3">Nouvelles fonctionnalités de paquets</font></b><br />
<br />
<b><font size="2">Espace de travail</font></b><br />
<br />
Un espace de travail est un ensemble de fichiers de projet qui partagent tous le même manifeste. Chaque projet d'un espace de travail peut inclure ses propres dépendances, ses informations de compatibilité et même fonctionner comme un package complet.<br />
<br />
Lorsque le gestionnaire de packages résout les dépendances, il prend en compte les exigences et la compatibilité de tous les projets de l'espace de travail. Les versions compatibles identifiées au cours de ce processus sont enregistrées dans un seul fichier manifeste.<br />
<br />
Un espace de travail est défini dans le projet de base en fournissant une liste des projets qu'il contient :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#91;</span>workspace<span class="br0">&#93;</span>
projects = <span class="br0">&#91;</span><span style="color: #FF0000;">&quot;test&quot;</span>, <span style="color: #FF0000;">&quot;docs&quot;</span>, <span style="color: #FF0000;">&quot;benchmarks&quot;</span>, <span style="color: #FF0000;">&quot;PrivatePackage&quot;</span><span class="br0">&#93;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Cette structure est particulièrement avantageuse pour les développeurs qui utilisent une approche monorepo, où un grand nombre de paquets non enregistrés peuvent être impliqués. Elle est également utile pour ajouter de la documentation ou des benchmarks à un paquet en incluant des dépendances supplémentaires au-delà de celles du paquet lui-même. Il est désormais recommandé de spécifier les dépendances spécifiques aux tests à l'aide de l'approche par espace de travail (un fichier de projet dans le répertoire de test qui fait partie de l'espace de travail défini par le fichier de projet du paquet).<br />
<br />
Les espaces de travail peuvent également être imbriqués : un projet qui définit lui-même un espace de travail peut également faire partie d'un autre espace de travail. Dans ce cas, les espaces de travail sont « fusionnés », un seul manifeste étant stocké à côté du « projet racine » (le projet qui n'est pas inclus dans un autre espace de travail).<br />
<br />
<b><font size="2">Applications</font></b><br />
<br />
Une application est un paquet Julia qui peut être exécuté directement depuis le terminal, à l'instar d'un programme autonome. Chaque application fournit un point d'entrée via @main et peut définir ses propres indicateurs Julia par défaut et son nom d'exécutable.<br />
<br />
Lorsqu'une application est installée, elle est placée dans .julia/bin. En l'ajoutant à votre PATH, vous pouvez la lancer par son nom avec des arguments ou des options.<br />
<br />
Une application Julia est définie dans le fichier Project.toml à l'aide d'une section [apps] :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#91;</span>apps<span class="br0">&#93;</span>
reverse = <span class="br0">&#123;</span><span class="br0">&#125;</span> <span style="color: #808080;"># empty dictionary is for additional metadata</span></pre></td></tr></table></code><hr />
</div><br />
<br />
avec un point d'entrée correspondant dans le module du paquet :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;"># src/MyReverseApp.jl</span>
<span style="color: #0000ff;">module</span> MyReverseApp
&nbsp;
<span style="color: #0000ff;">function</span> <span class="br0">&#40;</span><span style="color: #339933;">@main</span><span class="br0">&#41;</span><span class="br0">&#40;</span>ARGS<span class="br0">&#41;</span>
    <span style="color: #0000ff;">for</span> arg <span style="color: #0080ff;">in</span> ARGS
        print<span class="br0">&#40;</span>stdout, reverse<span class="br0">&#40;</span>arg<span class="br0">&#41;</span>, <span style="color: #FF0000;">&quot; &quot;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">end</span>
<span style="color: #0000ff;">end</span>
&nbsp;
<span style="color: #0000ff;">end</span> <span style="color: #808080;"># module</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Après l'installation, l'application peut être exécutée directement dans le terminal :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">$ reverse some input string
emos tupni gnirts</pre></td></tr></table></code><hr />
</div><br />
<br />
Cela rend les applications utiles pour créer des outils CLI ou regrouper les fonctionnalités Julia sous forme d'exécutables destinés aux utilisateurs. Plusieurs applications peuvent être définies par paquet à l'aide de sous-modules, et chaque application peut spécifier des indicateurs Julia par défaut (par exemple --threads=4) pour améliorer les performances ou faciliter le débogage.<br />
<br />
Pour en apprendre davantage sur ce langage de programmation, vous pouvez consulter cette excellente <a href="https://julia.developpez.com/tutoriels/decouverte-julia/" target="_blank">présentation de Julia</a>.<br />
<br />
<b>Source :</b> <a rel="nofollow" href="https://julialang.org/" target="_blank">Julia</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Quel est votre avis sur le sujet ?<br />
:fleche: Trouvez-vous les améliorations apportées par cette version de Julia pertinentes et utiles ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://programmation.developpez.com/actu/363677/La-version-1-11-du-langage-de-programmation-Julia-est-disponible-apportant-un-nouveau-type-Memory-et-de-nouvelles-fonctionnalites-a-l-inference/" target="_blank">La version 1.11 du langage de programmation Julia est disponible, apportant un nouveau type &quot;Memory&quot; et de nouvelles fonctionnalités à l'inférence</a><br />
<br />
:fleche: <a href="https://programmation.developpez.com/actu/354592/Annonce-de-Julia-v1-10-la-nouvelle-version-du-langage-de-programmation-apporte-des-ameliorations-en-termes-de-rapidite-et-de-confort-pour-les-developpeurs/" target="_blank">Annonce de Julia v1.10, la nouvelle version du langage de programmation apporte des améliorations en termes de rapidité et de confort pour les développeurs</a><br />
<br />
:fleche: <a href="https://programmation.developpez.com/actu/344483/La-version-1-9-de-Julia-un-langage-de-programmation-de-haut-niveau-est-disponible-la-nouvelle-version-est-livree-avec-de-nouvelles-fonctionnalites-qui-vont-ameliorer-les-performances-du-langage/" target="_blank">La version 1.9 de Julia, un langage de programmation de haut niveau, est disponible, la nouvelle version est livrée avec de nouvelles fonctionnalités qui vont améliorer les performances du langage</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2204/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/">Julia</category>
			<dc:creator>Anthony</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2179791/general-developpement/algorithme-mathematiques/programmation-parallele-calcul-scientifique-haute-performance-hpc/julia/version-1-12-langage-programmation-julia-disponible/</guid>
		</item>
	</channel>
</rss>
