जानिए कैसे C और C++ अभी भी ऑपरेटिंग सिस्टम, डेटाबेस और गेम इंजिन के कोर को संचालित करते हैं — मेमोरी नियंत्रण, गति और लो-लेवल एक्सेस के माध्यम से।

“हाथ के नीचे” वह सब कुछ है जिसपर आपका ऐप निर्भर करता है पर ज्यादातर सीधे नहीं छूता: ऑपरेटिंग सिस्टम कर्नेल, डिवाइस ड्राइवर, डेटाबेस स्टोरेज इंजन, नेटवर्किंग स्टैक्स, रनटाइम और प्रदर्शन-संवेदनशील लाइब्रेरीज़।
इसके उलट, जो कई एप्लिकेशन डेवलपर रोज़ देखते हैं वह सतह है: फ्रेमवर्क, API, मैनेज्ड रनटाइम, पैकेज मैनेजर और क्लाउड सर्विसेज। ये परतें सुरक्षा और उत्पादकता के लिए बनाई जाती हैं—भले ही वे जानबूझकर जटिलता छिपाती हों।
कुछ सॉफ़्टवेयर कंपोनेंट्स की ऐसी ज़रूरतें होती हैं जिन्हें सीधे नियंत्रण के बिना पूरा करना कठिन है:
C और C++ अभी भी यहाँ सामान्य हैं क्योंकि ये न्यूनतम रनटाइम ओवरहेड के साथ नेटिव कोड में कम्पाइल होते हैं और इंजीनियरों को मेमोरी व सिस्टम कॉल्स पर महीन नियंत्रण देते हैं।
ऊपर के स्तर पर, आप C और C++ को इन जगहों पर पा सकते हैं:
यह लेख मैकेनिक पर केंद्रित है: ये “पर्दे के पीछे” कंपोनेंट्स क्या करते हैं, क्यों वे नेटिव कोड से लाभ उठाते हैं, और उस शक्ति के साथ कौन से ट्रेड-ऑफ आते हैं।
यह दावा नहीं करेगा कि C/C++ हर प्रोजेक्ट के लिए सबसे अच्छा विकल्प हैं, और न ही भाषा-युद्ध में बदल जाएगा। उद्देश्य व्यावहारिक समझ देना है कि ये भाषाएँ अभी भी कहाँ अपना स्थान बनाती हैं—और क्यों आधुनिक सॉफ्टवेयर स्टैक्स इन पर बनते रहते हैं।
C और C++ सिस्टम सॉफ़्टवेयर में व्यापक रूप से प्रयुक्त होते हैं क्योंकि ये “मेटल के करीब” प्रोग्राम बनाने की अनुमति देते हैं: छोटे, तेज़, और OS तथा हार्डवेयर के साथ घनिष्ठ रूप से एकीकृत।
जब C/C++ कोड कम्पाइल होता है, तो वह मशीन इंस्ट्रक्शन्स बन जाता है जिन्हें CPU सीधे चला सकता है। रनटाइम में निर्देशों का अनुवाद करने का कोई आवश्यक चरण नहीं होता।
यह उन इंफ्रास्ट्रक्चर कंपोनेंट्स के लिए मायने रखता है—कर्नेल, डेटाबेस इंजन, गेम इंजन—जहाँ छोटे ओवरहेड भी लोड के साथ बढ़कर बड़ी बाधाएँ बन सकते हैं।
सिस्टम सॉफ़्टवेयर को अक्सर स्थिर टाइमिंग की ज़रूरत होती है, सिर्फ़ औसत गति नहीं। उदाहरण के लिए:
C/C++ CPU उपयोग, मेमोरी लेआउट और डेटा स्ट्रक्चर पर नियंत्रण देते हैं, जो इंजीनियरों को पूर्वानुमेय प्रदर्शन लक्षित करने में मदद करता है।
पॉइंटर्स आपको मेमोरी एड्रेस के साथ सीधे काम करने देते हैं। यह शक्ति डरावनी लग सकती है, पर यह उन क्षमताओं को खोलती है जिन्हें कई उच्च-स्तरीय भाषाएँ सार कर देती हैं:
सावधानी के साथ उपयोग करने पर यह नियंत्रण नाटकीय दक्षता लाभ दे सकता है।
यही स्वतंत्रता जोखिम भी है। सामान्य ट्रेड-ऑफ में शामिल हैं:
एक सामान्य तरीका यह है कि प्रदर्शन-संवेदनशील कोर C/C++ में रखें, और इसके चारों ओर उत्पाद फ़ीचर और UX के लिए सुरक्षित भाषाएँ इस्तेमाल करें।
ऑपरेटिंग सिस्टम कर्नेल हार्डवेयर के सबसे करीब बैठता है। जब आपका लैपटॉप जागता है, आपका ब्राउज़र खुलता है, या कोई प्रोग्राम अधिक RAM मांगता है, कर्नेल उन अनुरोधों का समन्वय कर रहा होता है और निर्णय ले रहा होता है।
व्यावहारिक स्तर पर, कर्नेल कुछ कोर काम संभालता है:
क्योंकि ये जिम्मेदारियाँ सिस्टम के केंद्र में बैठती हैं, कर्नेल कोड प्रदर्शन-संवेदनशील और शुद्धता-संवेदनशील दोनों होता है।
कर्नेल डेवलपर्स को सटीक नियंत्रण चाहिए:
C एक सामान्य "कर्नेल भाषा" बना रहता है क्योंकि यह मशीन-लेवल कॉन्सेप्ट्स के साथ अच्छी तरह मैप करता है और पढ़ने में भी तुलनात्मक रूप से आसान है। कई कर्नेल सबसे छोटे, सबसे हार्डवेयर-विशिष्ट हिस्सों के लिए असेंबली पर भी निर्भर करते हैं, जबकि C अधिकांश काम करता है।
C++ कर्नेल में दिख सकता है, पर आमतौर पर सीमित शैली में (सीमित रनटाइम फीचर्स, सावधान एक्सेप्शन नीतियाँ, और अलोकेशन पर सख्त नियम)। जहाँ इसका उपयोग होता है, वहाँ यह नियंत्रण खोए बिना अमूर्तन (abstraction) सुधारने के लिए होता है।
यहाँ तक कि जब कर्नेल स्वयं रूढ़िवादी होता है, कई आसपास के कंपोनेंट C/C++ में होते हैं:
ड्राइवरों के बारे में अधिक के लिए देखें /blog/device-drivers-and-hardware-access।
डिवाइस ड्राइवर ऑपरेटिंग सिस्टम और फिजिकल हार्डवेयर—नेटवर्क कार्ड, GPU, SSD कंट्रोलर, ऑडियो डिवाइसेज़ आदि—के बीच अनुवाद करते हैं। जब आप "प्ले" क्लिक करते हैं, फ़ाइल कॉपी करते हैं, या Wi‑Fi से कनेक्ट होते हैं, ड्राइवर अक्सर पहला कोड होता है जिसे तुरंत प्रतिक्रिया देनी होती है।
क्योंकि ड्राइवर I/O के हॉट पाथ पर बैठते हैं, वे अत्यंत प्रदर्शन-संवेदनशील होते हैं। हर पैकेट या हर डिस्क रिक्वेस्ट पर कुछ माइक्रोसेकंड की अतिरिक्त देरी भी व्यस्त सिस्टम पर जल्दी बढ़ सकती है। C और C++ यहाँ सामान्य बने हुए हैं क्योंकि वे OS कर्नेल API सीधे कॉल कर सकते हैं, मेमोरी लेआउट पर सटीक नियंत्रण दे सकते हैं, और न्यूनतम ओवरहेड के साथ चल सकते हैं।
हार्डवेयर शालीनता से "अपनी बारी का इंतजार" नहीं करता। डिवाइस CPU को इंटरप्ट के माध्यम से संकेत देते हैं—एक तात्कालिक सूचना कि कुछ हुआ (एक पैकेट आया, ट्रांसफ़र खत्म हुआ)। ड्राइवर को इन घटनाओं को तेज़ी और सही तरीके से संभालना चाहिए, अक्सर कड़े टाइमिंग और थ्रेडिंग सीमाओं में।
हाई थ्रूपुट के लिए, ड्राइवर DMA (Direct Memory Access) पर भी निर्भर करते हैं, जहाँ डिवाइस CPU द्वारा हर बाइट कॉपी किए बिना सिस्टम मेमोरी पढ़/लिख सकते हैं। DMA सेटअप आमतौर पर शामिल करता है:
ये कार्य मेमोरी-मैप्ड रजिस्टर, बिट फ़्लैग्स और पढ़/लिख के सावधान क्रम जैसी लो-लेवल इंटरफेसेज़ मांगते हैं। C/C++ इस तरह की "मेटल के करीब" लॉजिक को व्यक्त करने में व्यावहारिक बनाते हैं और फिर भी कम्पाइलरों और प्लेटफ़ॉर्म्स के बीच पोर्टेबल बने रहते हैं।
एक सामान्य ऐप की तरह नहीं, एक ड्राइवर बग पूरे सिस्टम को क्रैश कर सकता है, डेटा करप्ट कर सकता है, या सुरक्षा दोष खोल सकता है। यह जोखिम तय करता है कि ड्राइवर कोड कैसे लिखा और रिव्यू किया जाता है।
टीमें इस खतरे को सख्त कोडिंग मानकों, डिफेंसिव चेक्स और स्तरबद्ध समीक्षाओं से कम करती हैं। सामान्य प्रथाओं में असुरक्षित पॉइंटर उपयोग सीमित करना, हार्डवेयर/फर्मवेयर से आए इनपुट का मान्यकरण, और CI में स्टैटिक एनालिसिस चलाना शामिल है।
मेमोरी प्रबंधन उन बड़े कारणों में से एक है जिनकी वजह से C और C++ अभी भी ऑपरेटिंग सिस्टम, डेटाबेस और गेम इंजनों के कुछ हिस्सों पर हावी हैं। यह उन क्षेत्रों में से भी है जहाँ सूक्ष्म बग बनाना सबसे आसान है।
व्यावहारिक स्तर पर, मेमोरी प्रबंधन में शामिल है:
C में यह अक्सर स्पष्ट होता है (malloc/free)। C++ में यह स्पष्ट हो सकता है (new/delete) या सुरक्षित पैटर्न में लिपटा हो सकता है।
प्रदर्शन-संवेदनशील कंपोनेंट्स में मैन्युअल नियंत्रण एक फ़ीचर हो सकता है:
यह तब मायने रखता है जब एक डेटाबेस को स्थिर लेटेंसी बनाए रखनी हो या एक गेम इंजन को फ्रेम-टाइम बजट पूरा करना हो।
एक ही स्वतंत्रता क्लासिक समस्याएँ भी पैदा कर देती है:
ये बग सूक्ष्म हो सकते हैं क्योंकि प्रोग्राम “ठीक” लग सकता है जब तक कोई विशेष वर्कलोड विफलता को ट्रिगर न करे।
आधुनिक C++ बिना नियंत्रण खोए जोखिम कम करता है:
std::unique_ptr, std::shared_ptr) मालिकाना स्पष्ट करते हैं और कई लीक रोकते हैं।इन टूल्स का समझदारी से उपयोग C/C++ को तेज़ रखते हुए मेमोरी बग्स को प्रोडक्शन तक पहुँचने से रोकता है।
आधुनिक CPUs प्रति कोर नाटकीय रूप से तेज़ नहीं हो रहे—वे ज्यादा कोर दे रहे हैं। यह प्रदर्शन प्रश्न को बदल देता है: "मेरा कोड कितनी अच्छी तरह पैरेलल चल सकता है बिना आपस में अटकाने के?" C और C++ यहाँ लोकप्रिय हैं क्योंकि वे थ्रेडिंग, सिंक्रोनाइज़ेशन और मेमोरी व्यवहार पर लो-लेवल नियंत्रण देते हैं, बहुत कम ओवरहेड के साथ।
एक थ्रेड वह यूनिट है जिसका प्रयोग आपका प्रोग्राम काम करने के लिए करता है; एक CPU कोर वह जगह है जहाँ वह काम चलता है। OS शेड्यूलर runnable थ्रेड्स को उपलब्ध कोर्स पर मैप करता है, लगातार ट्रेड-ऑफ करते हुए।
प्रदर्शन-संवेदनशील कोड में छोटे शेड्यूलिंग विवरण मायने रखते हैं: गलत पल पर थ्रेड को रोकना पाइपलाइन को रोक सकता है, कतारों में बैकलॉग बना सकता है, या स्टॉप-और-गो व्यवहार पैदा कर सकता है। CPU-बाउंड काम के लिए, सक्रिय थ्रेड्स को कोर काउंट के अनुरूप रखना अक्सर थ्रैशिंग घटाता है।
व्यावहारिक लक्ष्य "कभी लॉक न करें" नहीं है। बल्कि: कम लॉक करें, समझदारी से लॉक करें—क्रिटिकल सेक्शंस छोटे रखें, ग्लोबल लॉक से बचें, और साझा बदलने योग्य स्टेट घटाएँ।
डेटाबेस और गेम इंजन औसत गति से नहीं, बल्कि सबसे खराब पाज़ के बारे में चिंतित होते हैं। एक लॉक कोंवॉय, पेज फ़ॉल्ट, या स्टॉल्ड वर्कर दृश्य स्टटर या SLA को उल्लंघन कर सकने वाली धीमी क्वेरी का कारण बन सकता है।
कई उच्च-प्रदर्शन सिस्टम इन पर निर्भर करते हैं:
ये पैटर्न दबाव में भी स्थिर थ्रूपुट और संगत लेटेंसी के लिए लक्षित होते हैं।
एक डेटाबेस इंजन सिर्फ "रोओं को स्टोर करना" नहीं है। यह CPU और I/O के कड़े लूप में लाखों बार चलता है, जहाँ छोटी गैर-कुशलताएँ तेज़ी से जुड़ जाती हैं। इसलिए इतने सारे इंजन और कोर कंपोनेंट अभी भी बड़े पैमाने पर C या C++ में लिखे जाते हैं।
जब आप SQL भेजते हैं, इंजन:
प्रत्येक चरण मेमोरी और CPU समय पर सावधानी से नियंत्रण से लाभ उठाता है। C/C++ तेज़ पार्सर्स, प्लानिंग के दौरान कम अलोकेशन्स, और एक लीन एक्सीक्यूशन हॉट पाथ बनाने में सक्षम करते हैं—अक्सर वर्कलोड के लिए डिज़ाइन किए गए कस्टम डेटा स्ट्रक्चर के साथ।
SQL परत के नीचे, स्टोरेज इंजन उन अनगिनत लेकिन आवश्यक विवरणों को संभालता है:
C/C++ यहाँ अच्छा बैठता है क्योंकि ये कंपोनेंट पूर्वानुमेय मेमोरी लेआउट और I/O सीमाओं पर प्रत्यक्ष नियंत्रण पर निर्भर करते हैं।
आधुनिक प्रदर्शन अक्सर कच्चे CPU स्पीड से ज़्यादा CPU कैश पर निर्भर करता है। C/C++ डेवलपर्स अक्सर बार-बार उपयोग होने वाले फ़ील्ड्स को पास-पास पैक करते हैं, कॉलम्स को लगातार ऐरे में स्टोर करते हैं, और पॉइंटर चेज़िंग कम करते हैं—ऐसे पैटर्न जो डेटा को CPU के करीब रखते हैं और स्टॉल घटाते हैं।
C/C++ भारी डेटाबेस में भी, उच्च-स्तरीय भाषाएँ अक्सर एडमिन टूल्स, बैकअप, मॉनिटरिंग, माइग्रेशन, और ऑर्केस्ट्रेशन के लिए उपयोग होती हैं। प्रदर्शन-संवेदनशील कोर नेटिव रहता है; बाहर का इकोसिस्टम तेज़ इटरेशन और उपयोगिता को प्राथमिकता देता है।
डेटाबेस तुरंत महसूस होते हैं क्योंकि वे डिस्क से बचने के लिए कड़ी मेहनत करते हैं। तेज़ SSD पर भी, स्टोरेज से पढ़ना RAM से पढ़ने की तुलना में कई गुणा धीमा है। C या C++ में लिखा डेटाबेस इंजन इस प्रतीक्षा के हर चरण को नियंत्रित कर सकता है—और अक्सर इसे टाल भी सकता है।
डिस्क पर डेटा को एक वेयरहाउस में बक्सों के रूप में सोचें। एक बॉक्स लाने में समय लगता है, इसलिए आप सबसे अधिक उपयोग होने वाली चीज़ों को मेज़ (RAM) पर रखते हैं।
कई डेटाबेस अपना बफर पूल मैनेज करते हैं ताकि यह अनुमान लगा सकें क्या हॉट रहना चाहिए और OS के साथ मेमोरी के लिए टकराव से बचें।
स्टोरेज सिर्फ धीमा नहीं है; यह अनिश्चित भी है। लेटेंसी स्पाइक्स, कतारबद्धता, और रैंडम एक्सेस सब देरी जोड़ते हैं। कैशिंग इसे इस तरह मिटाती है:
C/C++ डेटाबेस इंजनों को उन बारीकियों को ट्यून करने देते हैं जो उच्च थ्रूपुट पर मायने रखती हैं: एलाइन्ड रीड्स, डायरेक्ट I/O बनाम बफ़र्ड I/O, कस्टम एविक्शन पॉलिसीज़, और इंडेक्स व लॉग बफ़र्स के लिए सावधानीपूर्वक संरचित इन-मेमोरी लेआउट। ये विकल्प कॉपियाँ घटा सकते हैं, कंटेंशन से बच सकते हैं, और CPU कैश को उपयोगी डेटा से भर सकते हैं।
कैशिंग I/O घटाती है, पर CPU काम बढ़ाती है। पेज डीकम्प्रेश करना, चेकसम्स गणना, लॉग एन्क्रिप्ट करना, और रिकॉर्ड वेलिडेशन बॉटलनेक्स बन सकते हैं। C और C++ मेमोरी एक्सेस पैटर्न और SIMD- अनुकूल लूप्स पर नियंत्रण देते हैं, इसलिए इन्हें अक्सर प्रत्येक कोर से अधिक काम निकालने के लिए उपयोग किया जाता है।
गेम इंजिन सख्त रियल-टाइम अपेक्षाओं के तहत काम करते हैं: खिलाड़ी कैमरा घुमाता है, बटन दबाता है, और दुनिया को तुरंत प्रतिक्रिया देनी चाहिए। इसे फ्रेम टाइम में मापा जाता है, औसत थ्रूपुट में नहीं।
60 FPS पर, आपके पास लगभग 16.7 ms होती है एक फ्रेम बनाने के लिए: सिमुलेशन, एनीमेशन, फ़िज़िक्स, ऑडियो मिक्सिंग, culling, रेंडर सबमिशन, और अक्सर एसेट्स स्ट्रीमिंग। 120 FPS पर वह बजट 8.3 ms हो जाता है। बजट मिस करने पर खिलाड़ी इसे स्टटर, इनपुट लैग या असंगत ताल के रूप में महसूस करते हैं।
यही कारण है कि इंजन कोर में अक्सर नेटिव कोड—यानी C और C++—का उपयोग रहता है: पूर्वानुमेय प्रदर्शन, कम ओवरहेड, और मेमोरी व CPU उपयोग पर सूक्ष्म नियंत्रण।
अधिकांश इंजन भारी काम के लिए नेटिव कोड उपयोग करते हैं:
ये सिस्टम हर फ्रेम चलते हैं, इसलिए छोटी-बड़ी गैर-कुशलताएँ तेज़ी से गुणा हो जाती हैं।
बहुत सा गेम प्रदर्शन टाइट लूप्स पर निर्भर करता है: एंटिटीज़ को इटरेट करना, ट्रांसफ़ॉर्म अपडेट करना, कॉलिजन टेस्ट, वर्टेक्स स्किनिंग। C/C++ मेमोरी को कैश-कुशल करने के लिए (कंटिग्यूस ऐरे, कम अलोकेशन्स, कम वर्चुअल इंडायरक्शन) संरचना करना आसान बनाते हैं। डेटा लेआउट एल्गोरिथ्म चयन जितना ही महत्वपूर्ण हो सकता है।
कई स्टूडियो गेमप्ले लॉजिक—क्वेस्ट्स, UI नियम, ट्रिगर्स—के लिए स्क्रिप्टिंग भाषाएँ उपयोग करते हैं क्योंकि इटरेशन स्पीड मायने रखती है। इंजन कोर आमतौर पर नेटिव रहता है, और स्क्रिप्ट्स C/C++ सिस्टम्स को बाइंडिंग्स के जरिए कॉल करते हैं। एक सामान्य पैटर्न: स्क्रिप्ट्स ऑर्केस्ट्रेट करते हैं; C/C++ महँगे हिस्से निष्पादित करते हैं।
C और C++ सिर्फ़ "चलते" नहीं—वे नेटिव बाइनरीज़ में बने होते हैं जो विशेष CPU और OS के अनुकूल होते हैं। वह बिल्ड पाइपलाइन एक बड़ा कारण है कि ये भाषाएँ ऑपरेटिंग सिस्टम, डेटाबेस और गेम इंजिन में केंद्रीय बनी रहती हैं।
एक सामान्य बिल्ड में कुछ स्टेज होते हैं:
लिंकर स्टेप वह जगह है जहाँ वास्तविक दुनिया की कई समस्याएँ उभरती हैं: मिसिंग सिम्बल्स, mismatched लाइब्रेरी वर्ज़न, या असंगत बिल्ड सेटिंग्स।
एक टूलचेन पूरा सेट होता है: कम्पाइलर, लिंकर, स्टैण्डर्ड लाइब्रेरी, और बिल्ड टूल्स। सिस्टम सॉफ़्टवेयर के लिए प्लेटफ़ॉर्म कवरेज अक्सर निर्णायक होता है:
टीमें भाग में C/C++ चुनती हैं क्योंकि टूलचेन परिपक्व और उपकरण-व्यापी उपलब्ध हैं—एमबेडेड डिवाइस से लेकर सर्वरों तक।
C को अक्सर "यूनिवर्स एडाप्टर" माना जाता है। कई भाषाएँ C फंक्शन्स को FFI के जरिए कॉल कर सकती हैं, इसलिए टीमें अक्सर प्रदर्शन-संवेदनशील लॉजिक को C/C++ लाइब्रेरी में रखकर उच्च-स्तरीय कोड को एक छोटा API देती हैं। यही कारण है कि Python, Rust, Java और अन्य अक्सर मौजूदा C/C++ कंपोनेंट्स को रैप करते हैं बजाय उन्हें फिर से लिखे।
C/C++ टीमें सामान्यतः मापती हैं:
वर्कफ़्लो समान है: बॉटलनेक ढूँढें, डेटा से पुष्टि करें, फिर उस छोटे हिस्से को ऑप्टिमाइज़ करें जो सच में मायने रखता है।
C और C++ अभी भी उत्कृष्ट टूल हैं—जब आप ऐसा सॉफ़्टवेयर बना रहे हों जहाँ कुछ मिलीसेकंड, कुछ बाइट्स, या एक विशिष्ट CPU इंस्ट्रक्शन वास्तव में मायने रखता हो। ये हर फ़ीचर या टीम के लिए डिफ़ॉल्ट सबसे अच्छा विकल्प नहीं हैं।
वो घटक चुनें जो प्रदर्शन-संवेदनशील हों, कठोर मेमोरी नियंत्रण चाहिए, या OS/हार्डवेयर के साथ घनिष्ठ रूप से एकीकृत होना चाहिए।
सामान्य उपयुक्तताएँ:
जब प्राथमिकता सुरक्षा, इटरेशन स्पीड, या स्केल पर रखरखावयोग्यता हो तो उच्च-स्तरीय भाषा चुनें।
अक्सर Rust, Go, Java, C#, Python, या TypeScript बेहतर होते हैं जब:
व्यवहार में, अधिकांश उत्पाद मिश्रित होते हैं: क्रिटिकल पाथ के लिए नेटिव लाइब्रेरीज़, और बाकी के लिए उच्च-स्तरीय सर्विसेज व UI।
यदि आप मुख्यतः वेब, बैकएंड, या मोबाइल फ़ीचर बना रहे हैं, तो आपको C/C++ लिखने की ज़रूरत नहीं हो सकती—आप इसे अपने OS, डेटाबेस, रनटाइम और डिपेंडेंसीज़ के माध्यम से उपयोग करते हैं। प्लेटफ़ॉर्म्स जैसे Koder.ai इस विभाजन का लाभ उठाते हैं: आप चैट-ड्रिवन वर्कफ़्लो के जरिए जल्दी React वेब ऐप्स, Go + PostgreSQL बैकएंड, या Flutter मोबाइल ऐप्स बना सकते हैं, और फिर भी जब ज़रूरत हो नेटिव कंपोनेंट्स को एक FFI बाउंड्री के माध्यम से जोड़ सकते हैं। इससे उत्पाद सतह का अधिकांश भाग तेज़-इटरेट करने वाले कोड में रहता है, बिना यह नज़रअंदाज़ किए कि नेटिव कोड कब सही टूल है।
ये प्रश्न पूछें इससे पहले कि प्रतिबद्ध हों: