3 पॉइंट द्वारा GN⁺ 2024-10-16 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • नए C मानक के अनुरूप Modern C का संशोधित संस्करण मुफ्त डाउनलोड के लिए जारी किया गया है, जिससे C भाषा की सीखने और संदर्भ सामग्री को C23 मानक के आधार पर फिर से देखा जा सकता है
  • संशोधन का केंद्र C23 का समावेश है, और फोकस ISO प्रकाशन प्रक्रिया और समयरेखा के साथ तालमेल रखते हुए नए मानक में संक्रमण में मदद करने पर है
  • प्रमुख compiler के नए releases पहले ही C23 की अधिकांश सुविधाएँ लागू कर चुके हैं, इसलिए किताब में किए गए बदलाव प्रयोगात्मक परिचय से आगे बढ़कर वास्तविक उपयोग वातावरण से जुड़े हैं
  • _BitInt(N), nullptr, auto, typeof, constexpr जैसी भाषा और library में बदलाव व्यापक रूप से शामिल किए गए हैं, जिनका असर मौजूदा C code लिखने के तरीकों पर भी पड़ता है
  • मौजूदा platforms पर तुरंत आज़माने के लिए transition appendix और अस्थायी include header जोड़े गए हैं, लेकिन Manning का MEAP अभी भी प्रगति पर है

मुफ्त सार्वजनिक सामग्री और मानक दस्तावेज़

  • Modern C C23 संस्करण मुफ्त में डाउनलोड किया जा सकता है
  • किताब के समर्पित पेज पर संबंधित सामग्री साथ में मिल सकती है
  • संशोधित संस्करण में कई व्याख्याएँ सुधारी गई हैं, लेकिन मुख्य उद्देश्य नए C मानक C23 को प्रतिबिंबित करना है
  • सार्वजनिक रूप से सुलभ दस्तावेज़ों में नए मानक की सामग्री के सबसे करीब N3220 PDF है
  • प्रमुख compiler के नए releases पहले ही C23 द्वारा लाई गई अधिकांश नई सुविधाएँ लागू कर चुके हैं

C23 भाषा परिवर्तन और transition support

  • integer से जुड़े बदलाव बड़ा हिस्सा लेते हैं
    • नया bit-precise type _BitInt(N) जोड़ा गया है
    • overflow-checked arithmetic और bit manipulation के लिए नए C library header जोड़े गए हैं
    • आधुनिक architecture में 128-bit type की संभावना को प्रतिबिंबित किया गया है
    • enum type में वास्तविक सुधार भी शामिल हैं
  • C23 की अन्य नई अवधारणाएँ भी शामिल हैं
    • nullptr constant और उसका आधार type
    • attributes के माध्यम से syntax annotations
    • auto और typeof सहित type-generic programming tools
    • variable-length arrays पर भी लागू होने वाला {} default initialization
    • सभी types के named constants के लिए constexpr
  • नई सामग्री compound expressions, lambdas, “internationalization”, और program failure के प्रति व्यापक दृष्टिकोण तक को कवर करती है
  • मौजूदा platforms पर C23 तुरंत शुरू करने के लिए appendix और अस्थायी include header जोड़े गए हैं
  • Manning के नए संस्करण का MEAP अभी भी खुला है

