C3 प्रोग्रामिंग भाषा
(c3-lang.org)- C भाषा के syntax और semantics को बनाए रखते हुए safety और usability को मजबूत करने वाली एक evolved language है, जो मौजूदा C developers के लिए परिचित environment बनाए रखती है
- पूर्ण C ABI compatibility देती है, इसलिए C/C++ projects में सीधे integrate की जा सकती है, और ऐसा उदाहरण भी है जहाँ vkQuake के कुछ code को C3 में बदलकर
c3ccompiler से build किया गया - module system, operator overloading, compile-time macros आदि के जरिए code structure और expressiveness को बेहतर बनाती है
- contract-based programming (Gradual Contracts), zero-overhead error handling, runtime और compile-time reflection जैसी आधुनिक सुविधाएँ शामिल हैं
- debug mode में safety checks और detailed stack traces अपने-आप मिलते हैं, जिससे bug detection और stability में मदद मिलती है
C3 अवलोकन
- C3 एक programming language है जो C भाषा के syntax और semantics के आधार पर विकसित की गई है
- इसका लक्ष्य है कि मौजूदा C programmers के लिए परिचित रूप बनाए रखते हुए भाषा को आगे बढ़ाया जाए
- सटीक और उद्देश्य-उन्मुख operator overloading को support करती है
- C++ की जटिल overloading structure के बिना vector, matrix, fixed-point arithmetic को स्वाभाविक रूप से व्यक्त किया जा सकता है
- contract-based programming को support करती है, जिससे runtime और compile-time constraints को स्पष्ट रूप से लिखा जा सकता है
- इससे code की stability और specification consistency बेहतर होती है
- Result-based error handling और exception के फायदों को जोड़ती है
- C code के साथ स्वाभाविक रूप से integrate होने वाली error management structure देती है
- type introspection को compile-time और runtime, दोनों में support करती है
- inline assembly: string या जटिल constraints के बिना सामान्य code की तरह assembly लिखी जा सकती है
- debug mode में runtime bound checks और value checks अपने-आप डाले जाते हैं
- C3 standard library debug builds में detailed stack traces डिफ़ॉल्ट रूप से देती है
- साधारण “segmentation fault” की जगह error की सटीक location पता की जा सकती है
Ergonomics and Safety
- Optionals के जरिए error और null handling की safety मिलती है
defersyntax से resource cleanup को automate किया जा सकता है- slices और foreach से सुरक्षित iteration संभव है
- comment-based contracts से code constraints को स्पष्ट रूप से लिखा जा सकता है
@poolcontext में memory auto-release को support किया जाता है
Performance by default
- SIMD vectors को सीधे लिखकर hardware-level control संभव है
- अलग-अलग memory allocators चुनकर performance fine-tuning की जा सकती है
- error handling में overhead-free design अपनाया गया है
- तेज compile time और LLVM backend optimization का लाभ मिलता है
- इस्तेमाल में आसान inline assembly दी गई है
Batteries included standard library
- dynamic containers और strings सहित standard data structures उपलब्ध हैं
- cross-platform abstraction के जरिए platform portability सुनिश्चित होती है
- ज़रूरत पड़ने पर native platform access की अनुमति है
Leverage existing C or C++ libraries
- C3 C ABI के साथ पूरी तरह compatible है, इसलिए अलग से “C-compatible types” या function declarations की ज़रूरत नहीं होती
- C3 से C code को link किया जा सकता है, और C से C3 code को भी link किया जा सकता है
Modules are simple
- सरल और सहज module system
- defaults को इस तरह बनाया गया है कि वे development flow में बाधा न डालें
- modules के जरिए namespace management मिलता है
- explicit control के साथ encapsulation structure को सरल बनाया गया है
- interfaces के जरिए shared behavior define किया जा सकता है
- generic modules की सुविधा, जिससे generic types को सरल और स्पष्ट तरीके से implement किया जा सकता है
- struct subtyping के जरिए structure reuse को support किया जाता है
Macros without a PhD
- compile-time macros को सामान्य functions जैसी शैली में लिखा जा सकता है
- code के type information को समझने वाले type-aware macros उपलब्ध हैं
- C preprocessor की तुलना में अधिक स्पष्ट और शक्तिशाली code generation मिलता है
4 टिप्पणियां
काफ़ी तरह-तरह से आ रहे हैं। LONG LIVE C-LANG !!!
लेकिन बाद में अगर c4 आ गया, तो क्या उसे सचमुच विस्फोटक लोकप्रियता मिलेगी...
Zig में हर साल breaking changes आते रहते हैं, इसलिए भाषा पसंद होने के बावजूद अब उसका ज़्यादा इस्तेमाल करने का मन नहीं करता।
वहीं c3 का परिचय देखकर लगा कि कुल मिलाकर यह c + go जैसा एहसास देता है, इसलिए पढ़ना-लिखना आसान है और version upgrades से होने वाला stress भी काफ़ी कम होगा।
थोड़ा समर्थन भी करते हुए... मैं इसे हाल में इस्तेमाल कर रहा हूँ और यह मज़ेदार है.
मुझे यह इसलिए पसंद है क्योंकि यह C करते समय होने वाली सिर्फ असुविधाजनक बातों को ही सुधारने की कोशिश करता है.
आधिकारिक दस्तावेज़ अभी थोड़ा परिपक्व नहीं है
(ऐसे-वैसे फीचर्स के बारे में जानने के लिए अक्सर बिल्कुल अप्रत्याशित जगहों पर विवरण लिखा मिलता है...)
Hacker News की राय
यह न तो कोई नया memory model थोपती है, न ही C++ जैसा बनने की कोशिश करती है
खासकर पूर्ण ABI compatibility की वजह से मौजूदा C build system में सीधे C3 फ़ाइलें मिलाकर इस्तेमाल किया जा सकता है, इसलिए binding लिखने की ज़रूरत नहीं पड़ती
क्रांति से ज़्यादा विकास को लक्ष्य बनाने वाले maintainers की सोच काबिले-तारीफ़ है
वीकेंड में सीखने लायक भाषा के रूप में इसकी सिफारिश की जा सकती है। यह C99 से ज़्यादा आधुनिक है, लेकिन एहसास परिचित रहता है
मैं C को पूरी तरह छोड़ नहीं पाता, उसकी वजह cstring और unreleased pointers हैं
C अपने-आप में उतनी खतरनाक भाषा नहीं है, जितनी उसकी implementations और ABI खतरनाक हैं
fat pointer, varargs improvements, UBSan, MTE वगैरह लागू किए जाएँ तो चीज़ें काफ़ी बेहतर हो सकती हैं
अगर compiler के लिए contracts को ज़रूरी तौर पर जाँचना आवश्यक नहीं है, और उल्लंघन होने पर undefined behavior हो सकता है, तो इस पर भरोसा करके इसे कैसे इस्तेमाल किया जाए, समझ नहीं आता
फ़ीचर बढ़िया है, लेकिन थोड़ा जोखिम भरा लगता है
इसे अनदेखा किया जा सकता है, runtime पर जाँचा जा सकता है, या फिर इसे हमेशा सत्य मानकर optimization में इस्तेमाल किया जा सकता है
उदाहरण के लिए pointer validity को जाँचा जा सकता है, जबकि odd input condition को एक assumption के रूप में छोड़ा जा सकता है
बड़ी टीमें इसे enforce कर सकती हैं, और Visual Studio जैसे tools सिर्फ warning दिखाकर लोगों को धीरे-धीरे सीखने का मौका दे सकते हैं
यानी development के दौरान इसे चालू रखा जा सकता है, और release के समय बंद करके performance पर असर से बचा जा सकता है
जिन शर्तों की जाँच अनिवार्य है, उन्हें function के भीतर सीधे code से संभालना चाहिए
C से अलग इसकी चीज़ों में header files नहीं हैं, module-based namespace, slices, operator overloading, generic modules, Result-आधारित error handling, और safety mode में runtime checks शामिल हैं
निजी तौर पर मुझे function overloading, default parameters, और tuple return की कमी खलती है
ResultयाExpectedको Optional कहना भ्रमित करता हैइसका मतलब “T या खाली” नहीं, बल्कि “T या E” होना चाहिए, इसलिए नाम गलत-सा लगता है
संबंधित दस्तावेज़ लिंक
Option<T>याResult<T, E>जैसा नहीं हैerror type सिर्फ़ एक integer code तक सीमित है, और यह “क्रांति नहीं, विकास” वाली फ़िलॉसफ़ी से अच्छी तरह मेल खाता है
type?syntax भी सहज लगता हैयह C के अर्थ को बनाए रखते हुए out param का बोझ कम करने वाला डिज़ाइन है
Resultका सामान्य अर्थ पहले से ही return value से जुड़ा है, इसलिए भ्रम हो सकता हैYouTube playlist
यह बात प्रभावशाली लगी कि ये तीनों भाषाएँ एक-दूसरे से प्रतिस्पर्धा करने के बजाय अपने-अपने trade-offs साझा करके सीखने वाले रिश्ते में हैं
इसकी जगह macros और reflection जैसे features जोड़े गए हैं
यह सबसे बड़े type जितनी memory लेता है, और runtime type checking की तरफ़ flow खिसक जाता है, जिससे static type language के फ़ायदे कम हो जाते हैं
ज़रूरत पड़ने पर इसे सीधे खुद implement करना बेहतर है
मैंने C में generics, slices, और error propagation खुद implement किए हैं, लेकिन compiler बनाना बहुत जटिल है
इसलिए मैं C के एक variant और Go, दोनों के साथ काम करता हूँ
entry barrier इतना कम है कि सिर्फ़ एक दिन में prototype भी बनाया जा सकता है
किसी नए paradigm को वास्तविकता में बदलने का यही एकमात्र तरीका है
language में syntax, standard library, tooling, runtime — सबको साथ में संतुलित करना पड़ता है, इसलिए यह कठिन है, लेकिन इसी वजह से भविष्य पर इसका असर भी बड़ा होता है
LLVM की वजह से नया compiler खुद बनाना संभव हुआ
अकेले इस्तेमाल होने वाला C variant ठीक है, लेकिन दूसरे लोगों के साथ सहयोग करना हो या बाहरी libraries इस्तेमाल करनी हों, तो एक common language चाहिए
और exceptions को “Excuses” कहना प्यारा और चतुर लगा
खासकर navigation में Discord link होने से यह प्रभाव और मज़बूत हुआ