Chromium में प्रतिबंधित C++ फीचर्स
(chromium.googlesource.com)- Chromium प्रोजेक्ट आधुनिक C++ standard features के उपयोग-क्षेत्र और प्रतिबंधित आइटम्स को स्पष्ट रूप से परिभाषित करता है, ताकि code consistency और security बनी रहे
- C++11~C++23 तक हर standard के लिए allowed, banned और under review (TBD) स्थिति अलग-अलग तय की गई है, और Abseil library पर भी यही मानदंड लागू होते हैं
- प्रतिबंधित फीचर्स में std::shared_ptr, std::function, std::regex, std::filesystem, std::byte, char8_t, modules आदि शामिल हैं
- अनुमत फीचर्स में concepts, spaceship operator, designated initializer, std::to_underlying, std::ranges algorithms आदि शामिल हैं
- यह guide Chromium और उसके सभी sub-projects पर लागू होती है, और code stability व build compatibility सुनिश्चित करने के लिए एक मुख्य मानदंड की तरह काम करती है
Chromium की Modern C++ उपयोग नीति
- Chromium नए C++ standard को तुरंत adopt नहीं करता, बल्कि toolchain support पर्याप्त रूप से सुनिश्चित होने के बाद उसे ‘initially supported’ स्थिति देता है
- इसके बाद हर feature को allowed, banned, या under review (TBD) में वर्गीकृत किया जाता है
- नए features की स्थिति बदलने का प्रस्ताव cxx@chromium.org mailing list के जरिए दिया जा सकता है
- initial support के 2 साल बाद, स्पष्ट review के जरिए feature को allowed या banned सूची में ले जाया जाता है
C++11 के प्रतिबंधित फीचर्स
- language features: inline namespace, long long, user-defined literals
- library features:
,,engine,,,आदि- exception पूरी तरह disabled हैं, और केवल
noexceptकी अनुमति है std::bind,std::function,std::shared_ptr,std::weak_ptrकी जगह base::Bind, base::Callback, base::RefCounted का उपयोग किया जाता है
- exception पूरी तरह disabled हैं, और केवल
C++17 के प्रतिबंधित फीचर्स
- UTF-8 character literal (u8) प्रतिबंधित है, क्योंकि
char8_tके साथ compatibility समस्या है - library में प्रतिबंधित आइटम्स:
- special math functions, parallel algorithms,
std::any,std::byte,std::filesystem,std::pmrmemory resources आदि - parallel algorithms पर libc++ support नहीं है और Chrome के threading model से टकराव की आशंका के कारण इन्हें प्रतिबंधित किया गया है
- special math functions, parallel algorithms,
C++20 के अनुमत और प्रतिबंधित फीचर्स
- अनुमत language features:
- concepts, consteval, designated initializers, spaceship operator, [[likely]], range-for initialization syntax
- अनुमत library features:
,,,,std::erase_if,std::ranges::subrange,std::to_underlyingआदि
- प्रतिबंधित फीचर्स:
- char8_t, modules, [[no_unique_address]],
std::bit_cast, ``,std::bind_front,std::ranges::view_interface
- char8_t, modules, [[no_unique_address]],
- under review (TBD): coroutine,
,,std::u8string
C++23 के अनुमत और समीक्षााधीन फीचर्स
- अनुमत language features:
#elifdef,if consteval, static operator - अनुमत library features:
std::byteswap,std::basic_string::contains,std::to_underlying,std::rangesexpanded algorithms - समीक्षााधीन फीचर्स:
std::expected,std::mdspan,std::generator,std::stacktrace,std::print,[[assume]],#warningआदि
Abseil library नीति
- प्रतिबंधित Abseil components:
absl::any,absl::optional,absl::StatusOr,absl::Span,absl::FunctionRef,absl::Mutex,absl::Time,absl::btree_*आदि- इनमें से अधिकतर को Chromium के base namespace implementations से replace किया जाता है (
base::span,base::expected,base::Bindआदि)
- under review (TBD):
absl::linked_hash_set,absl::linked_hash_map
समग्र अर्थ
- Chromium standard C++ features को बिना शर्त स्वीकार नहीं करता, बल्कि build stability, security, performance और code consistency के आधार पर चुनिंदा रूप से अपनाता है
- अधिकांश प्रतिबंधित फीचर्स के पीछे duplicate implementations (base::) या toolchain·ABI compatibility issues कारण हैं
- यह guide Chromium ecosystem के लिए C++ code quality management standard की तरह काम करती है, और open source collaboration में एक जरूरी reference document है
3 टिप्पणियां
C++ में backward compatibility की वजह से भाषा का लगातार और भारी होती जाना थोड़ा अफ़सोसजनक है..
वाकई HN की राय में कहा गया है, C++ एक बहुत विशाल भाषा है ...
Hacker News की राय
इसमें खास तौर पर कुछ बहुत अलग नहीं दिखता, ज़्यादातर बातों का मतलब है, “हम अपने उपयोग के हिसाब से बनी इन-हाउस लाइब्रेरी इस्तेमाल करें”
बाकी हिस्से भी काफ़ी वाजिब हैं, जैसे locale से जुड़ी समस्याओं से बचना। standard library के खुरदरे हिस्सों को smooth करने वाले विकल्प भी हैं, इसलिए बात समझ में आती है
chronoनहीं था, इसलिए उन्होंने अपना time type बनाया, और STL के stable होने से पहले से अपने containers इस्तेमाल करते रहेअगर आज कोई नया project शुरू किया जाए, तो शायद इनमें से ज़्यादातर नियमों का कोई मतलब न रहे
char8_tको ban करने की वजह दिलचस्प है। UTF-8 के अलावा encoding अब लगभग होती नहीं, औरchar8_t*काchar*से compatibility नहीं है, इसलिए casts की भरमार रोकने के लिएstd::stringयाstd::string_viewइस्तेमाल करने की सलाह दी गई हैपुराने code की बात से Chromium के शुरुआती दिनों की याद आ गई
यह सोचकर फिर हैरानी होती है कि यह codebase 20 साल पहले शुरू हुआ था
<regex>को ban करना अच्छा फ़ैसला था। यह UTF-8 को ठीक से handle नहीं कर पाता था, इसलिए इस्तेमाल लायक ही नहीं था। ऐसी ख़राब design का standardize हो जाना हैरान करता हैऊपर वाली directory में और भी दिलचस्प documents हैं
Chromium C++ Style Guide भी देखने लायक है
exceptions पर ban है, लेकिन Windows के लिए अपवाद रखा गया है
यानी exceptions को किसी दार्शनिक वजह से नहीं, बल्कि व्यावहारिक कारणों से ban किया गया। अगर शुरू से फिर बनाते, तो शायद फ़ैसला अलग होता
[[no_unique_address]]से जुड़ा ज़िक्र मिला, तो शायद मैं मज़ाक समझ नहीं पायाbanned features की सूची इतनी लंबी है कि वह C की पूरी feature list से भी बड़ी लगती है। हैरान कर देने वाली
u8"..."literal को ban करना अच्छा फ़ैसला है। अगर source खुद UTF-8 में लिखा जाए, तो अलग prefix की ज़रूरत नहीं पड़तीऐसे literals समस्या से पहले आए समाधान जैसे लगते हैं
मैं banned features के alternatives ढूँढना चाहता हूँ। उदाहरण के लिए
<filesystem>के बारे में कहा गया है कि उसमें testing support कम है और security vulnerabilities हैं<filesystem>इसका अपवाद हैbase/filesइस्तेमाल किया जाता हैmodules को ban किया गया है। काश D language के module system को ही copy कर लिया गया होता
यह ban list दिखाती है कि “नए features” से ज़्यादा context मायने रखता है। छोटी apps में ये दिक्कतें नहीं होतीं, लेकिन बड़े projects में जोखिम बढ़ जाता है
अलग-अलग platforms के बीच portability भी ध्यान में रखी गई है