C3 सीखना
(alloc.dev)- C3 C भाषा पर आधारित है और modules, operator overloading, generics, compile-time execution जैसी उन्नत सुविधाएँ प्रदान करता है
- परिचित C syntax को बनाए रखते हुए, इसमें error handling, defer, foreach जैसी productivity और stability बढ़ाने वाली syntax शामिल है
- declarative contracts, optional types और error handling के तरीके के आने से safety और clarity बेहतर होती है
- standard library और build system integration, temporary memory allocation जैसी व्यावहारिक development environment सुविधाएँ समर्थित हैं
- build, project generation, code structure आदि में Zig भाषा से समानताएँ दिखती हैं, जिससे नए language design experiments की झलक मिलती है
C3 का अवलोकन और विशेषताएँ
C3 क्या है?
- C3, मौजूदा C भाषा के ऊपर बनाया गया एक language है, जो परिचित syntax को बनाए रखने के साथ-साथ C में कठिन module system, operator overloading, generics, compile-time execution, error handling, defer, value methods, gradual contracts, slices, foreach, dynamic type support जैसी सुविधाएँ देता है
- namespace-आधारित module structure से name collision रोका जाता है (
abc::Contextकी तरह imperative namespace का उपयोग) - इसका मुख्य लक्ष्य productivity बढ़ाना और आधुनिक system programming features को सुरक्षित रूप से उपलब्ध कराना है
भाषा की विशेषताएँ
Hello World उदाहरण
- syntax के लिहाज़ से C से मिलता-जुलता
- function declaration में
fnkeyword को स्पष्ट रूप से लिखना होता है - input/output जैसी standard library functions काफ़ी शक्तिशाली हैं, और कई प्रकार के types सीधे print किए जा सकते हैं
foreach loop
- C के विपरीत foreach syntax का built-in support
- reference के ज़रिए iteration के लिए variable name के आगे
&लिखना होता है (advanced feature) - break, continue समर्थित हैं, और दूसरे भाषाओं के foreach जैसा है
while loop
- C99 से पहले while condition के अंदर declaration नहीं लिखी जा सकती थी, लेकिन C3 में internal declaration संभव है
enum और switch statements
- switch statement में implicit break का support (implicit/explicit break का मिश्रण पसंद-नापसंद का विषय हो सकता है)
nextcasekeyword के ज़रिए स्पष्ट case transition का support (jump table implementation आसान)- Zig, C जैसी भाषाओं में जटिल रहे switch-case flow को संक्षेप में नियंत्रित किया जा सकता है
defer keyword
- scope समाप्त होने पर defer में दर्ज statements को उल्टे क्रम में चलाया जाता है, जिससे resource cleanup सुरक्षित रहता है
catch,tryके साथ जुड़ा defer भी उपयोगी है (error handling flow control)
struct और union
- struct के अंदर named/anonymous sub-struct/union की अनुमति, जिससे tagged union pattern डिज़ाइन करना आसान होता है
- anonymous रूप (एक ही नाम वाले fields की पुनरावृत्ति) और name collision के बीच का अंतर सख़्ती से स्पष्ट किया गया है
error handling का तरीका
?चिह्न से optional types का support, error और value option को एक साथ रखकर सुविधा बढ़ाई गई हैcatchkeyword से empty (Optional-रहित) state/error branching संभव है- Rust, Zig की तुलना में error और optional value का अंतर कम स्पष्ट है (फ़ायदा: सादगी, नुकसान: उद्देश्य की स्पष्टता घटती है)
!operator (rethrow) से exception propagation संभव है
contracts
- function के pre/post conditions को
<* .. *>के बीच लिखा जाता है (compile time पर condition checking) - compile-time fold analysis का भी support है (static analysis अभी implement नहीं है)
struct methods
- type declaration + dot notation (
Foo.next) से associated methods बनाए जाते हैं, और namespace भी मिलता है (primitives सहित) - struct/union/enum सहित सभी types पर methods की अनुमति है
macros
- compile-time evaluation आधारित macros (
macrokeyword) $से compile-time parameters,#से evaluation से पहले pass-through लागू किया जाता है- C-style macros की उलझनों को कम करने, AST stability पर ज़ोर, और
@prefix checks जैसी बातें शामिल हैं - type reflection और compile-time execution को macros से संभाला जाता है
type properties
alignof, kindof, extnameof, sizeof, typeid, methodsof, has_tagof, tagof, is_eq, is_ordered, is_substructआदि- metaprogramming और reflection के लिए उपयुक्त
Base64/Hex literals
b64"..."x"..."रूप में byte sequence को सीधे declare किया जा सकता है- built-in macro
$embedहोने से इसकी ज़रूरत कम पड़ सकती है (व्यवहार में कम उपयोग)
primitive types
- int, uint, char (हमेशा unsigned), bool, float, int128/uint128 जैसे कई basic types
- iptr, uptr, isz, usz जैसे pointer/size family के अलग types (थोड़े कम intuitive)
- C के विपरीत bit-size की guarantee मिलती है
अन्य
- operator overloading, struct subtyping, generics, runtime dispatch, any type, bitfield structs (bitstructs) जैसी व्यापक feature set शामिल है
अभ्यास: C3 का व्यावहारिक अनुभव
C3 इंस्टॉल करना
- आधिकारिक site पर prebuilt binaries और source से direct build, दोनों का support
- LLVM, LLD इंस्टॉल करना ज़रूरी है (linking issue होने पर
-DLLVM_DIR,-DLLD_DIRCMake flags का उपयोग) - कुछ distributions में LLD library के न होने की समस्या के कारण binary सीधे डाउनलोड करना बेहतर है
- C3 compiler को libtinfo dependency की आवश्यकता होती है
project बनाना
c3c initcommand से standard folder structure बनता है (LICENSE/README.md/project.json/srcआदि)- Build, build targets, source settings आदि के साथ base project setup मिलता है (Zig, Cargo जैसा)
- default
main.c3file बहुत संक्षिप्त है (राय: नए users के लिए उपयुक्त)
calculator बनाना
डिज़ाइन और उद्देश्य
- Recursive Descent Parser और calculator की core logic बनाकर C3 की functions, input/output, memory management, loops जैसी कई syntax का अभ्यास
- syntax की intuitiveness और व्यावहारिक productivity जैसी अच्छी/असुविधाजनक बातों को सीधे समझना उद्देश्य है
input handling
@poolसे temporary allocator (tmem) का उपयोग, scope समाप्त होने पर memory अपने-आप मुक्त होती है (arena allocator)- standard memory management में tmem (temporary), mem (general) का support, और function-level allocator passing pattern (Zig और C के फ़ायदों का मिश्रण)
mainfunction में return value को अनिवार्य रूप से घोषित करना होता है (compiler द्वारा enforced)- जिन functions की return value को ignore किया जा सकता है, उन्हें
@maydiscardattribute से चिह्नित किया जाता है (दुरुपयोगपूर्ण ignore रोकने के लिए)
tokenizer implementation
- user input को token list में विभाजित करना
- C3 standard library के List, foreach syntax, switch-case (
nextcase, implicit/explicit break combination) जैसे कई control structures का उपयोग - slice syntax (दोनों सिरों के index शामिल) और zero-length slice को लेकर कुछ भ्रम है (अलग length specification syntax मौजूद)
- temporary/general allocators के मिश्रित उपयोग से memory management की transparency और flexibility दिखती है, जो Rust जैसी भाषाओं की तुलना में बेहतर लगती है
parser implementation
- parser coding का प्रत्यक्ष अनुभव (संक्षेपित)
निष्कर्ष और समग्र राय
- C3 पारंपरिक system languages और modern design के बीच का संतुलन खोजता है
- Zig, Rust, C से सीखते हुए, इसे performance और code stability दोनों को साथ रखने वाली भाषा के रूप में डिज़ाइन किया गया है
- modularity, सुरक्षित memory/error/contracts handling, शक्तिशाली metaprogramming, intuitive build system जैसी कई विशेषताएँ उभरकर आती हैं
- learning curve C का अनुभव रखने वालों के लिए क्रमिक रूप से अपनाने योग्य है
- language server, IDE जैसी ecosystem की अपरिपक्वता और कुछ syntax choices पर मतभेद अभी सुधार की माँग करते हैं
- व्यावहारिक low-level/system development में यह next-generation alternative language के रूप में ध्यान देने योग्य है
अभी कोई टिप्पणी नहीं है.