जावा में JVM है, C के पास क्या है?


15

मुझे पता है कि सी में एक कंपाइलर है लेकिन निष्पादन निष्पादन को क्या निर्धारित करता है?

उदाहरण के लिए यदि एक और ब्लॉक में, क्या होगा यदि कोड में इफ़ेक्ट्स के बजाय सभी इफ़्स होते हैं, तो क्या निर्धारित करता है कि सभी इफ़्स को चलाया जाएगा? जावा में यह JVM होगा, लेकिन C में निष्पादन संकलक क्या है?


16
सीखने की एक उपयोगी बारीकियों यह है कि भाषाएं सिर्फ भाषाएं हैं। आप एक संकलक बना सकते हैं जो C कोड लेता है और उदाहरण के लिए इसे JVM में चलाता है।
तेलस्टिन

10
+1। यह एक बहुत अच्छा सवाल है। मैं इसे अपनी अज्ञानता के लिए कम नहीं करूंगा - यह आश्चर्य की बात है कि अधिक जावा छात्र यह नहीं पूछते हैं।
djechlin

आप जावा को मशीन कोड में भी संकलित कर सकते हैं और JVM से बच सकते हैं ...
AK_

2
इसके अलावा: प्रोग्रामिंग लैंग्वेज! = फ्रेमवर्क! = रनटाइम लाइब्रेरी! = कंपाइलर! = बस टाइम कंपाइलर में! =
इंटरप्रेटर

जवाबों:


17

जावा में वर्चुअल मशीन आपके कोड को निष्पादित करती है, लेकिन सी कंपाइलर कोड उत्पन्न करते हैं जो वास्तविक मशीन निष्पादित करता है। सटीक होने के लिए, दोनों ही मामलों में आपका प्रोग्राम वास्तविक मशीन कोड में परिवर्तित हो जाता है, लेकिन जावा के मामले में JVM बायटेकोड के संकलन का एक मध्य चरण है।

इसलिए जब आप लोड करते हैं तो जावा प्रोग्राम जेवीएम द्वारा वास्तविक निर्देशों में बदल दिए जाते हैं, जबकि सी प्रोग्राम को चलाने से पहले ही कंपाइलर द्वारा वास्तविक निर्देशों में बदल दिया जाता है।


20
ऐसे कंपाइलर हैं जो जावा लेते हैं और मशीन कोड का उत्पादन करते हैं। उदाहरण के लिए एक्सेलसियर जेट । C ( picoc ) के लिए इंटरपेटर्स भी हैं जो कभी भी कोड उत्पन्न नहीं करते हैं जो एक वास्तविक मशीन निष्पादित करता है। भाषाएं भाषाएं हैं। कार्यान्वयन कार्यान्वयन हैं। दोनों को भ्रमित करना लोगों को भ्रमित कर सकता है।

6

मशीन कोड के अलावा, अस्तित्व में कोई प्रोग्रामिंग भाषा नहीं है जो सीधे हार्डवेयर पर निष्पादित होती है, इस अर्थ में कि आप इसे शाब्दिक स्रोत पाठ नहीं खिला सकते हैं। सभी वास्तविक कार्यान्वयन को स्रोत प्रोग्राम को "मशीन" की भाषा में अनुवाद करना होगा ।

कुछ कार्यान्वयनों के लिए, इसका सांख्यिकीय रूप से अनुवाद किया गया है। हम आमतौर पर इन कार्यान्वयनों को "संकलित" कहते हैं। दूसरों के लिए, इसे कुछ मध्यवर्ती रूप में अनुवादित किया जाता है, जिसे तब गतिशील रूप से अनुवादित किया जाता है क्योंकि कार्यक्रम चलाया जाता है। हम आमतौर पर इन कार्यान्वयनों को "व्याख्या" कहते हैं। इन दोनों के बीच संभावनाओं का सिलसिला जारी है, और कई आधुनिक सीपीयू भी इसके निष्पादन कोर के हिस्से के रूप में गतिशील अनुवाद करते हैं।