1 टिप्पणियां

 
GN⁺ 2024-10-16
Hacker News राय
  • मेरी मशीन के storage order, यानी little endian, के उलट जहां high-order representation पहले आती है, उसे big endian कहते हैं। लेकिन modern processors में दोनों आम तौर पर इस्तेमाल होते हैं कहना थोड़ा बढ़ा-चढ़ाकर लगता है, क्योंकि s390x के अलावा अब बहुत कम बचे हैं
    लगता है अब सबके पसंदीदा niche/लगभग खत्म हो चुके big endian architecture वाले comments आने ही वाले हैं

    • Arm bi-endian है और ज़्यादातर phones में जिंदा है
      ऊपर के दूसरे comment की तरह, modern का मतलब ज़रूरी नहीं कि popular या widely used हो
    • POWER bi-endian है। हाल का Linux on POWER little endian है, और पहले big endian Linux on POWER आम था, लेकिन कुछ साल पहले distros ने switch कर लिया। वहीं AIX और IBM i big endian हैं
      AIX और IBM i शायद IBM mainframes जितने active नहीं होंगे, लेकिन AIX को Solaris या HP/UX से भी ज़्यादा alive माना जा सकता है, और पुराने ढेरों commercial Unix से तुलना करें तो और भी ज़्यादा। IBM i भी किसी तरह टिके हुए है, लेकिन HP MPE जैसे vendor support officially खत्म हो चुके rival legacy midrange platforms से कहीं ज़्यादा alive है
    • MIPS consumer networking hardware में अभी भी काफी जिंदा है
    • एक तरह से कहें तो सभी processors इसे आम तौर पर इस्तेमाल करते हैं, क्योंकि network byte order big endian होता है
    • Sparc big endian नहीं है क्या?
  • C का सबसे महत्वपूर्ण पहलू portability है। छोटे microcontrollers से लेकर लगभग हर computing platform तक जाना ही मुख्य बात है, लेकिन सवाल है कि नया C version उतना adopt होगा या नहीं
    अगर cutting edge इस्तेमाल करना हो तो मैं C के बजाय C++2x या Rust चुनूंगा। क्या मैं कुछ miss कर रहा हूं? जानना चाहूंगा कि इस तथाकथित modern C का फायदा क्या है

    • C code लिखने का एक फायदा यह है कि idiomatic code कैसा दिखना चाहिए, language का कौन-सा subset सही है—ऐसी झंझटभरी बहसों में नहीं पड़ना पड़ता
      cutting edge के लिए मैं Zig recommend करूंगा। modern C++ और Rust की तुलना में language complexity बहुत कम है। C23 का एक कम दिखाई देने वाला अच्छा side effect यह है कि ... = {} और {0} जैसी syntax को C++ के और करीब कर दिया गया है, जिससे C library maintainers के लिए उन लोगों को support करना कम परेशान करने वाला हो जाता है जो C code को C++ compiler से build करना चाहते हैं
    • जैसा पहले C11, GNU extensions, और अब C23 में आई अलग-अलग features के साथ हुआ, आखिरकार adoption हो जाएगा। उदाहरण के लिए binary notation 0b microcontroller world में व्यापक रूप से इस्तेमाल होता है
      microcontroller toolchains आम तौर पर GCC के ऊपर बने होते हैं, इसलिए features मुफ्त में मिल जाते हैं। कुछ proprietary C compilers हमेशा पीछे रहते हैं, लेकिन वे 20 साल पहले जितने महत्वपूर्ण नहीं रहे
    • ये features आखिरकार mainstream में आ जाएंगे। अभी C11 के साथ कुछ वैसा ही हो रहा है
      अगर आप embedded या बहुत बड़े architecture set को target नहीं कर रहे, तो आज से C23 इस्तेमाल न करने की कोई वजह नहीं है
    • thread_local specifier पहले से कुछ microcontroller platforms पर इस्तेमाल हो रहा है, लेकिन C11 से पहले यह पूरी तरह illegal था। फिर भी threaded environment में memory management को काफी सरल बना देता है
      इसके लिए जबरन C++ world में जाने की क्या वजह है?
    • अगर target LLVM/GCC support करता है, तो नया C version भी अपने-आप नहीं मिल जाता? हालांकि दूसरे architectures के लिए vendor-modified पुराने GCC toolchains में यह नहीं मिलेगा
  • निजी तौर पर guard, defer, auto, constexpr, nullptr जैसी चीज़ें C को कहीं ज़्यादा complex बनाती हैं। C इसलिए चुनता हूं क्योंकि simplicity चाहिए; अगर complexity चाहिए तो आम तौर पर, भले न चाहूं, C++ चुनूंगा, या फिर Go, और server हो तो Elixir चुनूंगा
    _BitInt(N) भी बदसूरत है, और सौभाग्य से अब bool बन चुके _Bool की याद दिलाता है। constexpr और nullptr में C++ की गंध बहुत ज़्यादा है। फिर भी Modern C एक शानदार किताब है, और जिस C99 पर टिके रहने का सोचता हूं उसके लिए इसका अच्छा इस्तेमाल किया है

    • NULL में क्या समस्या है, इसका जवाब ISO standardization के कुछ गिने-चुने फायदों की वजह से संबंधित दस्तावेज़ पढ़ने पर मिल जाता है: https://wg21.link/p2312
      सार यह है कि NULL argument को type-generic macro में देने पर चौंकाने वाले परिणाम आ सकते हैं, और (1 ? 0 : NULL) तथा (1 ? 1 : NULL) जैसे conditional expressions की स्थिति NULL को कैसे define किया गया है उस पर निर्भर करती है। साथ ही, pointer expect करने वाले variadic function में NULL pass करने पर गंभीर परिणाम हो सकते हैं। आजकल कई architectures में int और void* का size अलग होता है, इसलिए अगर NULL सिर्फ 0 है तो गलत size का argument function को pass हो जाता है
    • मुझे नहीं लगता complexity linear तरीके से बढ़ती है। उलटे, अक्सर ज़्यादा complex tools process और final result को सरल बना देते हैं
      यह घर बनाने जैसा है। hammer और screwdriver बहुत simple हैं और crane बेहद complex है, लेकिन घर बनाना simple crane बनाती है। अगर सिर्फ hammer और screwdriver से घर बनाना हो, तो बेहद complex procedure design करना पड़ेगा
      programming languages में भी ऐसा ही है। C++ में generic containers बनाना मामूली बात है, लेकिन C में बहुत कठिन है। void * और manual casting से कुछ हद तक नकल की जा सकती है, पर यह झंझटभरा, error-prone होता है और code को अधिक complex बना देता है
      std::sort और qsort भी इसी तरह हैं। templates और function objects की power से implementation ज्यादा simple और fast होता है। void * pass करके runtime पर dereference करने की जरूरत नहीं, और comparison को function definition में ही रखा जा सकता है। indirect call नहीं, stack passing नहीं, और comparison function inline भी हो सकता है। language complexity का मतलब implementation complexity नहीं होता
    • auto मुख्य रूप से type-generic macros से निपटते समय उपयोगी है, लेकिन सामान्य code में इसे न इस्तेमाल करना बेहतर है। कुछ समय तक C++ world में लोकप्रिय रही almost always auto जैसी सनक से बचना चाहिए
      दुर्भाग्य से compilers के बीच थोड़ा अंतर है। याद के मुताबिक Clang ने C++-style auto implement किया था और GCC ने C-style auto, जिससे auto pointers में subtle difference था। वह difference अब ठीक हुआ या नहीं, पता नहीं
      _BitInt(N) आम तौर पर सीधे इस्तेमाल नहीं किया जाता, बल्कि जरूरत की width के साथ typedef करके इस्तेमाल होता है। जैसे typedef _BitInt(2) u2;_B जैसी बदसूरत syntax इसलिए है क्योंकि underscore के बाद uppercase letter वाली combinations C standard में reserved हैं, ताकि language में छोटा feature जोड़ते समय existing code से conflict न हो। _Bool नाम भी इसी वजह से है। जहां तक मुझे पता है, defer असल में C23 में शामिल नहीं हुआ
  • पुरानी परिभाषा में यह तक तय नहीं था कि NULL pointer है या integer. इसलिए जिन platforms पर Posix की ((void*)0) requirement नहीं मानी जाती थी, वहाँ यह न pointer type था, न size—पैरों तले छिपा हुआ जाल था
    constexpr और nullptr में C++ जैसी गंध शायद इसलिए है क्योंकि वे C++ से वापस आयात हुए हैं. फिर भी NULL इस्तेमाल करना जारी रखा जा सकता है; ऊपर से देखने पर लगता है कि उसे nullptr के रूप में redefine किया गया है

    • इस code में bug है, और कुछ architectures पर crash भी हो सकता है: execlp("echo", "echo", "Hello, world!", NULL);
      इस code में वह bug नहीं है: execlp("echo", "echo", "Hello, world!", nullptr);
      यह भी ठीक है: execlp("echo", "echo", "Hello, world!", (char *)NULL);
  • अच्छी C books की list है क्या, यह पूछने वाला था, लेकिन खुद ही जवाब मिल गया. यहाँ Modern C को intermediate category में रखा गया है
    https://stackoverflow.com/questions/562303/the-definitive-c-...

    • मुझे Modern C पसंद है और कई जगह इसकी अच्छी review हुई है. इसे intermediate कहना सही लगता है
      K&R की modern C companion book के रूप में Ben Klemens की 21st Century C और King की C Programming: A Modern Approach ज़्यादा approachable alternatives लगती हैं
    • Christopher Preschern की Fluent C: Principles, Practices and Patterns भी देखने लायक है
    • यह list complete नहीं है. उदाहरण के लिए Effective C नहीं है: https://nostarch.com/effective-c-2nd-edition
      निजी तौर पर मुझे Modern C से ज़्यादा Effective C पसंद है. Modern C बहुत rigorous है, ऐसे लगता है जैसे language की annotated specification पढ़ रहे हों, जो experts के लिए ज़रूरी हो सकती है; लेकिन मेरे जैसे जो C हल्के-फुल्के तरीके से इस्तेमाल करते हैं, उनके लिए पढ़ना उबाऊ है
  • Metaware के High C extensions में से कुछ मुझे काफ़ी पसंद हैं
    https://news.ycombinator.com/item?id=41647843
    https://news.ycombinator.com/item?id=38938402

  • पिछले एक साल से ज़्यादा समय से अपने personal project, एक language interpreter, में modern C++ इस्तेमाल कर रहा हूँ, लेकिन C++ के mental overhead और tooling issues की वजह से बार-बार सोचता हूँ कि C पर switch कर दूँ. Visual Studio का IntelliSense C++20 modules इस्तेमाल करने पर अभी भी लगभग काम नहीं करता, और language की failures के कारण बहुत सारी चीज़ें interfaces में धकेल दी जाती हैं, जिससे compile time भी बदसूरत हो जाता है
    इसके उलट, classes, member functions, generic programming, namespaces की इतनी आदत पड़ गई है कि लगता है शायद मैं पहले ही फँस चुका हूँ

    • लंबे समय से C++ इस्तेमाल कर रहा हूँ, और C पर जाने के लिए destructors छोड़ने का मेरा बिल्कुल इरादा नहीं है
      उस use case के लिए C# पर विचार किया है? Visual Studio, C# के साथ कहीं बेहतर fit बैठता है
  • macOS Preview में sidebar के table of contents links पर click करने से वे ठीक से काम नहीं करते

    • zathura PDF reader में table of contents के कुछ links test किए, और वे ठीक काम करते हैं
    • अभी table of contents निश्चित रूप से टूटा हुआ है
  • जिस library को मैं maintain कर रहा हूँ, उसमें C compilers पर यह भरोसा कर पाने को बस कुछ ही साल हुए हैं कि वे सब C99 support करते हैं: https://github.com/eyalroz/printf
    लेकिन कुछ साल बीतते ही, हमेशा की तरह, किसी ancient embedded toolchain की वजह से C89 compatibility मांगने वाला issue खुल गया. इसलिए C23 अच्छा तो है, लेकिन लगता है इस पर 20 साल बाद फिर बात करें

  • कोई ऐसा लेख link कर सकता है जो practical तौर पर बताए कि C असल में C99 पर ही क्यों अटका हुआ है? जिन projects पर बात करने लायक है, उनमें से बहुत कम C11 के बाद की features का इस्तेमाल करते हैं

    • C99 अभी भी नया ही है. Microsoft ने C को मारने की कोशिश की, क्योंकि उसने C++ में मौजूद features के अलावा बाकी implement करने से इनकार किया. MSVC का C99 implementation 16 साल late था, और उसने सिर्फ़ minimum implement किया. C11 implementation भी 11 साल late था
      कई दशकों तक C effectively freeze रहा, इसलिए शायद उसका user base भी self-select होकर ऐसे लोगों का रह गया जिन्हें C जैसा है वैसा ही पसंद है और ancient junk compilers support करने में आपत्ति नहीं. जिनका patience खत्म हो गया था या जिन्हें 21st-century language चाहिए थी, वे C++/Rust/Zig आदि की ओर चले गए
    • Microsoft ने Visual Studio C compiler में लगभग 2015 तक C99 features implement न करके असल में C99 को रोक दिया. फिर 2019 में ही उसने failure स्वीकार किया और newer C versions का support फिर शुरू किया. MSVC का C frontend अभी भी Clang और GCC से लगातार पीछे है
      2010 के आसपास MSVC अभी भी बहुत important था, जो आज के इस नजरिए से अजीब लगता है जहाँ लगता है कि ज़्यादातर developers Linux पर shift हो गए हैं. दूसरी तरफ, ऐसे projects भी बहुत नहीं हैं जिन्हें C11 features की सच में ज़रूरत हो. C11 ने C99 से VLA भी हटा दिया था, जो कोई बहुत अफसोस की बात नहीं थी. C23 शायद C99 के बाद पहला version हो सकता है जिस पर कई C codebases वास्तव में upgrade करना चाहें