सी भाषा पोर्टेबिलिटी


10

C जैसी भाषा का पोर्टेबिलिटी वास्तव में कैसे निर्धारित होता है? मैंने सीखा है कि संकलक आईएसए विशिष्ट हैं। यदि यह सच है, तो C पोर्टेबल कैसे है? या यह कि सी में लिखा गया स्रोत कोड पोर्टेबल है, लेकिन निष्पादन योग्य नहीं है? क्या x86 के लिए उपयोग किए गए उदाहरणों के लिए निष्पादन योग्य आईएसए विशिष्ट नहीं हैं जो ऐप्पल के लिए अनुप्रयोगों से अलग हैं (यह मानते हुए कि ऐप्पल मोटोरोला / पावरपीसी माइक्रोप्रोसेसर का उपयोग करता है)?

जवाबों:


27

क्या यह है कि सी में लिखा गया स्रोत कोड निष्पादन योग्य नहीं है?

सही बात। कुछ लोग इसे एक बार लिखते हैं, हर जगह संकलित करते हैं।

http://en.wikipedia.org/wiki/Write_once,_compile_anywhere

अन्य विकल्प एक बार लिखा जाता है, हर जगह चलता है। जावा इसका एक अच्छा उदाहरण है।

http://en.wikipedia.org/wiki/Write_once,_run_anywhere

और भले ही आप आंशिक क्रॉस प्लेटफॉर्म पोर्टेबिलिटी प्राप्त कर सकते हैं, आपको अपने कोड को संशोधनों के बिना हर जगह चलने की उम्मीद नहीं करनी चाहिए।


C स्रोत कोड अलग-अलग कंपाइलरों या ISA के OS के लिए बहुत अधिक अतिरिक्त-लिंगीय शेंनिगनों के बिना पोर्टेबल नहीं है। मानक प्रकारों के आकार और संरेखण जैसी सरल चीजें सी में मानक नहीं हैं, इसलिए सॉफ्टवेयर को पोर्ट करना जो स्वयं के अन्य उदाहरणों के साथ डेटा का आदान-प्रदान करेगा, काफी चुनौतीपूर्ण हो सकता है। GNU Autoconf / Automake के लिए देखें (संभवतः obfuscated) हुप्स C प्रोग्रामर का उदाहरण पोर्टेबिलिटी प्राप्त करने के लिए कूद जाएगा।
टिम विलक्रॉफ्ट

3
@ टिमविलक्रॉफ्ट: पोर्टेबिलिटी की समस्याएं आम तौर पर गैर-मानक पुस्तकालयों और खराब प्रोग्रामिंग प्रथाओं के कारण होती हैं; और सी या उसके मानक पुस्तकालयों के कारण नहीं हैं। एक सरल उदाहरण एक गैर-मानक जीसीसी विस्तार का उपयोग करना होगा या आईओ के लिए सही ढंग से क्रमबद्ध / डी-धारावाहिक डेटा को विफल करना होगा।
ब्रेंडन

6

यह सिर्फ आईएसए विशिष्ट नहीं है। उदाहरण के लिए आप पूछें:

x86 के लिए ऐप्पल के लिए एप्लिकेशन अलग हैं?

हां, वे हैं, भले ही Apple x86 हार्डवेयर का उपयोग करता है। सी बायनेरिज़ आर्किटेक्चर और ऑपरेटिंग सिस्टम विशिष्ट हैं।


1
@ Steven314: आपकी टिप्पणी एक स्पर्शरेखा है। इसका कोई लेना-देना नहीं है कि हार्डवेयर मानक है या नहीं, और सब कुछ इस तथ्य से करना है कि ओएस एक्स के पास एक अलग द्विआधारी प्रारूप (मच-ओ) है, जैसे, लिनक्स (आमतौर पर ईएलएफ)।
मियादी

@ साइट: ईएफआई बनाम BIOS केवल बूटिंग और ओएस इंटर्नल के लिए मायने रखता है; हार्डवेयर आर्किटेक्चर, जो CPU निर्देश सेट है, समान है, क्योंकि यह एक ही CPU है।
vartec

