Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2020-03-26T11:41:02+01:00Les derniers messages parus sur le forum de Zeste de Savoir.[rust] durée de vie et scopes, message #2177262020-03-26T11:41:02+01:00imperio/@imperiohttps://zestedesavoir.com/forums/sujet/13724/rust-duree-de-vie-et-scopes/?page=1#p217726<p>Elles ne sont pas constantes en rust non plus, même s’il est unsafe de les modifier.</p>[rust] durée de vie et scopes, message #2170452020-03-13T18:12:16+01:00Taurre/@Taurrehttps://zestedesavoir.com/forums/sujet/13724/rust-duree-de-vie-et-scopes/?page=1#p217045<p>Salut,</p>
<figure><blockquote>
<p>Concernant le mot-clef <code>'static</code>, il désigne plus ou moins ce qui se ramène au mot-clef <code>static</code> en C, c’est-à-dire des données constantes, en principe en lecture seule et définies à la compilation (cela va correspondre au segment <code>.data</code> ou <code>.rodata</code> au niveau ELF).</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/13724/rust-duree-de-vie-et-scopes/?page=1#p217043">r0anne</a></figcaption></figure>
<p>Juste sur ce point, en C, les données de classe de stockage statique ne sont pas constantes (sauf si l’on utilise le qualificateur <code>const</code>).</p>[rust] durée de vie et scopes, message #2170432020-03-13T13:56:36+01:00r0anne/@r0annehttps://zestedesavoir.com/forums/sujet/13724/rust-duree-de-vie-et-scopes/?page=1#p217043<p>Salut,</p>
<p>Les lifetimes en Rust ne sont pas un concept lié à la stack, ou à un quelconque concept qui existe à l’exécution. Et en fait, ils ne sont pas liés non plus directement à la profondeur d’accolades (si on inclut les blocs <code>{ }</code> non-nommés dans cette notion) : les lifetimes étaient étroitement liés à ce type de scope dans les anciennes versions de Rust, ils ne le sont plus vraiment dans les nouvelles (avant, il suffisait de faire des déclarations à l’intérieur d’un bloc non-nommé pour que le compilateur laisse plus ou moins tranquille ce que tu déclares à l’intérieur, maintenant il va plus loin que ça).</p>
<p>Plus généralement, les lifetimes n’existent qu’à la compilation et sont une indication pour le compilateur.</p>
<p>Les lifetimes sont un concept abstrait qui te permet d’effectuer une désambiguïsation à propos de la portée d’un argument de fonction, d’une valeur de retour ou d’un élément de structure. Ils te permettent d’indiquer qu’un identifiant (de variable, d’élément de structure, etc.) vivra au moins aussi longtemps qu’un autre. Cela est surtout utile dans des cas comme ceux-ci :</p>
<ul>
<li>Pour s’assurer qu’une valeur de retour, si elle fait référence à par exemple un argument, vit au moins longtemps que cet argument (dans ce cas, les arguments concernés et la valeur de retour devront partager les mêmes lifetimes),</li>
<li>Pour s’assurer qu’un élément de structure, s’il contient une référence à autre chose, vivra au moins aussi longtemps qu’un autre élément de structure dont il dépend, ou que la structure elle-même, ou qu’un lifetime passé comme générique à la structure, etc.</li>
</ul>
<p>En effet, dans ces cas-là, le lifetime constituera une aide obligatoire pour que le compilateur comprenne ce que tu veux faire sans trop se prendre la tête et effectue les bonnes vérifications. Il faut comprendre les vérifications de Rust seront suffisamment strictes dans tous les cas pour que ton code soit memory-safe (sauf si tu utilises un mot-clef comme <code>unsafe</code> ou que tu imbriques du C), simplement, parfois, il faut aiguiller le compilateur pour qu’il comprenne que tu as une raison légitime de faire sortir de ta fonction/structure une référence à une variable qui a été définie à un niveau supérieur, afin qu’il ne soit pas « trop » strict.</p>
<p>Dans les premières versions de Rust, il fallait vraiment spécifier des lifetimes de partout dans les programmes et les fonctions, bien plus que dans les cas que j’ai mentionné ci-dessus, et c’était vraiment peu lisible. Ça s’est amélioré depuis (grâce à la fonctionnalité nommée « lifetime elision », qui désigne le fait de devoir n’en spécifier que dans certains cas, tout simplement).</p>
<p>Concernant le mot-clef <code>'static</code>, il désigne plus ou moins ce qui se ramène au mot-clef <code>static</code> en C, c’est-à-dire des données constantes, en principe en lecture seule et définies à la compilation (cela va correspondre au segment <code>.data</code> ou <code>.rodata</code> au niveau ELF).</p>
<p>Bonne journée,</p>[rust] durée de vie et scopes, message #2170412020-03-13T13:27:43+01:00buffalo974/@buffalo974https://zestedesavoir.com/forums/sujet/13724/rust-duree-de-vie-et-scopes/?page=1#p217041<p><a href="/membres/voir/entwanne/" rel="nofollow" class="ping ping-link">@<span class="ping-username">entwanne</span></a> : par profondeur de scope, pour imager ce que j’entend par là, un snippet trouvé ici
<a href="https://dev.to/takaakifuruse/rust-lifetimes-a-high-wall-for-rust-newbies-3ap">https://dev.to/takaakifuruse/rust-lifetimes-a-high-wall-for-rust-newbies-3ap</a></p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-text">fn main() {
'a: {
let x: i32 = 0;
'b: {
let y: &'b i32 = &'b x;
'c: {
// ditto on 'c
let z: &'c &'b i32 = &'c y;
}
}
}
}
</code></pre></div>
<p>ou encore:</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-py"><span class="hljs-meta">>>> </span><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">outer</span><span class="hljs-params">()</span>:</span>
<span class="hljs-meta">... </span> x = <span class="hljs-number">0</span>
<span class="hljs-meta">... </span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">inner</span><span class="hljs-params">()</span>:</span>
<span class="hljs-meta">... </span> y = <span class="hljs-number">0</span>
<span class="hljs-meta">... </span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">inception</span><span class="hljs-params">()</span>:</span>
<span class="hljs-meta">... </span> <span class="hljs-keyword">nonlocal</span> y
<span class="hljs-meta">... </span> y = <span class="hljs-number">10</span>
<span class="hljs-meta">... </span> inception()
<span class="hljs-meta">... </span> <span class="hljs-keyword">nonlocal</span> x
<span class="hljs-meta">... </span> x = y
<span class="hljs-meta">... </span> inner()
<span class="hljs-meta">... </span> <span class="hljs-keyword">return</span> x
</code></pre></div>[rust] durée de vie et scopes, message #2170252020-03-12T23:54:17+01:00entwanne/@entwannehttps://zestedesavoir.com/forums/sujet/13724/rust-duree-de-vie-et-scopes/?page=1#p217025<p>Salut,</p>
<p>Qu’est-ce que tu entends par « profondeur de scope » ?</p>
<p>La notation <code>'a</code> dans les paramètres de la fonction ne veut pas dire que les deux variables reçues ont la même durée de vue, mais que <code>'a</code> correspond à la plus courte des deux.<br>
Ça sert à préciser que la durée de vie des paramètres doit être au moins aussi grande que celle de la valeur de retour.</p>
<p>Tout ça c’est quelque chose de connu à la compilation, mais ça disparaît dans l’exécutable généré où il est seulement question d’accéder à des emplacements mémoires (mais que l’on sait valides).</p>
<p>Quant à <code>'static</code>, elle correspond à la durée de vie du programme, ce sont les valeurs contenues dans la mémoire statique du programme.</p>[rust] durée de vie et scopes, message #2170222020-03-12T22:48:20+01:00buffalo974/@buffalo974https://zestedesavoir.com/forums/sujet/13724/rust-duree-de-vie-et-scopes/?page=1#p217022<p>Salut,
Voici un bout de code:</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-text">struct Foo<'a> {
bar: &'a i32
}
fn main() {
let i = 100;
let j = 100;
let a = create(&i);
let b = create(&j);
let r = get_bigger_bar(&a,&b);
println!("{}",r);
}
fn create(i:&i32) -> Foo {
Foo{bar:i}
}
fn get_bigger_bar<'a>(a:&'a Foo,b:&'a Foo) -> &'a i32 {
if a.bar < b.bar {
a.bar
} else {
b.bar
}
}
</code></pre></div>
<p>je remarque que les variable a et b ont une durée de vie notée <strong>'a</strong>.
Est-ce parce que ils viennent de "la même profondeur de scope" ?</p>
<p>j’imagine ça comme des poupées russes dans la stack (ça se passe bien dans la stack ??).
Peux t on avoir des scopes de même profondeur par rapport au main, mais néanmoins dans des scopes "parallèles" (donc pas les même scopes, je pense aux threads ou au multicore ou au multiplexage).</p>
<p>comment passer le binaire au microscope en passant par du desassemblage pour visualiser les scopes ?
(comment voit on en assembleur que deux variables sont dans un même scope ?)</p>
<p>à quoi correspond cette durée de vie: <strong>'static</strong> ?
deux variables de durée de vie 'static sont donc dans un même et unique scope ? est-ce le heap ? la section .bss en asm ? </p>
<p>quel lien entre une durée de vie et l’adresse mémoire ?</p>