- मैं अपने सभी व्यक्तिगत प्रोजेक्ट के गेम 'pure C' में विकसित करता हूँ, और आज के समय में यह एक दुर्लभ विकल्प है
- भाषा चुनने के मुख्य मानदंड विश्वसनीयता, पोर्टेबिलिटी और दीर्घकालिक स्थायित्व हैं, ताकि किसी खास OS या प्लेटफ़ॉर्म पर निर्भर न रहना पड़े
- मैं सरलता और तेज़ compile speed, साथ ही सख्त type checking और मजबूत warning system को महत्व देता हूँ
- C++·C#·Java·Go·Haxe जैसी वैकल्पिक भाषाओं पर विचार किया, लेकिन complexity, GC, OOP की अनिवार्यता जैसी वजहों से उन्हें उपयुक्त नहीं पाया
- C खतरनाक है, लेकिन सरल और तेज़ भी, और व्यापक platform support तथा मजबूत library ecosystem की वजह से अब भी सबसे अच्छा विकल्प है
भाषा चुनने के मानदंड
- सबसे ज़रूरी शर्त विश्वसनीयता और स्थिरता है, ताकि उन bug पर समय बर्बाद न करना पड़े जिन्हें मैंने खुद नहीं बनाया
- पहले Flash-आधारित गेम बनाए थे, लेकिन Flash के पतन के बाद नए प्लेटफ़ॉर्म पर port करने के बजाय नए गेम बनाने पर ध्यान देना चाहता हूँ
- किसी खास OS पर निर्भर हुए बिना, और console development की संभावना खुली रखने के लिए portability और general-purpose library support को महत्व देता हूँ
- वांछनीय शर्तों में सरल syntax और आसानी से याद रहने वाली संरचना शामिल हैं
- मैं लगातार जटिल API या भाषा सुविधाएँ खोजते रहने की प्रक्रिया से बचना चाहता हूँ
- सख्त type checking, मजबूत warnings और static analysis के ज़रिए bug कम करना चाहता हूँ, और अच्छे debugger तथा dynamic analysis tools से समस्याएँ आसानी से ढूँढना चाहता हूँ
- मैं compile speed को बहुत महत्वपूर्ण मानता हूँ
- लंबे इंतज़ार से फ़ोकस टूटता है और productivity घटती है
- मैं object-oriented programming (OOP) को लेकर सशंकित हूँ, और data व code को अलग रखकर परिस्थिति के अनुसार संभालने वाले तरीके को पसंद करता हूँ
प्रमुख वैकल्पिक भाषाओं का आकलन
- C++
- गेम डेवलपमेंट में अब भी standard है, लेकिन complexity और धीमी compile speed की वजह से संतोषजनक नहीं लगा
- यह उच्च performance और कई features देता है, लेकिन इसमें बहुत-सी ऐसी चीज़ें हैं जिनकी मुझे ज़रूरत नहीं, और complexity की लागत बहुत अधिक है
- C# और Java
- ये शब्दाडंबरपूर्ण और जटिल हैं, और OOP-केंद्रित मजबूत संरचना के कारण लचीलापन कम है
- high-level language होने के कारण ये complexity को छिपाते हैं, लेकिन मूल समस्याओं को रोकते नहीं
- Go
- इसे C की आधुनिक पुनर्व्याख्या के रूप में सकारात्मक रूप से देखता हूँ, लेकिन stop-the-world garbage collection गेम डेवलपमेंट के लिए उपयुक्त नहीं है
- गेम के लिए libraries की कमी है और दीर्घकालिक स्थिरता को लेकर भी चिंता है
- JavaScript
- वेब डेवलपमेंट वातावरण के तेज़ बदलाव और Flash के अंत की वजह से यह अस्थिर महसूस होती है
- ढीले syntax के कारण इसे बड़े पैमाने के software लिखने के लिए उपयुक्त नहीं मानता
- Haxe
- वेब डेवलपमेंट के लिए इसे संभावनाशील मानता हूँ, लेकिन तुलनात्मक रूप से नई भाषा होने के कारण इसकी स्थिरता को लेकर चिंता है
- अपनी खुद की भाषा बनाना
- यह विचार आकर्षक है, लेकिन मौजूदा libraries छोड़ने और compatibility बनाए रखने के बोझ की वजह से इसे व्यावहारिक नहीं मानता
C चुनने के कारण
- यह खतरनाक लेकिन भरोसेमंद भाषा है; इसकी सरल संरचना के कारण सावधानी से इस्तेमाल करने पर यह स्थिर रहती है
- इसे “तेज़ धार वाले चाकू” से तुलना करते हुए कहा गया है कि इसे संभालना कठिन है, लेकिन महारत होने पर यह बेहद शक्तिशाली औज़ार बन जाती है
- compile speed बहुत तेज़ है, और यह लगभग हर प्लेटफ़ॉर्म पर चल सकती है
- porting की प्रक्रिया भी अपेक्षाकृत सरल है, और लंबे समय में भी इसकी स्थिरता की संभावना अधिक है
- libraries और tooling support मजबूत हैं और लगातार बनाए रखे जा रहे हैं
- व्यक्तिगत रूप से, मुझे पहले से बहुत-सा 'pure C' code लिखने का अनुभव है, इसलिए यह भाषा परिचित है
- मैं दूसरों को C इस्तेमाल करने की सलाह नहीं देता; यह मेरी व्यक्तिगत पसंद और काम करने के तरीके के लिए अनुकूलित विकल्प है
1 टिप्पणियां
Hacker News की राय
मैं ज़्यादातर C स्टाइल में कोड लिखता हूँ, लेकिन ज़रूरत पड़ने पर ही C++ फीचर इस्तेमाल करता हूँ
इसलिए ऊपर-ऊपर से देखें तो यह कभी-कभी Rust कोड जैसा भी लगता है
जो लोग कहते हैं कि वे गेम C में लिखते हैं, वे C++ फीचर्स से नफ़रत करते हुए भी आखिर में virtual interface खुद लागू कर लेते हैं या बहुत बड़ा switch स्टेटमेंट बना देते हैं और वही काम करते हैं
भाषा में मौजूद फीचर का इस्तेमाल न करें तो बात खत्म, लेकिन उसके अस्तित्व पर शिकायत करना मुझे अर्थहीन लगता है
C++ में templates का ज़्यादा दुरुपयोग न करें तो compile धीमा नहीं होता
समय के साथ टीम सदस्य बदलते हैं, लीड बदलते हैं, तो इस्तेमाल होने वाले फीचर्स का set धीरे-धीरे बढ़ता जाता है
एक बार बढ़े हुए फीचर्स को फिर कम करना बहुत मुश्किल होता है
और कभी-कभी आपको ऐसी library भी इस्तेमाल करनी पड़ती है जो वही फीचर्स इस्तेमाल करती हो जिन्हें आप नहीं चाहते
उदाहरण के लिए, मुझे implicit calls (destructor, operator overloading वगैरह) पसंद नहीं हैं, लेकिन अगर library उनका इस्तेमाल करती है तो आखिर में मुझे भी उसी के साथ चलना पड़ता है
C++ की सबसे बुरी बातों में से एक यह है कि अपने-आप बनने वाला छिपा हुआ कोड बहुत ज़्यादा होता है
भले ही कोड का ज़्यादातर हिस्सा concrete types (Goose, Duck आदि) से काम कर रहा हो, फिर भी हर object अपने साथ vtable pointer लेकर चलता है
दूसरी ओर Rust सिर्फ़ वहीं vtable इस्तेमाल करता है जहाँ उसकी ज़रूरत हो, इसलिए memory बचती है
C प्रोग्रामर ज़रूरत की चीज़ें ही खुद implement करते हैं, इसलिए वे भाषा द्वारा थोपे गए ढाँचे में कम बंधते हैं
सिर्फ़
<vector>include करने पर भी दसियों हज़ार लाइनों का कोड शामिल हो जाता हैइसलिए अगर standard library न इस्तेमाल करें तो “फिर से पहिया क्यों बना रहे हो” वाली बहस शुरू हो जाती है
ऐसी बहस बार-बार हो तो बस C पर लौट जाना कहीं ज़्यादा आसान लगता है
मैंने भी लगभग 2017 में C पर स्विच किया था, और आज भी जब C++ libraries इस्तेमाल करता हूँ तो थकान महसूस होती है
अपवाद के तौर पर Dear ImGui ठीक है, लेकिन उसमें भी मैं C bindings को प्राथमिकता देता हूँ
extension को .c में बदलते ही compile time आधा हो गया
मुझे C का रफ और सीधा-सादा स्वभाव पसंद है, लेकिन preprocessor पसंद नहीं
इसलिए Zig सचमुच किसी वरदान जैसा लगता है — C से सरल, और साथ ही कहीं ज़्यादा सटीक language design के साथ
उदाहरण के लिए Zig single pointer और array pointer में फर्क करता है
आप C libraries को import करके उन्हें इस्तेमाल में आसान बना सकते हैं, और यह गेम डेवलपमेंट में बहुत उपयोगी है
ज़्यादातर C++ libraries साथ में C headers भी देती हैं
zig-gamedev में ऐसी बहुत-सी Zig में ढली हुई C libraries हैं
preprocessor की जगह Zig का comptime फीचर कहीं बेहतर है, और यह बस “compile time पर चलने वाला Zig code” है
मैं भी लेखक की सोच से सहमत हूँ
किसी भाषा को पसंद करने की सबसे बड़ी वजह सरलता होती है
इसलिए मुझे C, Go, Odin, Zig जैसी भाषाएँ पसंद हैं
लेकिन ज़रूरी जटिलता को खूबसूरती से संभालने वाली भाषाएँ भी महत्वपूर्ण हैं
memory safety, concurrency और functional patterns की ज़रूरत वाले network code में Rust स्वाभाविक लगता है
वहीं indie games जैसे सरल और तेज़ कोड के लिए C या Odin बेहतर बैठते हैं
Odin में Go की सरलता और C की performance का मिश्रण महसूस होता है, इसलिए मैं उसे सुझाता हूँ
Raylib के साथ गेम बनाना भी आसान है
मुझे जिज्ञासा है कि क्या आपको लगता है कि Odin, Zig से ज़्यादा उस जगह पर फिट बैठता है
मूल लेख में कहा गया था कि Go में game libraries का समर्थन कमज़ोर है, लेकिन वह शायद लगभग 2015 का लेख लगता है
अब स्थिति बदल चुकी हो सकती है
वहाँ उस समय बनाए गए गेम्स के screenshots भी देखे जा सकते हैं
उदाहरण के लिए Knossu का 3D स्टाइल काफ़ी अनोखा है
2026 में C में गेम बनाना थोड़ा पागलपन लग सकता है, लेकिन मैं भी ऐसा करता हूँ
उदाहरण के लिए Chrysalis को मैंने C में डेवलप किया था (GLFW3, FMOD इस्तेमाल करके)
यह idTech3 पर आधारित है, और इसका combat system इतना सटीक है कि छोटा-सा बदलाव भी पूरा balance बिगाड़ देता है
यहाँ तक कि सिर्फ़
i++जोड़ने से भी timing बदल जाती हैइसलिए हम अब भी 22 साल पुराने compiler का ही इस्तेमाल कर रहे हैं
आधुनिक forks मौजूद हैं, लेकिन उनमें original feel खो गई है
idTech3 सचमुच C का निचोड़ दिखाने वाला engine है
हज़ारों गेम C में लिखे गए हैं, और OpenGL, Vulkan, DX जैसी graphics APIs भी पूरी तरह C आधारित हैं
इसलिए इसमें कुछ भी अजीब नहीं है
ज़्यादातर game engines भी C/C++ में लिखे जाते हैं
consoles हर पीढ़ी में अलग रहे हैं
Linux programming के विपरीत, game development 30 साल से ज़्यादा समय तक C++ केंद्रित रहा है
मूल रूप से मैं C से प्यार करने वाला इंसान हूँ
दशकों तक इसे अच्छे से इस्तेमाल किया है, लेकिन टीम के साथ C code manage करने पर दर्द बढ़ जाता है
और आधुनिक भाषाओं की तुलना में development speed भी धीमी है
फिर भी इसकी सरलता का आकर्षण अब भी बना हुआ है
मेरे अनुभव में C, C++ से कम तकलीफ़देह था
यह तथ्य C की सहयोग संबंधी सीमाओं वाले तर्क को कमज़ोर करता है
“कोई भी C में गेम नहीं बनाता” कहना बढ़ा-चढ़ाकर कहना है
आज यह mainstream नहीं है, लेकिन अब भी बहुत लोग C में गेम बनाते हैं
आप सिर्फ़ अपवाद हैं, और यह कथन फिर भी सांख्यिकीय रूप से सही हो सकता है
मुझे C पसंद है
memory management पर पूरा नियंत्रण मिलता है, और behavior अनुमानित रहता है
MISRA rules जैसी pre-allocation माँगने वाली परिस्थितियों में यह खास तौर पर उपयोगी है
hardware level exceptions या errors को सीधे संभालने में भी यह अच्छा है
unit tests लिखना भी आसान है
C में प्रवेश बाधा कम है, लेकिन memory management की समझ अनिवार्य है
एक Java developer होने के नाते, जब मुझे सिर्फ़ .h और .so देकर जल्दी से एक connector बनाना था, तब मैंने C++ के बजाय C चुना
अगर C एक तेज़ धार वाला चाकू है, तो C++ घूमते हुए चाकुओं का खंभा है — ज़रा-सी असावधानी में चोट लगती है
लेकिन string handling C में इतना दर्दनाक है कि मन करता है C++ की string system उधार ले लूँ