टिप्पणियां हटा दी गईं, मुख्य रूप से क्योंकि मुझे पहली बार में मैक चीज़ को शामिल नहीं करना चाहिए था। एबीआई (एप्लीकेशन बाइनरी इंटरफेस) और कॉल सम्मेलनों का मेरा उल्लेख अभी भी प्रासंगिक हो सकता है ("वास्तुकला और ऑपरेटिंग सिस्टम को जोड़ने के लिए एक तीसरा आइटम")। वे हार्डवेयर प्रासंगिक नहीं हैं, सिवाय इसके कि एबीआई विशेष आर्किटेक्चर (जैसे उपलब्ध रजिस्टर) के लिए डिज़ाइन किए जाते हैं, लेकिन वे बाइनरी पोर्टेबिलिटी के लिए प्रासंगिक हैं। यह एक फ़ाइल स्वरूप समस्या नहीं है - ELF का उपयोग विंडोज और लिनक्स (gcc द्वारा) पर किया जाता है, लेकिन आप संभवतः एक से दूसरी वस्तु फ़ाइल नहीं ले सकते।
स्टीव ३४

@vartec आपने कहा कि सी बायनेरिज़ ऑपरेटिंग सिस्टम विशिष्ट हैं, क्या यह इसलिए है क्योंकि O / S स्वयं ISA विशिष्ट है, इस प्रकार C बायनेरी O / S विशिष्ट अप्रत्यक्ष रूप से बन जाते हैं?
KawaiKx

@ सौरभ - सभी मूल निष्पादन योग्य OS विशिष्ट हैं, क्योंकि OS फ़ाइल प्रारूप को निर्दिष्ट करता है। साथ ही, एक सी मानक लाइब्रेरी को ऑपरेटिंग सिस्टम को कॉल करके कई कार्यों को लागू करना चाहिए, इसलिए भले ही फ़ाइल प्रारूप को मानकीकृत किया गया हो, कोड स्वयं दूसरे ओएस पर नहीं चल सकता है। यह उन भाषाओं के लिए मानक है जो देशी कोड के लिए संकलित हैं, जैसा कि कुछ वर्चुअल मशीन कोड जैसे JVM (जावा वर्चुअल मशीन) के विपरीत है। वर्चुअल मशीन के लिए सी को संकलित करना संभव है, लेकिन ऐसा कभी नहीं किया गया है जिसके बारे में मुझे पता है। LLVM निकटतम आता है, लेकिन एक संकलक बैक एंड के रूप में अभिप्रेत है - एक संकलन-एक बार चलने वाला कहीं भी वातावरण नहीं।
स्टीव ३४

5

क्या यह है कि सी में लिखा गया स्रोत कोड निष्पादन योग्य नहीं है?

बिल्कुल सही। आपको हर प्लेटफ़ॉर्म पर अपना सी प्रोग्राम फिर से तैयार करना होगा। सी कंपाइलर मशीन कोड उत्पन्न करते हैं जो केवल एक ही प्रोसेसर / मेमोरी आर्किटेक्चर और ओएस की मशीनों के बीच, बहुत ही सीमित सीमा तक पोर्टेबल होता है। यही कारण है कि आप मल्टीप्लायर एप्लिकेशन (उदाहरण के ब्राउज़र) के अलग-अलग द्विआधारी वितरण देखते हैं, जैसे कि "लिनक्स 64-बिट इंटेल" या "मैक ओएस एक्स 32-बिट पावरपीसी" (ठीक है, पिछले एक चित्रण है, मुझे पता है कि एप्पल स्विच किया गया था कुछ साल पहले से :-)।


3

अधिकांश प्रश्न का उत्तर दिया गया है, लेकिन मैं स्थायित्व से जोड़ना चाहूंगा, एक और बात है जिसे आपको ध्यान में रखना होगा।

उदाहरण के लिए, JAVA को एक बार लिखा जा सकता है और किसी भी प्लेटफ़ॉर्म पर चला सकते हैं जहाँ VM (आज, इसे "रनटाइम एनवायरनमेंट" कहा जाता है)। लेकिन एक और फायदा यह है कि आप अपनी 2011 की मशीन में 1995 से जावा 1.1 कोड चला सकते हैं। जो संभव नहीं है यदि आपका कोड i386 पर संकलित किया गया था और आप इसे अपने AMD64 आर्किटेक्चर पर चलाने की कोशिश करते हैं।

