C को संकलित / व्याख्यायित / JIT'ed से क्या रोकता है?


9

जावा को अक्सर इसकी अद्भुत पोर्टेबिलिटी के लिए सराहा जाता है, जो मुझे लगता है कि जेवीएम के कारण है। मेरा प्रश्न यह है कि C को संकलित / व्याख्यायित / JIT'ed होने से रोकता है .., यदि हां, तो C को एक बार भी लिखा जा सकता है और क्या आपके पास क्या उपकरण है, इस पर काम किया जा सकता है। लेकिन यह सी कार्यक्रम के प्रसंस्करण के लिए एक लोकप्रिय तंत्र नहीं है।

इस तरह से प्रसंस्करण सी के नुकसान क्या हैं, यह भी कि इस तरह से प्रसंस्करण जावा के फायदे क्या हैं और मशीन कोड के अनुरूप नहीं हैं, पाठ्यक्रम की पोर्टेबिलिटी के अलावा अन्य क्या हैं?


आपके प्रश्न के पहले से ही कुछ बहुत अच्छे उत्तर हैं: stackoverflow.com/questions/3925947/…
Doc Brown

2
@delnan मेरी बात यह है कि "C जो संकलित / व्याख्यायित / JIT'ed होने से रोकता है" वास्तव में इसका अर्थ तब खो जाता है जब भाषा एक वर्चुअल मशीन को लक्षित कर सकती है जिसमें JIT या ऐसी स्थितियाँ होती हैं जहाँ vm हार्डवेयर और recompile में गुम विशेषताओं की पहचान करेगी। मौजूदा हार्डवेयर (जैसे अलग ग्राफिक्स कार्ड के लिए OSX पर OpenGL (C में लिखा गया है) के साथ मेल करने के लिए कोड। नहीं, आप एक मशीन पर llvm को लक्षित करने के लिए संकलित कुछ नहीं पकड़ सकते हैं और इसे किसी अन्य प्रोसेसर पर चला सकते हैं। लेकिन संकलित / व्याख्या / JIT लाइन काफी धुंधली हो सकती है।

1
जावा को अक्सर अद्भुत पोर्टेबिलिटी के लिए सम्मोहित किया जाता है। यह उन प्रणालियों के लिए पोर्टेबल है जहां JVM संकलित किया गया है, जो कहने के लिए है, जिन प्रणालियों के लिए JVM (C में लिखा गया है) संकलित किया गया है। कुछ भी ऐसा नहीं है जो सी कोड को उसी तरह से रोकता है, सिवाय इसके कि किसी को भी प्रयास को उचित ठहराने के लिए पर्याप्त लाभ दिखाई न दे।
पीट बेकर

2
मैं इस बिट के बारे में हैरान हूं: "सी क्या संकलित होने से रोकता है / [...]"। उह, कुछ नहीं?
एंड्रेस एफ।

1
सी कंपाइलर इन दिनों बहुत जल्दी हैं इसलिए "myprog.c बनाओ; myprog" शायद सबसे अधिक दुभाषियों की तुलना में तेजी से चलेगा।
जेम्स एंडरसन

जवाबों:


18

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

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

C की व्याख्या या Jitted होने से क्या रुकता है? कुछ भी तो नहीं। लेकिन वह C की छाप नहीं है।


6

सबसे पहले, यह ध्यान देने योग्य है कि सूर्य की JVM C. C में लिखी गई थी जब पोर्टेबिलिटी की आवश्यकता होती है तो यह एक बहुत लोकप्रिय भाषा है।

कई C प्रोग्राम नहीं होने के बावजूद C भाषा पोर्टेबल है । ऐसा इसलिए है क्योंकि C प्रोग्रामर पर उतने प्रतिबंध नहीं लगाता है या उतनी धारणाएं नहीं बनाता है। यदि कोई सी प्रोग्रामर चाहता है कि उसके कार्यक्रम पोर्टेबल हों, तो उसे स्वयं उन प्रतिबंधों को लगाना होगा।

व्यवहार में, यह वास्तव में आप पर जावा बलों के प्रतिबंधों के साथ रहने से ज्यादा कठिन नहीं है। यह ज्यादातर आपके धीरज और आदिम आकारों के प्रति जागरूक होने और मंच-विशिष्ट पुस्तकालयों के बजाय GTK + जैसे पोर्टेबल पुस्तकालयों का उपयोग करने का मामला है ।

आप एक GTK + लक्ष्य और C संकलक बना सकते हैं जो एक वर्चुअल मशीन का समर्थन करता है, यहां तक ​​कि शायद JVM, और बहुत कम परिवर्तनों के साथ काम करने के लिए मौजूदा कोड प्राप्त कर सकता है। वास्तव में, कचरा संग्रह के बिना, एक सी वर्चुअल मशीन शायद बहुत सरल होगी। आप क्यों करना चाहते हैं, हालांकि?

जावा को देशी कोड में उल्टा, इसी तरह से उल्लेखनीय है। यह मूल रूप से जेआईटी करता है। आप क्यों करना चाहते हैं, हालांकि? मुझे यकीन है कि पालतू परियोजनाएं इसे "सिर्फ इसलिए," करने के लिए हैं, लेकिन वे गंभीर उपयोग में नहीं हैं।


5

तुमने कहा था:

जावा को अक्सर इसकी अद्भुत पोर्टेबिलिटी के लिए सराहा जाता है, जो मुझे लगता है कि जेवीएम के कारण है।

और वहाँ, पहले वाक्य के भीतर, आप गलत हैं। जावा JVM के कारण पोर्टेबल नहीं है। जावा पोर्टेबल है, क्योंकि जावा भाषा को इस तरह से परिभाषित किया गया है कि यह प्रोग्रामर को किसी भी तरह के व्यवहार को लागू करने में कोई कसर नहीं छोड़ता।

उदाहरण के रूप में, जावा में दो प्रकार के "int" (32 बिट पूर्णांक पर हस्ताक्षर किए गए) और "लंबे" (64 बिट पूर्णांक पर हस्ताक्षर किए गए) हैं। C और C ++ में "int" (कम से कम 16 बिट हस्ताक्षरित), "लंबा" (कम से कम 32 बिट हस्ताक्षरित) और "लंबा लंबा" (कम से कम 64 बिट हस्ताक्षरित) है। ऐसा इसलिए है क्योंकि C को कई अलग-अलग प्रोसेसर पर चलना चाहिए, और उन्हें अलग तरह से व्यवहार करने की अनुमति देता है।

C इन प्रकारों के लिए निश्चित आकार को परिभाषित कर सकता है। यदि यह होता, तो 36 बिट प्रोसेसर सी भाषा को लागू नहीं कर सकते थे। और वे वास्तव में जावा को लागू नहीं कर सकते हैं! इसलिए C ने विभिन्न कंप्यूटरों के साथ भाषा को काम करने की अनुमति दी। यह अपरिहार्य है कि यह कोड के निर्माण की अनुमति देता है जो पोर्टेबल नहीं है। यह भाषा की बात है।


36-बिट मशीन पर 32-बिट अंकगणित का अनुकरण करना संभव है और 0xFFFFFFFF के साथ हर ऑपरेशन के परिणाम को 32-बिट तक छोटा करना। तो, ये मशीनें जावा को लागू कर सकती हैं , यह सिर्फ धीमी गति से होगा यदि जावा गैर-आधारित प्रकारों की अनुमति देता है।
dan04

4

जावा विशेष रूप से अत्यधिक पोर्टेबल है क्योंकि भाषा जावा वर्चुअल मशीन को लक्षित करती है, जैसा कि नाम से ही स्पष्ट है कि यह वास्तविक मशीन नहीं है । चूंकि आप कई प्रकार की वास्तविक मशीनों की वास्तुकला पर वर्चुअल मशीन को लागू कर सकते हैं, एक जेवीएम-आधारित कार्यक्रम अत्यधिक पोर्टेबल है।

दूसरी ओर, सी को विशेष रूप से वास्तविक हार्डवेयर के खिलाफ चलाने के लिए डिज़ाइन किया गया है, क्योंकि यह एक ऑपरेटिंग सिस्टम को लागू करने के विशिष्ट उद्देश्य के लिए बनाया गया था, जिसे पूर्ण हार्डवेयर एक्सेस की आवश्यकता होती है। इसका मतलब है कि सी कोड डिज़ाइन द्वारा विशेष रूप से पोर्टेबल नहीं है , और जब एक प्रोग्राम को एक प्लेटफ़ॉर्म से दूसरे प्लेटफॉर्म पर पोर्ट किया जाता है, तो विभिन्न भाग जो लक्ष्य आर्किटेक्चर के लिए विशिष्ट होते हैं, उन्हें एक डिग्री या किसी अन्य को फिर से लिखना होगा।


7
C अत्यधिक पोर्टेबल है। आपको बस लक्ष्य प्लेटफ़ॉर्म पर पुनर्मूल्यांकन करना है, और उन कुछ बिट्स से बचना है जो विशेष रूप से और जानबूझकर पोर्टेबल नहीं हैं।
रॉबर्ट हार्वे

5
@ रोबर्टहाइव: ... जैसे कि विभिन्न मौलिक चीजों के आकार के रूप में मौलिक ? ;)
मेसन व्हीलर