यहां तक ​​कि जब आपके कार्यक्रम को निष्पादन से बहुत पहले संकलित किया जाता है, जब तक कि आप फर्मवेयर नहीं लिख रहे हैं, यह दुर्लभ है कि संकलित कोड नंगे धातु पर सीधे चलता है जिसमें इसका समर्थन नहीं है। ऑपरेटिंग सिस्टम उपयोगकर्ता-अंतरिक्ष कार्यक्रमों के लिए एक वर्चुअल मशीन प्रदान करता है, जो अक्सर भ्रम के रूप में ऐसी सुविधाएँ प्रदान करता है कि आपके पास स्वयं के लिए एक सीपीयू हो। एक फ्लैट मेमोरी स्पेस का भ्रम जो मशीन से जुड़ी भौतिक रैम से बड़ा हो सकता है, जिसे "वर्चुअल मेमोरी" भी कहा जाता है।

उस के ऊपर, जब आप C में प्रोग्रामिंग कर रहे हैं, तब भी C वर्चुअल मशीन है! इसे पारंपरिक रूप से "सी रनटाइम" या संक्षेप में सीआरटी के रूप में जाना जाता है।

चूँकि C अधिकतर समय से ठीक पहले असेंबली / मशीन कोड में सीधे अनुवादित किया जाता है (कुछ प्लेटफार्मों पर, कुछ थ्रेडेड कोड भी हो सकते हैं , और जिसे वर्चुअल मशीन का हिस्सा माना जा सकता है), वर्चुअल मशीन को आमतौर पर केवल स्टार्टअप को हैंडल करना होता है बंद करना।

स्टार्टअप में आमतौर पर स्टैक और ढेर स्थापित करना शामिल है; ऑपरेटिंग सिस्टम शायद ही आपके लिए ये प्रदान करता है, और प्रोग्रामर को ये प्रदान करने के लिए प्रोग्रामिंग भाषा का काम है। कुछ प्लेटफार्मों पर सिग्नल हैंडलिंग के कुछ प्रारंभिककरण हो सकते हैं, बहु-थ्रेडेड वातावरण में "मुख्य" थ्रेड स्थापित करना, वैश्विक कंस्ट्रक्टरों को बंद मौका पर चलाना जो प्रोग्राम को सी ++ कोड से जोड़ा गया है, गतिशील रूप से जुड़े पुस्तकालयों को संभाल रहा है, या वहां argc / argv और envp को सेट करने के लिए कुछ प्रसंस्करण की आवश्यकता हो सकती है। अंत में, CRT मुख्य पर नियंत्रण स्थानांतरित करता है।

शटडाउन के रूप में, कई ऑपरेटिंग सिस्टम अशुद्ध रूप से एक प्रक्रिया को मार सकते हैं, इसलिए शटडाउन को बहुत अधिक करने की आवश्यकता नहीं है। मुख्य बात यह है कि एटैक्सिट () कॉल को संसाधित करने के लिए उस मामले के लिए जहां कार्यक्रम सफाई से बाहर निकलता है।


2
C रनटाइम और JVM पूरी तरह से अलग जानवर हैं। CRT सिर्फ एक पुस्तकालय है।
डेडएमजी

मैंने चीजों को थोड़ा और स्पष्ट करने के लिए उत्तर संपादित किया है। संयोग से, JVM और VirtualBox भी पूरी तरह से अलग जानवर हैं।
छद्म नाम

@ छद्म नाम: वास्तव में नहीं। ठीक है, ठीक है, वर्चुअलबॉक्स एक वर्चुअलाइज़र है, जबकि विशिष्ट जेवीएम एक एमुलेटर है, लेकिन अगर आप उदाहरण के लिए वर्चुअलबॉक्स को QEmu के साथ बदलते हैं, तो दोनों वास्तव में एक ही हैं।
जोर्ज डब्ल्यू मित्तग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.