आपको वर्चुअल मशीन में भी सुधार आता है।

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

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


3

लिखने के बारे में अच्छे उत्तर एक बार कहीं भी संकलित करें।

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

इसलिए मैं कहूंगा कि किसी भाषा की पोर्टेबिलिटी निम्न द्वारा निर्धारित की जाती है:

  1. मानकीकरण का स्तर।
  2. विभिन्न प्लेटफार्मों / आर्किटेक्चर के लिए कंपाइलरों की उपलब्धता।
  3. पोर्टेबल पुस्तकालयों की गहराई और चौड़ाई।

वास्तविक रूप से हालांकि लगभग किसी भी जटिल सी एप्लिकेशन को हार्डवेयर या ऑपरेटिंग सिस्टम निर्भरता के कारण नए प्लेटफॉर्म पर जाने के लिए कुछ काम की आवश्यकता होगी। उस प्रक्रिया को पोर्टिंग के रूप में जाना जाता है।


3

"पोर्टेबिलिटी" के कई अर्थ हैं। सी के संबंध में, इसका मतलब निम्न है:

  • सी के लिए कई प्रकार के हार्डवेयर और ऑपरेटिंग सिस्टम प्लेटफ़ॉर्म के लिए कंपाइलर लागू किए गए हैं, जो 70 के दशक की शुरुआत में एक बड़ी डील थी;

  • भाषा के लिए एक सार्वभौमिक रूप से सहमत-मानक है, जैसा कि प्रत्येक संकलक कार्यान्वयन के विपरीत भाषा के थोड़े अलग संस्करण को पहचानता है (फिर से, एक बड़ी डील जब C को पहली बार डिज़ाइन किया गया था, क्योंकि पास्कल और बेसिक जैसी भाषाओं के कई संस्करण थे जो सार्वभौमिक रूप से मान्यता प्राप्त नहीं थे);

  • इस मानक के कारण, विभिन्न प्लेटफार्मों पर संकलित होने पर अनुरूप कोड समान व्यवहार का उत्पादन करेगा।

स्रोत कोड पोर्टेबल है, लेकिन एक नए द्विआधारी प्रत्येक लक्ष्य के लिए उत्पन्न हो गया है।

ध्यान दें, हालांकि, वह सी स्रोत शायद ही कभी "तुच्छ" पोर्टेबल है; अधिकांश अनुप्रयोगों के लिए आपको भाषा के मानक द्वारा परिभाषित किए जाने से परे जाने की आवश्यकता होती है, जो एक विशेष प्लेटफॉर्म के लिए अद्वितीय एक्सटेंशन का उपयोग करते हैं, इसलिए अभ्यास स्रोत कोड में 100% पोर्टेबल नहीं है।

ध्यान दें, हालांकि, सी कार्यान्वयन पर बहुत अधिक प्रभाव छोड़ता है। विभिन्न डेटा प्रकारों के सटीक आकार, अतिप्रवाह पर व्यवहार आदि, सभी कार्यान्वयन तक हैं; मानक न्यूनतम आवश्यकताओं को प्रदान करता है जो एक कार्यान्वयन के अनुरूप होना चाहिए, लेकिन कार्यान्वयन उन सीमाओं से परे जाने के लिए स्वतंत्र है।


0

ISA जो कुछ भी है, C ISA विशिष्ट नहीं है। मुझे लगता है कि आप पीसी एक्सटेंशन कार्ड के लिए अब-अप्रचलित स्लॉट की बात नहीं कर रहे हैं।

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

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

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

सी में एक मानक पुस्तकालय है, बेशक, लेकिन इसका दायरा जावा, सी #, पायथन, आदि की तुलना में अपेक्षाकृत सीमित है।


4
ISA = निर्देश सेट आर्किटेक्चर उर्फ ​​हार्डवेयर आर्किटेक्चर
vartec
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.