Pin
Pin type और pinning की अवधारणा Rust के asynchronous ecosystem के बुनियादी building blocks हैं
- लेकिन
Pin समझने में कठिन है और Rust के सबसे आसानी से गलत समझे जाने वाले हिस्सों में से एक है
- यह लेख बताता है कि
Pin क्या हासिल करता है, यह कैसे आया, और आज Pin की समस्याएँ क्या हैं
Requirements
- asynchronous functions में references को support करने के लिए
Future के अंदर references को store करना पड़ता था
- समस्या यह है कि ये references self-referential हो सकते हैं
- उदाहरण कोड:
async fn foo<'a>(z: &'a mut i32) { ... }
async fn bar(x: i32, y: i32) -> i32 {
let mut z = x + y;
foo(&mut z).await;
z
}
Bar की internal state इस प्रकार है:
enum Bar {
Start { x: i32, y: i32 },
FirstAwait { z: i32, foo: Foo<'?> },
Complete,
}
Pin का लक्ष्य self-referential types को safely manipulate करना है
Non-solutions: move constructors and offset pointers
- move constructors और offset pointers Rust में काम नहीं करते
- move constructors move के समय pointers को modify करते हैं, लेकिन Rust में यह संभव नहीं है
- offset pointers भी काम नहीं करते, क्योंकि compile time पर यह पता नहीं हो सकता कि कोई reference self-referential है या नहीं
The “pinned typestate”
- कोई object हमेशा immovable नहीं होता, बल्कि किसी खास समय के बाद immovable होना चाहिए
- Ralf Jung के model में object "owned" state से "shared" state में, और फिर "pinned" state में जाता है
- pinned state में जाने के बाद object को अब move नहीं किया जा सकता
?Move
Pin से पहले Move नाम के एक नए trait पर आधारित solution की कोशिश की गई थी
- जो types
Move implement नहीं करते, वे reference लेने पर pinned state में transition हो जाते हैं
- लेकिन
Move backward compatibility नहीं देता
Pin
Pin object को pinned state में रखने के लिए एक नए reference type को design करता है
Pin को library API के रूप में implement किया गया, जिससे backward compatibility बनी रहती है
Unpin auto trait जोड़ा गया ताकि अधिकांश types pinned state और सामान्य state के बीच अंतर महसूस न करें
The problems with Pin
- usability के लिहाज़ से
Pin में कई समस्याएँ हैं
Pin को library type के रूप में implement किया गया है, इसलिए सामान्य reference types की कई सुविधाएँ गायब हो जाती हैं
- उदाहरण के लिए,
&mut T Copy implement नहीं करता, फिर भी इसे कई बार argument के रूप में pass किया जा सकता है
Pin यह सुविधा नहीं देता
Pin का इस्तेमाल करते समय काफी भ्रम पैदा होता है
In my next post…
Pin asynchronous functions में arbitrary references को safely compile होने देता है
- लेकिन
Pin complexity बढ़ाता है, और अगली पोस्ट में इसे बेहतर करने के तरीकों पर चर्चा की जाएगी
GN⁺ का सार
Pin Rust के asynchronous ecosystem का एक महत्वपूर्ण building block है
Pin की usability समस्याएँ इसलिए हैं क्योंकि इसे library type के रूप में implement किया गया है
Pin को बेहतर बनाने के तरीकों पर अगली पोस्ट में चर्चा की जाएगी
- इसी तरह की functionality वाले projects में
pin-project-lite शामिल है
1 टिप्पणियां
Hacker News राय
Pin को समझना मुश्किल है क्योंकि आधिकारिक दस्तावेज़ इसे स्पष्ट रूप से नहीं समझाते
Unpinहोते हैं, इसलिए Pin आमतौर पर कोई काम नहीं करताTका वह समूह जिन पर Pin वास्तव में काम करता है, बहुत असामान्य है और दस्तावेज़ों में इस पर पर्याप्त ज़ोर नहीं दिया गया हैPin मुश्किल है क्योंकि अपने-आप में इसका कोई अर्थ नहीं है
Pinके मामले में, language या standard library यह नहीं बताती कि Pin क्या कर सकता है और क्या नहींInnerTypeदेने वाला provider अतिरिक्त (अंदरूनी तौर पर unsafe) methods और API बनाता है ताकि pinned object को manipulate किया जा सकेPinका अपने-आप में एकमात्र उद्देश्य ऐसा pointer देना है जो कम "built-in functionality" प्रदान करता हैशीर्षक में "rust" जोड़ना चाहिए ताकि पता चले कि लेख किस बारे में है
"value identity" शब्द Mojo के दस्तावेज़ों में कहीं भी परिभाषित नहीं है
Pin तकनीकी रूप से सही लेकिन समझने में कठिन नाम का एक अच्छा उदाहरण है
immovable!(…)बेहतर हो सकता है, लेकिन इससे भी अच्छा नाम सोचना मुश्किल हैprevent_moving!(…)जैसा वर्णनात्मक नाम औरPreventMovetrait शायद बेहतर हो सकता हैRust जैसी language में अगर move-constructors हों, तो Pin की ज़रूरत खत्म हो सकती है
&mutreference के ज़रिएmem::swap/replaceसे object को move किया जा सकता है, लेकिन वास्तव में इसकी ज़रूरत कम ही पड़ती हैswapऔरreplaceको unsafe बनाना इस समस्या का समाधान हो सकता हैWithoutBoats async iterators, poll, pin जैसे विषयों पर सक्रिय चर्चा कर रहे हैं
Pinning/
!Moveasync/await के अलावा भी कई उपयोगों में काम आ सकता है