वास्तव में एक प्रोग्रामिंग भाषा क्या है? क्या हमें ऐसी भाषा में लिखने में सक्षम बनाता है?


26

ठीक है, मैं प्रोग्रामिंग में नया हूं और मैं मानता हूं कि यह काफी सारगर्भित प्रश्न है।

हम प्रतिदिन जो प्राकृतिक भाषा बोलते हैं वह मौजूद है क्योंकि लोग एक दूसरे को समझ सकते हैं। कंप्यूटर एक निश्चित भाषा में लिखे गए मेरे कोड को कैसे समझ सकता है?

मान लीजिए कि मि। ए नई भाषा बनाता है। यह मशीनों द्वारा कैसे स्वीकार किया जाता है? क्या निर्माता को नई भाषा बनाने के लिए मशीन भाषा का उपयोग करके मशीन से संवाद करना चाहिए? क्या गारंटी है कि हम मशीन द्वारा ठीक से समझने के दौरान एक भाषा में लिख सकते हैं?


1
क्या हमें ऐसी भाषा में लिखने में सक्षम बनाता है? - "दिमाग: नया आश्चर्य सिर भराव!" - स्पाइक मिलिगन।
स्टीफन सी

6
थोड़ा व्यापक, लेकिन फिर भी एक अच्छा सवाल है। बहुत से लोग बस भाषा का उपयोग बिना यह सोचे-समझे करते हैं कि वे कैसे काम करते हैं। अच्छा है कि आप उत्सुक हैं।
रिवालक

4
यह एक सामान्य संदर्भ प्रश्न है, विकिपीडिया द्वारा आसानी से और तुच्छ उत्तर दिया गया है
हारून को

जवाबों:


39

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

सभी भाषाओं में कंपाइलर नहीं होता है। उनमें से कुछ के बजाय एक दुभाषिया होता है, जो सभी समान चीजों को एक कंपाइलर करता है, सिवाय इसके कि मशीन कोड का उत्पादन करने के बजाय यह निर्धारित करता है कि कार्यक्रम का क्या मतलब है, यह बस प्रोग्राम को तुरंत निष्पादित करता है। लेकिन कोड को पार्स करने (पढ़ने) के मूल सिद्धांतों और यह निर्धारित करने का मतलब है कि समान हैं।

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


11
+1 - मैं यह भी जोड़ूंगा कि जब आप एक नई भाषा लिख ​​रहे हों, तो आपको कंपाइलर या दुभाषिया को किसी अन्य भाषा में लिखना होगा। संकलक या दुभाषिया के बाद के संस्करणों को फिर भाषा के पुराने संस्करणों में लिखा जा सकता है और पुराने संकलक के साथ संकलित किया जा सकता है। बहुत पहले कोडांतरक मशीन कोड में लिखा गया था। पहला सी कंपाइलर असेंबली (सबसे अधिक संभावना) आदि में लिखा गया था
स्कॉट व्हिटलॉक

1
मैं कंपाइलर की परिभाषा बदल दूंगा। वे सभी मशीन कोड का उत्सर्जन नहीं करते हैं। विशेष रूप से आजकल "इंटरमीडिएट कोड" का उत्सर्जन करने वाले इतने सारे कंपाइलरों के साथ, जैसे कि एमएसआईएल। ऐसे कंपाइलर भी हैं जो जावास्क्रिप्ट का उत्सर्जन करते हैं!
नील एन

