क्या संकलक विकास के बाहर उपयोग किए जाते हैं?


14

जहाँ तक मेरी समझ जाती है, डेवलपर्स अपने कोड को निष्पादन योग्य (मशीन-कोड) फाइलों में संकलित करने वाले डेवलपर्स के लिए होते हैं। कंपाइलर क्लाइंट की मशीन या एंड-यूज़र सिस्टम तक नहीं बढ़ाते हैं।

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

क्या कंपाइलरों का इस प्रक्रिया से बाहर कोई कार्य है? यदि हां, तो उनका उपयोग कब किया जाता है?


21
हाँ, संकलक कोड संकलित करते हैं।
टॉम स्क्वायर्स

@ टॉम: मैंने कहीं पढ़ा है कि गेमिंग कंसोल सहित विभिन्न मशीनों पर सी-कंपाइलर लगाए जाते हैं। क्या इसका मतलब है कि हम सी में कोड लिखते हैं, फिर इन उपकरणों को भेज दिया जाता है, जहां संकलक द्वारा संकलित किया जाता है और फिर दुभाषिया द्वारा निष्पादित किया जाता है?
पंकज उपाध्याय

3
@ पंकज उपाध्याय: यह संभव है कि कोड एक मशीन को भेजा जा सके और फिर एक आंतरिक प्रक्रिया द्वारा संकलित किया जा सके। यह संभावना नहीं है कि डिवाइस का उपयोगकर्ता कभी भी ऐसा होते हुए देखेगा या इसके बारे में जान सकेगा। यह तब किया जा सकता है जब कोड के कुछ हिस्सों को विशिष्ट हार्डवेयर और समाधानों के लिए संकलित करने की आवश्यकता होती है जो रनटाइम पर हार्डवेयर के लिए परीक्षण बहुत धीमी गति से होते हैं, जिससे कोड को वितरित करने और इंस्टॉल के दौरान संकलन करने की आवश्यकता होती है। हो सकता है ...
FrustratedWithFormsDesigner 14

3
@ पंकज संकलकों के साथ कोई गेम कंसोल जहाज नहीं है, लेकिन कुछ उन पर स्थापित किया जा सकता है। सोनी ने लिनक्स और जीसीसी का एक संस्करण प्रदान किया जिसे उदाहरण के लिए PS2 पर स्थापित किया जा सकता है। अन्य लोगों ने अन्य OSs और सॉफ़्टवेयर को कंसोल पर लाने के लिए अपना रास्ता क्रैक / हैक कर लिया है।
आयरनमैंसन

4
@Stargazer: क्या आपका मतलब है: "नहीं, संकलनकर्ता स्रोत भाषा से लक्ष्य भाषा में अनुवाद करते हैं"? कॉमा को स्वीकार करने से आपका वाक्य आपके इच्छित अर्थ के विपरीत हो जाता है।
डैनियल प्रीडेन

जवाबों:


19

हां और ना। हां, शास्त्रीय परिदृश्य स्रोत कोड से मशीन कोड उत्पन्न करने के लिए एक कंपाइलर का उपयोग करने वाला एक डेवलपर है, और मशीन कोड को फिर उपयोगकर्ताओं को वितरित किया जाता है।

वहाँ रहे हैं हालांकि इस के लिए कुछ अपवादों को छोड़कर। सबसे पहले, कई ओपन सोर्स प्रोजेक्ट्स मुख्य रूप से (या विशेष रूप से) सोर्स कोड फॉर्म में वितरित किए जाते हैं, और अंतिम उपयोगकर्ता से यह उम्मीद करते हैं कि वे जैसे makeऔर फिर कुछ कमांड में टाइप करके इंस्टॉल करें।make intall। यह कंपाइलर, लिंकर इत्यादि को इनवॉइस कंप्यूटर के लिए सोर्स कोड से मशीन कोड जनरेट करेगा। इन मामलों में, हालांकि, निर्माण और स्थापित करने की प्रक्रिया इस बिंदु पर स्वचालित है (कम से कम करने का इरादा है) कि उपयोगकर्ता को शायद ही कभी इस तथ्य से परे बहुत ज्ञान की आवश्यकता होती है कि क्या उन्होंने कभी स्रोत कोड-केवल पैकेज स्थापित नहीं किया है , उनके पैकेज मैनेजर आम तौर पर कुछ "विकास" पैकेज की सूची देंगे, जो वास्तव में उनकी देखभाल करने वाले एप्लिकेशन को स्थापित करने के लिए एक शर्त के रूप में है (हालांकि कुछ अभी भी इसे उपयोगकर्ताओं को समाप्त करने के लिए अनफ्री के रूप में देखते हैं)।

