Rust और C++ के compile time की तुलना
(quick-lint-js.com)कहीं और एक दिलचस्प लेख पढ़ने को मिला, इसलिए साझा कर रहा हूँ।
Rust और C++ की कई पहलुओं पर अक्सर तुलना की जाती है। लेकिन compile time की सीधे तुलना करना मुश्किल रहा है, क्योंकि बहुत कम ऐसे प्रोजेक्ट मिलते हैं जो दोनों भाषाओं में लिखे गए हों। quick-lint-js एक C++ में लिखा गया प्रोजेक्ट है, जिसके कुछ हिस्सों को Rust में फिर से लिखा गया और इस तरह compile time की तुलना की गई। हालांकि compile environment में Windows शामिल नहीं था।
पोर्टिंग के मानदंड
- third-party लाइब्रेरी शामिल नहीं
- Linux और macOS पर काम
- व्यापक test suite
- FFI, pointer, standard और खुद लिखे गए container, utility class और function, I/O, concurrency, generic, macro, SIMD, inheritance, ...
निष्कर्ष
- Rust का compile time C++ जैसा है या उससे धीमा है (कम-से-कम इस प्रोजेक्ट में)
- Rust में C++ की तुलना में अधिक code लिखना पड़ता है
- full build में C++ समान या तेज है
- incremental build में कभी कम समय लगता है और कभी ज़्यादा (कभी-कभी बहुत ज़्यादा)
- quick-lint-js के बाकी हिस्से को Rust में port न करने का फैसला किया गया (अगर build time में सुधार दिखता, तो शायद करते?)
4 टिप्पणियां
लगता है हमारे देश में भी Rust इस्तेमाल करने वाले काफी लोग हैं। जानना चाहता हूँ कि आप सब किस इंडस्ट्री में काम करते हैं।
पहले कंपाइल के बाद, अगर C++ में बहुत सारी dependencies वाले header की बजाय किसी एकल cpp फ़ाइल को बदला जाए तो कंपाइल काफ़ी जल्दी हो जाता है, लेकिन Rust में क्या स्थिति है, यह जानने की जिज्ञासा है।
Rust के दस्तावेज़ के FAQ सेक्शन में इससे जुड़ी बात काफ़ी विस्तार से समझाई गई थी, इसलिए साझा कर रहा हूँ
====================================
लगता है Rust का compile धीमा है। ऐसा क्यों है?
क्योंकि यह कोड को machine code में translate करता है और optimization भी करता है। Rust ऐसे high-level abstraction देता है जो efficient machine code में compile होते हैं, और यह translation process, खासकर optimization के समय, स्वाभाविक रूप से समय लेती है।
फिर भी Rust का compile time उतना बुरा नहीं है जितना अक्सर समझा जाता है, और यह मानने की वजह है कि आगे इसमें और सुधार होगा। अगर C++ और Rust में समान आकार के प्रोजेक्ट की तुलना करें, तो पूरे प्रोजेक्ट को compile करने में लगने वाला समय आम तौर पर काफ़ी मिलता-जुलता होता है। Rust का compile धीमा महसूस होने की मुख्य वजह यह है that C++ और Rust का compilation model अलग है; C++ में compilation unit एक file होती है, जबकि Rust में यह कई files से बना crate होता है। इसलिए development के दौरान अगर C++ की सिर्फ़ एक file बदली जाए, तो Rust की तुलना में compile time बहुत कम हो सकता है। अभी Rust compiler को refactor करके incremental compilation संभव बनाने का बड़ा काम चल रहा है, और यह पूरा होने पर Rust में भी C++ model की तरह compile time बेहतर होगा।
compilation model से अलग, Rust की language design में भी कई ऐसे तत्व हैं जो compile time को प्रभावित करते हैं।
पहला, Rust का type system अपेक्षाकृत जटिल है, और runtime पर Rust को safe बनाने वाले constraints लागू करने के लिए compile time का एक अनदेखा न किया जा सकने वाला हिस्सा खर्च करना पड़ता है।
दूसरा, Rust compiler पर पुराना technical debt है, और खासकर generate होने वाले LLVM IR की quality अच्छी नहीं होने के कारण LLVM को इसे “ठीक” करने में समय लगाना पड़ता है। भविष्य में MIR-आधारित optimization और translation चरण शायद Rust compiler द्वारा LLVM पर डाले जाने वाले बोझ को कम कर सकें।
तीसरा, code generation के लिए Rust का LLVM का उपयोग दोधारी तलवार है। LLVM की वजह से Rust world-class runtime performance दिखाता है, लेकिन LLVM compile time पर केंद्रित कोई framework नहीं बल्कि एक बहुत बड़ा framework है, और खासकर low-quality input के प्रति संवेदनशील है।
आख़िर में, generic types के लिए Rust की वह strategy, जिसमें C++ की तरह monomorphise किया जाता है, तेज़ code तो बनाती है, लेकिन दूसरी translation strategies की तुलना में काफ़ी अधिक code generate करना पड़ता है। इस code bloat के बदले trait object का इस्तेमाल करके dynamic dispatch के साथ trade-off किया जा सकता है.
पक्का इतना है कि Rust प्रोजेक्ट्स build करते समय डिस्क स्पेस बहुत ज़्यादा खाते हैं। मुझे याद है, लगभग सौ से ज़्यादा लाइब्रेरीज़ इस्तेमाल करने वाले एक प्रोजेक्ट को देखते-देखते करीब 2GB इस्तेमाल करते देखा तो मैं चौंक गया था...