2
हां, वो बातें। यह दुर्भाग्यपूर्ण है कि समस्या मौजूद है, लेकिन हर दूसरे तरीके से भाषा पूरी तरह से पोर्टेबल है, और यह सुनिश्चित करने के तरीके हैं कि सभी प्लेटफार्मों पर आदिम आकार काम करते हैं।
रॉबर्ट हार्वे

3
@ रोबर्टहवे: मैं कहूंगा कि सी पोर्टेबल प्रोग्राम लिखना संभव बनाता है, लेकिन यह स्वाभाविक रूप से आसान नहीं बनाता है।
डॉक ब्राउन

2
@ रोबर्टहवे: क्या आप धार्मिक युद्ध शुरू करना चाहते हैं? ;-) मेरी पसंदीदा पोर्टेबल भाषा पायथन है।
डॉक ब्राउन

3

वास्तव में सी के संस्करण की व्याख्या की जाती है , लेकिन वे ज्यादातर उत्पादन प्रणाली के बजाय त्वरित प्रयोग के लिए उपयोग किए जाते हैं।

वे आम नहीं हैं, क्योंकि आखिरकार, यदि आप एक छोटे, तेज और स्थिर निष्पादन योग्य नहीं पाने के लिए सभी सी idiosyncrasies पीड़ित क्यों करेंगे?


