Modern C C23 संस्करण
(gustedt.wordpress.com)- नए 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 संस्करण मुफ्त में डाउनलोड किया जा सकता है
- डाउनलोड: https://hal.inria.fr/hal-02383654
- किताब के समर्पित पेज पर संबंधित सामग्री साथ में मिल सकती है
- समर्पित पेज: https://gustedt.gitlabpages.inria.fr/modern-c/
- किताब के साथ दिए गए code examples का डाउनलोड लिंक भी इसी पेज पर है
- संशोधित संस्करण में कई व्याख्याएँ सुधारी गई हैं, लेकिन मुख्य उद्देश्य नए 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 में वास्तविक सुधार भी शामिल हैं
- नया bit-precise type
- C23 की अन्य नई अवधारणाएँ भी शामिल हैं
nullptrconstant और उसका आधार 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 अभी भी खुला है
- MEAP: https://www.manning.com/books/modern-c-third-edition
- Manning संस्करण C23 edition के अंतिम प्रकाशन का समय अभी ज्ञात नहीं है
1 टिप्पणियां
Hacker News राय
मेरी मशीन के storage order, यानी little endian, के उलट जहां high-order representation पहले आती है, उसे big endian कहते हैं। लेकिन modern processors में दोनों आम तौर पर इस्तेमाल होते हैं कहना थोड़ा बढ़ा-चढ़ाकर लगता है, क्योंकि s390x के अलावा अब बहुत कम बचे हैं
लगता है अब सबके पसंदीदा niche/लगभग खत्म हो चुके big endian architecture वाले comments आने ही वाले हैं
ऊपर के दूसरे comment की तरह, modern का मतलब ज़रूरी नहीं कि popular या widely used हो
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 है
C का सबसे महत्वपूर्ण पहलू portability है। छोटे microcontrollers से लेकर लगभग हर computing platform तक जाना ही मुख्य बात है, लेकिन सवाल है कि नया C version उतना adopt होगा या नहीं
अगर cutting edge इस्तेमाल करना हो तो मैं C के बजाय C++2x या Rust चुनूंगा। क्या मैं कुछ miss कर रहा हूं? जानना चाहूंगा कि इस तथाकथित modern C का फायदा क्या है
cutting edge के लिए मैं Zig recommend करूंगा। modern C++ और Rust की तुलना में language complexity बहुत कम है। C23 का एक कम दिखाई देने वाला अच्छा side effect यह है कि
... = {}और{0}जैसी syntax को C++ के और करीब कर दिया गया है, जिससे C library maintainers के लिए उन लोगों को support करना कम परेशान करने वाला हो जाता है जो C code को C++ compiler से build करना चाहते हैं0bmicrocontroller world में व्यापक रूप से इस्तेमाल होता हैmicrocontroller toolchains आम तौर पर GCC के ऊपर बने होते हैं, इसलिए features मुफ्त में मिल जाते हैं। कुछ proprietary C compilers हमेशा पीछे रहते हैं, लेकिन वे 20 साल पहले जितने महत्वपूर्ण नहीं रहे
अगर आप embedded या बहुत बड़े architecture set को target नहीं कर रहे, तो आज से C23 इस्तेमाल न करने की कोई वजह नहीं है
thread_localspecifier पहले से कुछ microcontroller platforms पर इस्तेमाल हो रहा है, लेकिन C11 से पहले यह पूरी तरह illegal था। फिर भी threaded environment में memory management को काफी सरल बना देता हैइसके लिए जबरन C++ world में जाने की क्या वजह है?
निजी तौर पर
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सार यह है कि
NULLargument को type-generic macro में देने पर चौंकाने वाले परिणाम आ सकते हैं, और(1 ? 0 : NULL)तथा(1 ? 1 : NULL)जैसे conditional expressions की स्थितिNULLको कैसे define किया गया है उस पर निर्भर करती है। साथ ही, pointer expect करने वाले variadic function मेंNULLpass करने पर गंभीर परिणाम हो सकते हैं। आजकल कई architectures मेंintऔरvoid*का size अलग होता है, इसलिए अगरNULLसिर्फ0है तो गलत size का argument function को pass हो जाता हैयह घर बनाने जैसा है। 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
autoimplement किया था और GCC ने C-styleauto, जिससेautopointers में 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 में शामिल नहीं हुआपुरानी परिभाषा में यह तक तय नहीं था कि
NULLpointer है या integer. इसलिए जिन platforms पर Posix की((void*)0)requirement नहीं मानी जाती थी, वहाँ यह न pointer type था, न size—पैरों तले छिपा हुआ जाल थाconstexprऔरnullptrमें C++ जैसी गंध शायद इसलिए है क्योंकि वे C++ से वापस आयात हुए हैं. फिर भीNULLइस्तेमाल करना जारी रखा जा सकता है; ऊपर से देखने पर लगता है कि उसेnullptrके रूप में redefine किया गया है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-...
K&R की modern C companion book के रूप में Ben Klemens की 21st Century C और King की C Programming: A Modern Approach ज़्यादा approachable alternatives लगती हैं
निजी तौर पर मुझे 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 की इतनी आदत पड़ गई है कि लगता है शायद मैं पहले ही फँस चुका हूँ
उस use case के लिए C# पर विचार किया है? Visual Studio, C# के साथ कहीं बेहतर fit बैठता है
macOS Preview में sidebar के table of contents links पर click करने से वे ठीक से काम नहीं करते
जिस 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 का इस्तेमाल करते हैं
कई दशकों तक C effectively freeze रहा, इसलिए शायद उसका user base भी self-select होकर ऐसे लोगों का रह गया जिन्हें C जैसा है वैसा ही पसंद है और ancient junk compilers support करने में आपत्ति नहीं. जिनका patience खत्म हो गया था या जिन्हें 21st-century language चाहिए थी, वे C++/Rust/Zig आदि की ओर चले गए
2010 के आसपास MSVC अभी भी बहुत important था, जो आज के इस नजरिए से अजीब लगता है जहाँ लगता है कि ज़्यादातर developers Linux पर shift हो गए हैं. दूसरी तरफ, ऐसे projects भी बहुत नहीं हैं जिन्हें C11 features की सच में ज़रूरत हो. C11 ने C99 से VLA भी हटा दिया था, जो कोई बहुत अफसोस की बात नहीं थी. C23 शायद C99 के बाद पहला version हो सकता है जिस पर कई C codebases वास्तव में upgrade करना चाहें