Flowistry IDE प्लगइन जो Rust में संबंधित कोड पर फोकस करने में मदद करता है
(github.com/willcrichton)- Flowistry Rust भाषा के लिए एक IDE प्लगइन है, जो वर्तमान में जिस कोड पर फोकस करना चाहते हैं, उससे जुड़े भाग ही दिखाने की सुविधा देता है
- यह प्लगइन Rust कोड में इन्फॉर्मेशन फ्लो का विश्लेषण करके वर्तमान में देखे जा रहे वेरिएबल या एक्सप्रेशन से सीधे जुड़ा कोड ही विज़ुअली हाइलाइट करता है
- इसे VSCode प्लगइन के रूप में आसानी से इंस्टॉल किया जा सकता है, और चुने गए वेरिएबल को प्रभावित करने वाले या उससे प्रभावित होने वाले कोड को ही अधिक चमकीले रूप में दिखाता है
- "Focus mode", "mark सेटिंग" जैसी कई फ़ीचर्स की मदद से बड़े फ़ंक्शन या जटिल कोड की समझ में मदद मिलती है
- इसमें इंटरनल म्यूटेबिलिटी सपोर्ट की कमी, विश्लेषण सीमा की सीमाएँ जैसी कुछ सीमाएँ हैं, लेकिन यह विकसित हो रहा है और Rust Analyzer से अलग टूल है
Flowistry का अवलोकन और महत्त्व
Flowistry Rust डेवलपर्स के लिए एक IDE प्लगइन है, जो कोड में वर्तमान में जिस हिस्से पर ध्यान केंद्रित करना चाहते हैं, उससे संबंधित लाइनें उभारकर दिखाता है। बड़े फ़ंक्शन या जटिल कोड फ्लो में भी यह तुरंत आवश्यक हिस्से पहचानने में मदद करता है, इसलिए यह अन्य static analysis tools से अलग एक व्यावहारिक लाभ देता है। इसका मुख्य तकनीकी आधार इन्फॉर्मेशन फ्लो एनालिसिस है, जो यह पहचानने की data-flow analysis शैली है कि किसी प्रोग्राम में एक कोड का दूसरी जगह पर क्या प्रभाव पड़ सकता है। Flowistry इसे Rust की ownership/lifetime सिस्टम और Rust MIR (Mid-level Intermediate Representation) के अनुरूप देता है।
प्रमुख फीचर्स और कार्यप्रणाली
- Rust कोड में किसी खास वेरिएबल या एक्सप्रेशन पर क्लिक करने पर, उससे सीधे जुड़े और उससे प्रभावित/प्रभाव डालने वाले कोड को छोड़ बाकी कोड धुंधला हो जाता है
- केवल संबंधित कोड को अंतर्निहित रूप से हाइलाइट करने की वजह से अनावश्यक कोड पढ़ने में लगने वाला समय कम होता है और कोड के मुख्य फ्लो को जल्दी समझा जा सकता है
- बड़े फ़ंक्शन या Rust कंपाइलर के वास्तविक फ़ंक्शन जैसी जटिल कोड संरचनाओं में, किसी specific argument की भूमिका तुरंत समझ में आती है
- विश्लेषण का एल्गोरिदम PLDI 2022 में प्रकाशित 'Modular Information Flow through Ownership' पेपर पर आधारित है
इंस्टॉलेशन और पर्यावरण समर्थन
IDE प्लगइन इंस्टॉलेशन
- Flowistry एक VSCode प्लगइन के रूप में उपलब्ध है, जिसे Visual Studio Marketplace या Open VSX Registry से इंस्टॉल किया जा सकता है
- Rust वर्कस्पेस खोलने के बाद इंस्टॉलेशन और इनीशियलाइज़ेशन स्वचालित रूप से हो जाते हैं
- NixOS समर्थित नहीं है और ARM (जैसे M1 Mac) प्लेटफॉर्म पर इसे सीधे सोर्स से build करना पड़ता है
Rustc प्लगइन
- इन्फॉर्मेशन फ्लो एनालिसिस की core functionality अलग crate के रूप में ओपन स्रोत में उपलब्ध है, और विस्तृत दस्तावेज़ व API भी सीधे उपलब्ध कराए गए हैं
उपयोग विधि और फीचर विवरण
शुरुआती रन
- VSCode में प्लगइन रन करने पर कोड बेस के पूरे प्रोजेक्ट का type checking पहले किया जाता है
- इसका परिणाम
target/flowistryफोल्डर में cache होता है
Focus Mode में प्रवेश
- प्लगइन का "Toggle focus mode" कमांड (Ctrl+R Ctrl+A आदि) इस्तेमाल करके फोकस मोड में जाया जाता है
- जब कर्सर किसी फंक्शन के अंदर रखा जाता है, तो उसी फंक्शन के अंदर स्वतः info flow analysis शुरू हो जाती है
- प्लगइन जब विश्लेषण पूरा कर लेता है, तो केवल संबंधित कोड को हाइलाइट करता है (विश्लेषण में अधिकतम करीब 15 सेकंड लग सकते हैं)
Mark सेट करना
- किसी विशेष फोकस क्षेत्र को फिक्स करके अन्य कोड चेक करते समय, "Mark" कॉन्सेप्ट से वर्तमान क्षेत्र को बरकरार रखा जा सकता है
- "Set mark" (Ctrl+R Ctrl+S), "Unset mark" (Ctrl+R Ctrl+D) से फिक्स/अनफिक्स किया जा सकता है
फोकस क्षेत्र चुनना
- "Select focused region" कमांड से हाइलाइट किए गए कोड ब्लॉक को एक साथ चयन करके copy, comment आदि edits किए जा सकते हैं
सीमाएँ और सावधानियाँ
- Interior Mutability को पूरी तरह सपोर्ट नहीं करता
- उदाहरण: Arc, Mutex जैसी स्ट्रक्चर में references के बीच lifetime differences की वजह से पूर्ण ट्रैकिंग संभव नहीं है
- कभी-कभी फोकस क्षेत्र अपेक्षा से ज्यादा बड़ा हो सकता है
- क्योंकि called function के अंदरूनी हिस्सों का वास्तविक analysis नहीं हो पाता
- कुछ कोड चुनने के लिए उपलब्ध नहीं
- MIR स्तर पर Source code mapping की सीमा के कारण सभी कोड चुनना संभव नहीं होता
- Nested functions, closures, async को साथ में analyze नहीं किया जाता
- analysis हमेशा केवल वर्तमान कर्सर वाले सबसे छोटे फ़ंक्शन यूनिट पर सीमित रहता है
FAQ और अन्य
- यदि rustup install फेल हो: rustup को manual command से इंस्टॉल करके VSCode में आगे बढ़ना होगा
- Rust Analyzer के साथ एकीकरण क्यों नहीं: Rust Analyzer MIR analysis और borrow checker सपोर्ट नहीं करता, इसलिए यह अलग प्लगइन मॉडल है
- कोड हाइलाइट संबंधी समस्या: सीमाओं वाला दस्तावेज़ देखें; अतिरिक्त प्रश्नों के लिए GitHub issues, Discord और Twitter के माध्यम से संपर्क किया जा सकता है
लाइसेंस और ओपन सोर्स जानकारी
- MIT लाइसेंस के तहत ओपन सोर्स रिलीज़
- मुख्य भाषाएँ Rust, TypeScript, और अतिरिक्त रूप से Python, HTML, JavaScript आदि
- सितंबर 2025 के हिसाब से 2.6k stars, 61 forks के साथ यह अभी भी सक्रिय रूप से maintained है
निष्कर्ष
Flowistry Rust डेवलपमेंट वातावरण में जटिल कोड के संदर्भ को समझने और फोकस बढ़ाने में वास्तविक मदद करने वाला ओपन सोर्स टूल है। खासकर information flow analysis को real-time में IDE के अंदर विज़ुअली उपलब्ध कराने के कारण यह अन्य static analysis tools या Rust Analyzer से अलग अनुभव देता है। Rust भाषा की सीख, refactoring और code review जैसी विभिन्न परिस्थितियों में इसकी उपयोगिता और efficiency काफी ऊँची हो सकती है।
1 टिप्पणियां
Hacker News राय
असली पेपर यहाँ है, मैं Rust में statically checked back-reference के बारे में लंबे समय से सोच रहा हूँ, C/C++ उपयोगकर्ताओं को Rust से बड़ी शिकायतों में से एक यह है कि जब A, B को refer करता है तो B से वापस A की ओर pointer रखना कठिन होता है, इसलिए अक्सर unsafe workaround इस्तेमाल किए जाते हैं
Rust में Rc, RefCell, Weak, borrow(), borrow_mut(), upgrade(), downgrade() आदि का उपयोग करके इसे सुरक्षित रूप से लागू किया जा सकता है, लेकिन कोड verbose हो जाता है, runtime overhead आता है, और double borrow में panic भी हो सकता है, फिर भी इसकी expressive power पर्याप्त है, मैं अपने चल रहे काम पर notes में लिख रहा हूँ
जहाँ static checking कठिन है, वह borrowed scopes के overlap न होने की पुष्टि करना है; अगर lifetime scopes overlap नहीं करते तो conflict नहीं होता, लेकिन function call या generic function call के समय scope check और पेचीदा हो जाता है, Flowistry का approach इसमें मददगार हो सकता है
यह बात थोड़ी खटकती है कि Flowistry interior mutability (जैसे RefCell) को पूरी तरह handle नहीं करता
व्यवहारिक रूप से, असली मुद्दा ऐसे constraints खोजना है जो 1) sound हों, 2) compile time पर कम लागत में check किए जा सकें, 3) tree के parent node reference जैसी back pointer ज़रूरतों को अधिकतर लोगों के लिए संभव बनाएँ, 4) समस्या होने पर उपयोगी diagnostic message दें
मैं जानना चाहता हूँ कि क्या दूसरी भाषाओं में function body के भीतर थोड़े बड़े या अनौपचारिक dependency संबंधों को check करने वाली कोई सुविधा है
उदाहरण के लिए, अगर parameter या variable foo को highlight किया जाए, तो क्या foo के direct uses के साथ-साथ foo से बने सभी variables के uses भी एक साथ देखे जा सकते हैं
Rust का borrow उपयोग इस तरह की tracking को पूरी तरह करता है, लेकिन ऐसी visualization दूसरी भाषाओं के कोड में भी बहुत उपयोगी लगेगी
मेरा मानना है कि Flowistry, servo के flexbox layout code जैसे आधुनिक codebase की कठिन maintenance वाली files के लिए बहुत ज़रूरी होगा, संदर्भ के लिए, यह function 400 lines से अधिक का है और सबसे उलझाऊ code files में से एक है
(मैं गलत हो सकता हूँ) आम तौर पर इसे "flow analysis" कहा जाता है, और TypeScript इसे background में चलाकर types को narrow करता है
लेकिन इसमें visualization नहीं है
ऐसी सुविधा को आम तौर पर "program slicing" कहा जाता है
जब लोग ऐसा coding style नहीं अपनाते जो इंसानों के लिए पढ़ने में आसान हो, तब इसे पूरा करने वाला यह बहुत उपयोगी tool लगता है
base code हमेशा पढ़ने योग्य नहीं लिखा जाता, इसलिए मुझे लगता है ऐसे tools बहुत मदद करते हैं
लेखक ने Rust East Coast में plugin और routine research पर गहराई से चर्चा करने वाला talk video पेश किया था
मुझे यह सच में शानदार feature लगता है, Rust इसके लिए उपयुक्त इसलिए है क्योंकि उसका ownership system side effects को सीमित रखता है
अगर इसे Python वगैरह में जोड़ें, तो runtime पर कभी भी call stack ऊपर जाकर memory manipulate की जा सकती है, इसलिए इसे 100% भरोसेमंद नहीं कहा जा सकता
फिर भी ज़्यादातर मामलों में यह सही होगा, इसलिए मैं चाहूँगा कि ऐसी सुविधा जोड़ी जाए
मैं जानना चाहता हूँ कि TypeScript या JavaScript में इसके जैसा कोई tool है या नहीं
अच्छा दिखता है, लेकिन इसे 'IDE' कहने के बजाय सीधे VSCode plugin कहना बेहतर होता
शायद इसलिए कि "Visual Studio Code" Microsoft का trademark है, और यह plugin VSCodium, Cursor जैसे open-source आधारित IDEs में भी चलता है
documentation में भी इसे IDE plugin ही कहा गया है
कोड के महत्वपूर्ण हिस्सों पर focus लाने का विचार वाकई बहुत अच्छा लगता है
जानना चाहता हूँ कि JS/TS में भी ऐसा कुछ है या नहीं
मैं जानना चाहता हूँ कि rust-analyzer के documentHighlight LSP method में contribute करना कैसा रहा
यह GIF में दिख रहे feature जैसा काफी मिलता-जुलता व्यवहार करता है
plugin के रूप में बनाने के लिए यह कुछ ज़्यादा specific feature लगता है
संबंधित LSP spec link
README में समझाया गया है, अधिक विवरण यहाँ मिल सकता है
MIR(Mid-level Intermediate Representation) की ज़रूरत है
मैंने हमेशा ऐसी सुविधा का सपना देखा है, और चाहता था कि यह function के बाहर से आने वाले data flow का path भी दिखाए, यानी इस function को कौन call करता है
मुझे लगता है compiler data को reuse करके इसमें मदद मिल सकती है