3

सैद्धांतिक रूप से C और Java दोनों को देशी कोड में संकलित किया जा सकता है, व्याख्या की जा सकती है या वर्चुअल मशीन से संकलित किया जा सकता है।

C को वर्चुअल मशीन में संकलित करने का तकनीकी कारण यह है कि बस कोई मानक वर्चुअल C मशीन नहीं है।

और कोई भी वर्चुअल सी मशीन को परिभाषित नहीं करना चाहता है, या यहां तक ​​कि जावा वर्चुअल मशीन (जो पूरी तरह से संभव है) को संकलित करना चाहता है। शायद इसलिए कि सी का उपयोग करने वाला कोई भी व्यक्ति अपनी बेजोड़ गति को ढीला नहीं करना चाहता। शायद इसलिए भी कि C खुले स्रोत समुदाय में सबसे मजबूत है जो आसानी से संकलन द्वारा पोर्टेबिलिटी कर सकता है (स्रोत को वितरित और फिर से तैयार करना और निष्पादित करना), इसलिए उन्हें निष्पादन की पोर्टेबिलिटी (बाइनरी को निष्पादित और निष्पादित करना) की आवश्यकता महसूस नहीं होती है। स्रोत डेवलपर करते हैं।


1

वास्तव में, यह किया जाता है। प्रमुख संकलक हैं जो एलएलवीएम के संकलन का समर्थन करते हैं (मुझे पता है कि क्लैंग करता है, और मेरा मानना ​​है कि जीसीसी भी करता है)। वह LLVM JIT'd हो सकता है जैसे कि Java कोड को bytecode द्वारा संकलित किया जाता है जो कि JIT'd है।

हालांकि, सी की तुलना में जावा "क्रॉस प्लेटफॉर्म" क्या बनाता है कि जावा में एक बड़ी रनटाइम लाइब्रेरी है जिसे कई प्लेटफार्मों पर पोर्ट किया गया है। C स्पष्ट रूप से इस प्रतिमान का पालन नहीं करता है।


POSIX के साथ C काफी पोर्टेबल हो सकता है (किसी भी POSIX सिस्टम के लिए), अगर आप देखभाल के साथ कोड करते हैं।
बेसिल स्टारीनेविच

0

जावा और सी। जावा के बीच कुछ प्रमुख अंतर हैं जावा ऑपरेटिंग मशीन (JVM) के माध्यम से ऑपरेटिंग सिस्टम से अलग किया गया है। JVM ऑपरेटिंग सिस्टम को प्रोग्राम से दूर कर देता है। एक java एप्लीकेशन JVM को मेमोरी का हिस्सा बनाने के लिए कह सकता है, और JVM तब OS को उस मेमोरी के लिए कहता है। विभिन्न प्लेटफार्मों / ऑपरेटिंग सिस्टम के लिए कई JVM हैं। JVM वही है जो एक ही जावा प्रोग्राम को विभिन्न प्लेटफॉर्म पर चलाने की अनुमति देता है।

सी के साथ, कोई ओएस अलगाव नहीं है। सी प्रोग्राम (आमतौर पर) सीधे ओएस के शीर्ष पर चलते हैं, जिससे सीधा ओएस कॉल होता है। यह सी प्रोग्राम को एक विशिष्ट ऑपरेटिंग सिस्टम / प्लेटफ़ॉर्म से जोड़ता है। कोई भी गैर-तुच्छ कार्यक्रम ऑपरेटिंग सिस्टम में कॉल करने जा रहा है। इसके अलावा, सी प्रोग्राम को मशीन कोड में संकलित किया जाता है, जो हार्डवेयर विशिष्ट है। X86 के लिए संकलित C प्रोग्राम को सीधे ARM प्रोसेसर पर नहीं चलाया जा सकता है।


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

1
जावा लैंग्वेज स्पेसिफिकेशन में ऐसा कुछ भी नहीं है जो जेवीएम के बारे में कुछ भी कहता हो, और वास्तव में, जेवीएम के बिना जावा के कार्यान्वयन हैं। Android पर, जावा प्रोग्राम Dalvik VM (अब अप्रचलित) या Android रनटाइम पर चलते हैं, CLI के लिए जावा के कार्यान्वयन, ECMAScript के संकलन, कार्यान्वयन और मूल कोड को लागू करने वाले कार्यान्वयन हैं। सी कंपाइलर हैं जो जेवीएम को संकलित करते हैं। C कंपाइलर हैं जो ECMAScript का संकलन करते हैं। C दुभाषिए हैं।
जोर्ग डब्ल्यू मित्तग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.