3
मुझे यह बताने में संकोच होगा कि कंपाइलर परिभाषा द्वारा मशीन कोड का उत्पादन करता है, यहां तक ​​कि जब एक शुरुआत करने वाले को समझाता है। यह कहने की तरह है कि फ़ंक्शंस वास्तविक संख्याओं को वापस करते हैं, एक निरर्थक निरीक्षण। कंपाइलर कंस्ट्रक्शन के सभी कोड बनाते हैं जो वास्तव में सिलिकॉन से बनाए गए कंप्यूटर के लिए नहीं है, लेकिन केवल एब्सट्रैक्टली परिभाषित हो (यह एक वीएम या एक उच्च-स्तरीय भाषा है; इसका कारण यह है कि C मानक एक अमूर्त मशीन को परिभाषित करता है , और वहाँ एक है संकलक बहुत निम्न स्तर LLVM आईआर friggin करने के लिए 'जावास्क्रिप्ट) से। शुरुआती लोगों को वह पाने की जरूरत है, जितनी जल्दी बेहतर हो।

2
अधिकांश संकलक पुस्तकों का उपयोग करने वाला सरलीकरण यह है कि एक संकलक स्रोत भाषा से आउटपुट के रूप में लक्ष्य भाषा में परिवर्तित करने के लिए भाषा नियम लागू करता है। (यह सी के लिए संकलन करने के लिए असामान्य नहीं है, उदाहरण के लिए, विशेष रूप से एक परिचयात्मक पाठ्यक्रम के लिए)।
जेसनट्र्यू

4
@delnan, इससे भी अधिक - हर भाषा एक मशीन कोड है , अपने सार मशीन के लिए। भाषा चाहे कितनी भी ऊँची क्यों न हो।
एसके-लॉजिक

11

जैसा कि आपने बताया, मनुष्य एक दूसरे के बीच "प्राकृतिक" भाषा जैसे अंग्रेजी, फ्रेंच, जर्मन के माध्यम से संवाद करते हैं। उन्हें प्राकृतिक कहा जाता है क्योंकि हम जानबूझकर उन्हें आविष्कार करने के बजाय स्वाभाविक रूप से प्राप्त करते हैं (एस्पेरांतो एक अपवाद है)।

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

सभी भाषाओं को एक व्याकरण का उपयोग करके वर्णित किया जा सकता है। 1956 में नोम चोम्स्की द्वारा व्याकरणों के एक पदानुक्रम का वर्णन किया गया था। इसमें निम्न स्तर होते हैं:

टाइप -0 व्याकरण (अप्रतिबंधित व्याकरण)। वे सबसे सामान्य हैं, और एक ट्यूरिंग मशीन के बराबर हैं। जैसे, यह तय करने की समस्या कि क्या एक दी गई स्ट्रिंग एक अप्रतिबंधित व्याकरण का हिस्सा है, अनिर्दिष्ट है।

टाइप -1 व्याकरण (संदर्भ-संवेदनशील व्याकरण)। लगभग सभी प्राकृतिक भाषाएं जैसे अंग्रेजी संदर्भ-संवेदनशील हैं। अंग्रेजी में संदर्भ-संवेदनशीलता का एक उदाहरण दो वाक्यांश हैं: "समय एक तीर की तरह उड़ता है।" और "फल केले की तरह उड़ता है।" सामान्य तौर पर, कंप्यूटर के लिए संदर्भ-संवेदनशील भाषाओं को समझना मुश्किल है।

टाइप -2 व्याकरण (संदर्भ-मुक्त)। संदर्भ-मुक्त भाषाएँ अधिकांश प्रोग्रामिंग भाषाओं के वाक्य विन्यास का सैद्धांतिक आधार हैं।

टाइप -3 व्याकरण (नियमित व्याकरण)। नियमित भाषाओं के परिवार को नियमित अभिव्यक्ति द्वारा प्राप्त किया जा सकता है। नियमित भाषाओं का उपयोग आमतौर पर खोज पैटर्न और प्रोग्रामिंग भाषाओं की शाब्दिक संरचना को परिभाषित करने के लिए किया जाता है।

टाइप 2 (संदर्भ-मुक्त) और टाइप 3 (नियमित) व्याकरण कंप्यूटर द्वारा सबसे अधिक बार होते हैं क्योंकि उनके लिए पार्सर कुशलता से लागू किया जा सकता है।

बीएनएफ (बैकस नॉर्मल फॉर्म या बैकस-नौर फॉर्म) संदर्भ-मुक्त व्याकरण के लिए एक संकेतन तकनीक है, जिसका उपयोग अक्सर कंप्यूटिंग में उपयोग की जाने वाली भाषाओं के वाक्य विन्यास का वर्णन करने के लिए किया जाता है।

उदाहरण के लिए एक पहचानकर्ता के रूप में वर्णित किया जा सकता है:

<identifier> ::= <letter> { <letter> | <digit> }

जिसका अर्थ है कि यह एक अक्षर से शुरू होना चाहिए और इसमें अतिरिक्त अक्षर या अंक हो सकते हैं।

इससे पहले, एक पत्र एक 'ए' परिभाषित है 'बी' | 'c' आदि, और अंक को '9' के माध्यम से '0' के रूप में परिभाषित किया जाता है, इसी प्रकार के अंकन का उपयोग किया जाता है।

एसी "के लिए" बयान के रूप में परिभाषित किया जा सकता है:

 <for_statement> ::=
    'for' '(' <expression> ';' <expression> ';' <expression> ')' <statement> 

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


+1 महान लेखन। लेकिन मुझे आश्चर्य नहीं है कि यह उत्तर के रूप में स्वीकार नहीं किया गया। यह वही है जो मैंने सोचा था कि ओपी पूछ रहा था, लेकिन उनके द्वारा चुने गए जवाब के आधार पर, ऐसा लगता है कि वे कुछ उच्च स्तर चाहते थे।
मैथ्यू रोडेटस

5

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

इस सबसे बुनियादी स्तर पर, C # अंग्रेजी से अलग नहीं है। C # एक "प्रोग्रामिंग लैंग्वेज" क्या है, इसकी मंशा है, और इसलिए इसका डिज़ाइन; इसे व्यक्तिगत निम्न-स्तरीय कमांड में पचाने के लिए डिज़ाइन किया गया है। जैसे, पूर्वनिर्धारित शब्दावली सीमित है, वाक्यविन्यास बहुत कठोरता से लागू किया गया है, और पूरी भाषा को इसके "दर्शकों" (कंप्यूटर) द्वारा बहुत ही अच्छी तरह से ज्ञात पूर्वनिर्धारित तरीके से उपभोग करने के लिए डिज़ाइन किया गया है; साधारण कोड की "मध्यवर्ती भाषा" में स्रोत कोड जिसे फिर "रनटाइम" द्वारा मशीन कोड में अनुवाद किया जा सकता है)। आप सी # में गद्य या कविता नहीं लिखते हैं; आप कंप्यूटर को सबसे अधिक संभव तरीके से काम करने के लिए कहते हैं।

कंप्यूटर के लिए, हां, एक उपकरण, जिसे आमतौर पर कंपाइलर कहा जाता है, को कोड में लिखे गए शब्दों को लेने और इसे उन निर्देशों में परिवर्तित करने की आवश्यकता होती है जो कंप्यूटर उपयोग कर सकता है। अधिकांश प्रौद्योगिकी की तरह, कंप्यूटर विज्ञान एक स्वाभाविक रूप से चलने वाला, "स्तरित" प्रक्रिया है। जब पहली बार कंप्यूटर का आविष्कार किया गया था, तो उन्हें बाइनरी निर्देशों को मैन्युअल रूप से दर्ज करके प्रोग्राम किया गया था। वे निर्देश प्रत्येक प्रोसेसर के लिए हेक्साडेसिमल "मशीन कोड" में मानकीकृत हो गए; अंतर केवल यह है कि बाइनरी अंक मनुष्यों को प्रदर्शन के लिए कैसे वर्गीकृत किया जाता है। फिर, कोडांतरक कोड में, कमांड्स और कुछ मूल पहचानकर्ताओं जैसे रजिस्टर नाम को प्रोग्राम लिखते समय उनके हेक्साडेसिमल कोड के लिए प्रतिस्थापित किया गया था; ASM को अभी भी 1: 1 को देशी मशीन कोड में बदला जा सकता है। क्वांटम छलांग तीसरी पीढ़ी की "जरूरी" प्रोग्रामिंग के लिए थी, जो मूल रूप से अधिक मानव-समझ में आता है, चर और तर्क जैसी अमूर्त अवधारणाएं लूप और कीवर्ड और सिंटैक्स पर आधारित पैटर्न का उपयोग करके मूल निर्देशों में उन्हें पचाता है। COBOL, FORTRAN, पास्कल, और C जैसी प्रारंभिक भाषाएं अभी भी किसी विशेष मशीन भाषा (आमतौर पर 8086 ASM) में मानव द्वारा "अनुवादित" की जा सकती हैं। फिर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की क्रांति आई, जो मूल रूप से अतिरिक्त सिंटैक्स नियम है जो कोड को "ऑब्जेक्ट्स" में वैचारिक रूप से एन्कैप्सुलेट होने के रूप में परिभाषित करता है जिसमें राज्य और तर्क का कुछ संयोजन होता है। मानव द्वारा एक विशेष मशीन भाषा में (आमतौर पर 8086 एएसएम)। फिर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की क्रांति आई, जो मूल रूप से अतिरिक्त सिंटैक्स नियम है जो कोड को "ऑब्जेक्ट्स" में वैचारिक रूप से एन्कैप्सुलेट होने के रूप में परिभाषित करता है जिसमें राज्य और तर्क का कुछ संयोजन होता है। मानव द्वारा एक विशेष मशीन भाषा में (आमतौर पर 8086 एएसएम)। फिर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की क्रांति आई, जो मूल रूप से अतिरिक्त सिंटैक्स नियम है जो कोड को "ऑब्जेक्ट्स" में वैचारिक रूप से एन्कैप्सुलेट होने के रूप में परिभाषित करता है जिसमें राज्य और तर्क का कुछ संयोजन होता है।

आजकल, हम "4-पीढ़ी" भाषाओं में अच्छी तरह से हैं, जो सीधे मशीन के बजाय अन्य कार्यक्रमों के साथ संचार को परिभाषित करने के लिए लिखी गई भाषाएं हैं। व्यापक रूप से परिभाषित, इसमें XML / HTML जैसी "मार्कअप" भाषाएं, जावास्क्रिप्ट और एसक्यूएल जैसी "स्क्रिप्टिंग" भाषाएं शामिल हैं, और अधिकांश "सैंडबॉक्स" भाषाएं जैसे जावा और .NET फ्रेमवर्क (जो एक आईएल में संकलित करता है, जिसे फिर आगे व्याख्या की जाती है। एक रनटाइम जो मशीन और प्लेटफ़ॉर्म-विशिष्ट विवरण को दूर करता है)। आप यह भी कह सकते हैं कि यह कार्यात्मक प्रोग्रामिंग भाषाओं के दायरे को समाहित करता है, जो केवल मशीन-विशिष्ट विवरण के नहीं, बल्कि संचालन-विशिष्ट विवरण के अमूर्तता प्रदान करने के लिए रनटाइम पर निर्भर हैं। ये 4-पीढ़ी की भाषाएं कमोबेश एक मानव के लिए देशी मशीन निर्देशों में अनुवाद करने योग्य हैं, और मुद्दा यह है कि यह एक सार्थक प्रयास नहीं होगा; इन भाषाओं की ताकत एक स्तरित प्रक्रिया है जिसमें उनका उपयोग अंततः कंप्यूटर को यह बताने के लिए किया जाता है कि निम्न स्तरों पर क्या करना है।


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

2
@KeithS: आप इसे थोड़ा और पठनीय बनाने के लिए अंतिम पैराग्राफ को पुन: स्वरूपित करना चाह सकते हैं।
इवान वूइका

4

यह एक अच्छा प्रश्न है। एक उचित उत्तर में "कंप्यूटर विज्ञान" कहा जाता है, जो एक अच्छा आधा बनता है।

स्टार्टर के लिए, मैं मूल्य- निर्धारण और परिचालन शब्दार्थ के माध्यम से स्किमिंग करने की सलाह दूंगा और फिर इस पुस्तक को पढ़ूंगा । यह आपको प्रोग्रामिंग भाषा क्या है, और इसे औपचारिक रूप से कैसे परिभाषित किया जा सकता है, इसकी अधिक या कम ठोस समझ देगा।

यदि उपरोक्त थोड़ा बहुत अकादमिक है, तो आप पेटज़ोल्ड, "कोड" से शुरू कर सकते हैं , और फिर शब्दार्थ पर वापस आ सकते हैं।


1
आप वास्तव में इस प्रश्न का उत्तर देने के लिए किसी भारी सिद्धांत को पढ़ने के लिए 18 yo noob की उम्मीद करते हैं?
अय्यूब

2
@ जोब, अपने पिछले प्रश्न के अनुसार, उन्हें विश्वविद्यालय में योजना की खुराक मिल रही है (और, संभवतः, SICP)। थोड़ा शब्दार्थ के साथ ठीक होना चाहिए। वैसे भी, भारी सिद्धांत के बिना इस सवाल का कोई उचित जवाब नहीं है।
एसके-तर्क

"कोड" का उल्लेख करने के लिए +1। हर प्रवेश स्तर के सीएस छात्र के लिए उस पुस्तक को पढ़ना आवश्यक है।
डैनियल प्राइडेन

4

यदि आप एक प्रोग्रामिंग भाषा में एक प्रोग्राम लिखते हैं, तो एक अलग प्रोग्राम आपके प्रोग्राम के प्रतीकों को कंप्यूटर के प्रतीकों में परिवर्तित करेगा। कभी-कभी यह कई कदम उठाता है। सी में उदाहरण के लिए:

  1. उपयोगकर्ता उच्च-स्तरीय भाषा (सी) में प्रोग्राम लिखता है जो सीपीयू द्वारा समझ में नहीं आता है, लेकिन प्रोग्रामर द्वारा सीधे समझा जाता है (हम आशा करते हैं!)।

  2. कंपाइलर C को असम्बीली भाषा में परिवर्तित करता है, जो कि सीपीयू द्वारा सीधे समझ में नहीं आता है, लेकिन कुछ और में परिवर्तित करना आसान है।

  3. असेंबलर असेंबली को बाइनरी कोड के अनुक्रम में परिवर्तित करता है जो सीधे सीपीयू द्वारा समझा जाता है। कुछ संकलक उपरोक्त चरण (चरण 2) को छोड़ देते हैं और स्रोत कोड से सीधे संकलित बाइनरी का उत्पादन करते हैं।

यह गारंटी देने के लिए कि कंप्यूटर आपके प्रोग्राम को समझता है, संकलक या दुभाषिया आपको एक त्रुटि देगा और आमतौर पर रुक जाता है यदि यह कुछ ऐसी चीज़ का सामना करता है जो कि संकलित नहीं होती है, जैसे कि सिंटैक्स त्रुटि। यदि आपका प्रोग्राम संकलित नहीं किया जा सकता है, तो यह उस चरण में कभी नहीं आ सकता है जहां आपका कार्यक्रम इसे चलाने का प्रयास करेगा और विफल हो जाएगा क्योंकि यह "इसे" नहीं समझता।

एक नई भाषा बनाने के लिए, आप पहले अपनी उच्च-स्तरीय भाषा को डिज़ाइन करते हैं और फिर आपको अपनी नई भाषा के प्रतीकों को असेंबली भाषा के कमांड में मैप करने का एक तरीका खोजना पड़ता है जिसे आपका सीपीयू समझता है।


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