एक और अपवाद (जिसे मैंने देखा है, लेकिन मेरे द्वारा देखे गए अन्य उत्तरों में बहुत अच्छी तरह से समझाया नहीं गया है) सिर्फ-इन-टाइम (JIT) कंपाइलर हैं। JIT संकलक के कुछ स्पष्ट उदाहरण Microsoft कॉमन लैंग्वेज रनटाइम (CLR) और जावा वर्चुअल मशीन (JVM) हैं। इन मामलों में, स्रोत कोड को मशीन कोड में अनुवाद करने में आम तौर पर दो पूरी तरह से अलग संकलक शामिल होते हैं । एक डेवलपर द्वारा उपयोग किया जाता है। हालांकि, मशीन कोड को सीधे जनरेट करने के बजाय, यह मशीन-स्वतंत्र बाइट कोड उत्पन्न करता है। सीएलआर / जेवीएम में एक दूसरा संकलक शामिल होता है , जो पहले से पूरी तरह से अलग है, जो उन बाइट कोड को लक्ष्य कंप्यूटर के लिए मशीन कोड में परिवर्तित करता है।

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


24

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


4
अगर हम निष्पादन योग्य फ़ाइलों को उत्पन्न करने वाले कार्यक्रमों के लिए "संकलक" की परिभाषा को सीमित करने के लिए थे, तो यह एक अच्छा जवाब होगा। हालाँकि, यह केवल "संकलक" की सही परिभाषा का एक सबसेट है
rivalk

16
@ जान सोल्टिस: मैं असहमत हूं। मैंने लिनक्स कर्नेल को स्रोत से संकलित किया है: इसका मतलब है कि मैं लिनक्स कर्नेल डेवलपर हूं ? मैंने लिनक्स कर्नेल कोड को कभी संशोधित नहीं किया है या एक पैच सबमिट नहीं किया है - मैं कहूंगा कि इसका मतलब है कि मैं कर्नेल डेवलपर नहीं हूं । साथ ही, कई वर्षों तक मैंने अपने प्राथमिक ऑपरेटिंग सिस्टम के रूप में जेंटू का उपयोग किया, मैंने मशीन पर सॉफ्टवेयर के हर एक टुकड़े को संकलित किया । हालांकि, उनमें से अधिकांश लोगों को पोर्टेज पैकेज प्रबंधन प्रणाली द्वारा स्वचालित रूप से संकलित किया गया था। मैं तर्क दूंगा कि उस मामले में मैं एक अंतिम उपयोगकर्ता के रूप में काम कर रहा था, लेकिन एक डेवलपर के रूप में नहीं ।
डैनियल प्रीडेन

8
@ जान सोल्टिस: मुझे पता है कि यह आपकी राय है। मैं आदरपूर्वक असहमत हूं। आपने मेरी स्थिति का समर्थन करने के लिए प्रतिवाद प्रदान किया, जबकि आप असमर्थित दावे करना जारी रखते हैं। आपको लगता है कि "डेवलपर" और "अंत उपयोगकर्ता" के बीच एक तेज रेखा है जो मुझे विश्वास नहीं है कि मौजूद है।
डेनियल प्राइडेन

6
सूत्रों को डाउनलोड करना और फिर "मेक इनस्टॉल" चलाना डेवलपर नहीं है। यह निश्चित रूप से एंड-यूज़र ऑपरेशन है।
क्रिस्टोफर जॉनसन

3
@ जान: मैं स्वीकार कर सकता हूं कि जेंटू जैसे डिस्ट्रो का उपयोग करना जो पैकेजों को संकलित करता है, आपको कम से कम एक पावर उपयोगकर्ता बनाता है , लेकिन यह अभी भी स्पष्ट रूप से एक प्रकार का उपयोगकर्ता है। अन्य लोगों के कोड को संकलित करना, इसे संशोधित किए बिना, इसे जोड़ना या यहां तक ​​कि इसे पढ़ना, आपको डेवलपर नहीं बनाता है।
कार्सन 63000

10

हाँ

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

उदाहरण के लिए, पायथन एक मॉड्यूल आयात करते समय बाइट-कोड उत्पन्न करता है, और इस तरह एक संकलक की परिभाषा के भीतर फिट बैठता है (क्योंकि यह स्रोत भाषा से परिवर्तित होता है, पायथन लक्ष्य भाषा में, पायथन बाइट-कोड)।

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


4

एक मामला एक ऐसे अनुप्रयोग के लिए होगा जो गतिशील रूप से रनटाइम पर कोड जनरेट करता है, और फिर जनरेट किए गए कोड को चलाता है। इस कोड को रनटाइम पर संकलित करने की आवश्यकता होगी।

संपादित करें: अन्य अपवाद हैं, लेकिन वे पहले से ही अन्य उत्तरों में उल्लिखित थे।


+1 सिर्फ जेआईटी
gnat

1
क्रोम में V8 इंजन एक ऑडबॉल अपवाद नहीं है।
rivalk

स्पष्ट करने के लिए अद्यतन किया गया। मुझे लगता है कि अन्य अपवाद हैं।
Morgan Herlocker

3

कंपाइलर केवल डेवलपर्स के लिए अपनी प्रोग्रामिंग-भाषा कोड को निष्पादन योग्य (मशीन-कोड) फ़ाइलों के संकलन के लिए हैं

