10 पॉइंट द्वारा GN⁺ 2024-12-29 | 3 टिप्पणियां | WhatsApp पर शेयर करें

#9512 - Rewrite It in Rust

  • Fish shell को Rust में फिर से लिखा गया है। अब इसमें C++ कोड बिल्कुल नहीं है और यह लगभग 100% शुद्ध Rust से बना है
  • लगभग 2 साल पहले Fish को C++ से Rust में बदलने के लिए PR (#9512) खोला गया था
  • Fish पहले भी C से C++ में बदला जा चुका है, लेकिन Rust में बदलाव उससे कहीं बड़ा प्रोजेक्ट था

C++ की समस्याएँ

  • टूलिंग और compiler का अंतर: C++ की टूलिंग अच्छी नहीं है, और नए C++ standards अपनाना packagers और contributors के लिए जटिलता पैदा करता है
  • thread safety: Fish के internal command execution अभी serial रूप में होते हैं, और async prompt या non-blocking completion जैसी सुविधाएँ जोड़ने के लिए parallel processing की ज़रूरत है
  • भाषा की जटिलता: C++ की header files, templates और string handling जटिल और असुरक्षित हैं
  • community: C++ बहुत से contributors को आकर्षित नहीं कर पाता
  • dependency समस्याएँ: खास C libraries (curses) की अस्थिरता और build समस्याओं की वजह से काफी झंझट था

Rust चुनने के कारण

  • मज़ेदार और दिलचस्प: Fish एक hobby project है, इसलिए ऐसी भाषा चाहिए थी जो मज़ेदार और दिलचस्प हो। Rust contributors के लिए अधिक आकर्षक है
  • बेहतरीन टूलिंग: rustup से compiler आसानी से install किया जा सकता है, और error messages भी साफ़ होते हैं
  • ergonomics: स्पष्ट use system और Option तथा Result जैसी सुरक्षित सुविधाएँ देता है
  • अच्छा language design: Rust का pointer और option system, C++ की तुलना में कहीं अधिक सुरक्षित है
  • parallel processing support: Rust के Send और Sync सुरक्षित parallel processing को संभव बनाते हैं
  • dependency management: YAML, JSON जैसी external formats का support आसानी से जोड़ा जा सकता है

platform support

  • ज़्यादातर प्रमुख platforms (macOS, Linux, BSD आदि) supported हैं, लेकिन Windows के native support का लक्ष्य नहीं है
  • Fish एक UNIX-केंद्रित shell है, इसलिए Windows environment के बजाय UNIX APIs और scripting language पर फोकस करता है

porting प्रक्रिया

  • Fish को "Theseus की मछली" तरीके से C++ से Rust में चरणबद्ध रूप से बदला गया। Components को एक-एक करके Rust में ले जाया गया, ताकि C++ और Rust साथ मौजूद रह सकें
    • Ship of Theseus: “अगर किसी जहाज़ की सारी लकड़ी की तख्तियाँ नई तख्तियों से बदल दी जाएँ, तो क्या वह अब भी वही जहाज़ है?”
  • FFI का उपयोग: autocxx का इस्तेमाल करके C++ और Rust के बीच bindings बनाए गए, और एक बार में एक component port किया गया
  • बड़े पैमाने पर porting: कुछ हिस्से (जैसे I/O handling) अलग से migrate किए गए ताकि जटिल FFI कोड कम हो
  • टूल सुधार: porting के दौरान Rust और C++ के बीच interoperability समस्याएँ हल करने के लिए autocxx को customize किया गया

timeline

  • जनवरी 2023: शुरुआती PR खोला गया
  • जनवरी 2024: C++ कोड पूरी तरह हटा दिया गया
  • दिसंबर 2024: Fish 4.0 beta version जारी किया गया

Rust के साथ friction

  • portability समस्याएँ: Rust का #[cfg(...)] तरीका low-level पर system differences संभालने में अक्षम है
  • localization: Rust की format strings compile time पर जाँची जाती हैं, लेकिन वे अनुवाद योग्य नहीं हैं
  • build time: LTO और default release builds के उपयोग से build time लंबा हो सकता है
  • porting के दौरान कुछ गलतियाँ हुईं, लेकिन ज़्यादातर आसानी से ठीक हो गईं

प्रमुख उपलब्धियाँ

  • curses हटाया गया: terminfo database को Rust crate से बदलकर global state और build समस्याएँ हल की गईं
  • single executable: सभी dependencies शामिल करने वाला Fish binary बनाया जा सकता है
    • इससे Fish package self-installable बन गया, जिससे users के लिए इसे इस्तेमाल करना आसान हो गया
  • performance सुधार: memory usage का optimization हुआ और नई सुविधाएँ जोड़ना आसान हुआ

सीमाएँ

  • CMake को पूरी तरह हटाया नहीं जा सका
  • Cygwin support बंद कर दिया गया: क्योंकि Rust target नहीं है
  • Windows पर अब भी केवल WSL के माध्यम से चलाया जा सकता है

वर्तमान और भविष्य

  • Fish 4.0 का port सफलतापूर्वक पूरा हो गया है, और performance बेहतर हुई है
  • Fish अब भी एक UNIX shell है, लेकिन Rust में बदलाव से नई सुविधाएँ जोड़ना संभव हो गया है
  • अब codebase पूरी तरह Rust में बदल चुका है, इसलिए maintenance और feature addition पहले से आसान हो गए हैं। Rust के फ़ायदों का उपयोग करके नई सुविधाएँ जोड़ी जा सकती हैं
  • यह बदलाव सफलतापूर्वक पूरा हुआ और contributors तथा users दोनों पर इसका सकारात्मक प्रभाव पड़ा

3 टिप्पणियां

 
annyeong 2024-12-30

मुझे fish की usability पसंद है, लेकिन compatibility, performance जैसी समस्याओं की वजह से मैं zsh को जितना हो सके fish जैसा सेट करके इस्तेमाल कर रहा हूँ। बदला हुआ fish कैसा होगा, यह देखने की उत्सुकता है 👀

 
GN⁺ 2024-12-29
Hacker News टिप्पणियाँ
  • Fish टीम को बधाई, और प्रोजेक्ट की बारीकियाँ दिलचस्प हैं। यह जानने की जिज्ञासा है कि क्या यह C++ से Rust में पूरी तरह बदलाव करने वाला सबसे बड़ा प्रोजेक्ट है। यह दूसरे प्रोजेक्ट्स के लिए उपयोगी सबक हो सकता है

    • Fish को C++ और Rust के hybrid प्रोग्राम के रूप में रिलीज़ नहीं किया गया। इसका कारण यह था कि अंतिम testing चरण पूरा नहीं हुआ था
    • कुछ लोग C++ फीचर्स को Rust में जोड़ने की प्रेरणा नहीं समझते, लेकिन यह एक अच्छा case study बन सकता है
    • यह राय है कि नए Rust code को C++ codebase में लिखा जा सके तो अच्छा होगा
  • Rust के बारे में एक मुख्य शिकायत version detection support है। feature detection, distributions, web browsers और compilers के लिए बेहतर है

    • version/name detection ही वजह है कि Chrome और IE, Mozilla होने का दिखावा करते हैं, और Clang, GCC होने का। feature detection ऐसी समस्याएँ पैदा नहीं करता
  • port के लक्ष्यों में से एक CMake को हटाना था, लेकिन यह सफल नहीं हुआ। Cargo build के लिए शानदार है, लेकिन install के लिए बहुत साधारण है। Fish में बहुत सारी scripts और documentation हैं, इसलिए यह Cargo के use case में ठीक से फिट नहीं बैठता

    • Cargo को ऐसे use case तक फैलाने के बजाय कोई दूसरा tool लागू किया जाए, यह अधिक पसंद किया जाता है
  • कुछ साल पहले bash से zsh पर स्विच करने के बाद संतुष्टि हुई थी, लेकिन नए कंप्यूटर पर fish इस्तेमाल करने पर zsh झंझटभरा और पुराना लगा। fish को कुछ हफ्तों तक आज़माने की सिफारिश की गई है

  • यह अफ़सोस की बात है that Cygwin supported नहीं है। उम्मीद है कि Rust, Cygwin को build target के रूप में support करेगा

  • Fish टीम की मेहनत प्रभावशाली है, और यह देखने की उत्सुकता है कि प्रोजेक्ट आगे कैसे विकसित होगा

  • यह जानने की जिज्ञासा है कि distribution packagers के लिए Debian guidelines के अनुसार Rust-fish को package करना कितना आसान होगा

  • Fish टीम को बधाई, और यह राय है कि सबसे अच्छा shell अब और बेहतर हो गया है। सुझाव है कि प्रोजेक्ट की tagline को "Finally, a shell for the 00s!" में अपडेट किया जाए

  • zsh से Fish पर स्विच करने के बाद configuration सरल हो गई, और Fish उम्मीद के मुताबिक काम करता है, इसलिए दोबारा बदलने का कोई विचार नहीं है

  • cfg! macro true/false में compile होता है, इसलिए if guard के अंदर का code compile होना चाहिए। my_feature के बिना compile करने पर यह fail हो सकता है

  • Fish auto-completion और syntax highlighting के लिए threads का उपयोग करता है, और language में concurrency जोड़ने का एक long-term project चल रहा है