मैं कहूंगा कि "कंपाइलर्स डेवलपर्स के लिए प्राथमिक हैं ..."। लेकिन मैंने ऐसे उदाहरण देखे हैं, जहां प्रोग्राम नए प्रोग्रामिंग-लैंग्वेज कोड को ऑन-द-फ्लाई उत्पन्न करते हैं और इसलिए एंड यूजर्स मशीन पर कंपाइलर लगाने की जरूरत होती है। इसका मतलब यह नहीं है कि एंड-यूज़र को कंपाइलर के साथ काम करना पड़ता है।

इस कार्यक्रम के डिजाइन के संभावित कारण:

  • प्रदर्शन: एक नियम-चालित एप्लिकेशन के बारे में सोचें जहां नियम किसी प्रकार के एंड-यूज़र डेटा स्टोर में संग्रहीत किए जाते हैं और आपके पास उन नियमों द्वारा संसाधित किए जाने के लिए कुछ बड़े पैमाने पर डेटा है। बार-बार नियमों की व्याख्या करने के बजाय, एक प्रोग्राम पहले प्रोसेसिंग कोड बनाता है, इसे संकलित करता है और संसाधित होने वाले डेटा के खिलाफ इसे चलाता है।

  • एक ऐसे कार्यक्रम के बारे में सोचें जहाँ अंतिम उपयोगकर्ता किसी प्रकार का गणित सूत्र जोड़ सकता है और कार्यक्रम के विकासकर्ता इसके लिए अपने स्वयं के पार्सर / दुभाषिया को लागू नहीं करना चाहते हैं। इसके बजाय, प्रोग्राम इस सूत्र को लेता है, इसे प्रोग्राम कोड के एक मान्य टुकड़े में बदलने के लिए कुछ अतिरिक्त बनाता है, संकलक इसे संकलित करें और बाद में इसे चलाता है।


हम्म .... इसका मतलब यह नहीं है कि अंत-उपयोगकर्ता को संकलक के साथ काम करना होगा । यह बहुत स्पष्ट करता है और स्पष्ट करता है।
पंकज उपाध्याय

2

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

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


2
ठीक है, मैं -1 से जा रहा हूं, क्योंकि कंपाइलर्स के बारे में यहां बहुत गलतफहमी है। संकलक स्रोत भाषा से लक्ष्य भाषा में कोड का अनुवाद करते हैं। यह कहना कि वे मशीन कोड उत्पन्न करते हैं, यह कहने के समान है कि वाहनों में 4 पहिए होते हैं (हाँ, अधिकांश वाहनों में 4 पहिए होते हैं, लेकिन एक मोटर साइकिल एक वाहन भी होती है। उसी तरह, अधिकांश कंपाइलर मशीन कोड उत्पन्न करते हैं, लेकिन C # -> VB कनवर्टर) साथ ही एक संकलक)
rivalk

1
@ Stargazer712, मैं आपको विश्वास दिलाता हूं कि कोई गलतफहमी नहीं है - मुझे पता है कि संकलक क्या करते हैं, धन्यवाद। लेकिन अगर कोई नहीं जानता है जो मुझसे पूछता है कि एक कार क्या है, तो मैं शायद कहूंगा कि एक कार में इस तथ्य के बावजूद चार पहिए हैं कि कुछ नहीं । एक पांडित्य की परिभाषा अक्सर एक अवधारणा से ग्रिप में आने की कोशिश करने वाले व्यक्ति को समझाने की तुलना में अधिक भ्रमित करती है। "कंपाइलर" एक नौकरी का विवरण भी हो सकता है, लेकिन यह उल्लेख करना कि यहां मदद नहीं करेगा।
कालेब

1

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


1

कुछ कार्यक्रम मेटा-प्रोग्राम हैं : दौड़ते समय, वे कुछ अन्य प्रोग्राम (या कुछ स्रोत कोड) उत्पन्न कर सकते हैं और इसे संकलित कर सकते हैं फिर इसे किसी तरह चला सकते हैं। मल्टी-स्टेज प्रोग्रामिंग के बारे में भी पढ़ें ।

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

एक उदाहरण के लिए, देखें पिघल (जो विस्तार करने के लिए सी ++ कोड उत्पन्न करता है जीसीसी या J.Pitrat के) Caia कृत्रिम बुद्धि प्रणाली (जो सी कोड -notably मिश्रित समस्याओं को हल करने के लिए अपने स्वयं code- उत्पन्न)।

साथ ही, कुछ भाषाओं और कुछ कार्यान्वयनों को लगभग हर जगह (हर प्रोग्राम में उस भाषा और कार्यान्वयन में कोडित) एक कंपाइलर की आवश्यकता होती है। सबसे पहले, कई वेब ब्राउज़रों में एक जावास्क्रिप्ट JIT इंजन होता है (जैसे V8 )। इसके अलावा, अधिकांश सामान्य लिस्प कार्यान्वयनों- SBCL में - एक संकलक (यहां तक ​​कि चलने वाले अनुप्रयोगों के लिए उपयोगी है, जो अभिव्यक्ति उत्पन्न और मूल्यांकन कर सकता है )। होमोसेक्सुअल भाषाओं और किन कार्यक्रमों के बारे में भी पढ़ें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.