मैंने हमेशा सोचा है कि किसी भाषा के वाक्य-विन्यास का जिक्र उसी तरह होता है जैसे किसी भाषा के शब्दार्थ का। लेकिन मुझे बताया गया है कि जाहिरा तौर पर ऐसा नहीं है। क्या फर्क पड़ता है?
मैंने हमेशा सोचा है कि किसी भाषा के वाक्य-विन्यास का जिक्र उसी तरह होता है जैसे किसी भाषा के शब्दार्थ का। लेकिन मुझे बताया गया है कि जाहिरा तौर पर ऐसा नहीं है। क्या फर्क पड़ता है?
जवाबों:
शब्दार्थ ~ अर्थ
सिंटेक्स ~ प्रतीकात्मक प्रतिनिधित्व
इसलिए विभिन्न भाषाओं में लिखे गए दो कार्यक्रम एक ही काम कर सकते हैं (शब्दार्थ) लेकिन कार्यक्रम लिखने के लिए इस्तेमाल किए जाने वाले प्रतीक अलग (वाक्यविन्यास) होंगे।
एक कंपाइलर आपके लिए आपके सिंटैक्स की जाँच करेगा (कम्पाइल-टाइम एरर), और शब्द नियमों को व्युत्पन्न करता है (सिंटैक्स को मशीन निर्देशों को मैप करते हुए), लेकिन सभी सिमेंटिक एरर्स (रन-टाइम एरर्स) नहीं मिलेंगे, जैसे कि गलत परिणाम क्योंकि कोड कहता है कि ऐड 2 के बजाय 1 जोड़ें)।
x + y
कि +
उन ऑपरेंड के लिए कोई उपयुक्त ऑपरेटर नहीं है ) का निदान करना चाहिए । 2 के बजाय 1 जोड़ना मैं एक तार्किक त्रुटि कहूंगा ।
वास्तव में दो स्तर नहीं बल्कि तीन हैं:
i
और f
उत्पन्न करता है if
)if
, (
, 42
, ==
, answer
और )
एक सशर्त बयान का उत्पादन)ValidIdentifier
टर्मिनल होगा, जिसे कुछ इस तरह से परिभाषित किया जा सकता है ![AnyKeyword] [Identifier]
(मैं यहां PEG की तरह संकेतन का उपयोग कर रहा हूं)। आपको ऐसी भाषा के लिए अलग लेक्सिंग पास की आवश्यकता नहीं है। उदाहरण के लिए, GLR- आधारित C ++ पार्सर देखें।
शब्दार्थ एक प्रोग्रामिंग भाषा की तार्किक संस्थाओं और उनकी बातचीत का वर्णन करते हैं। सिंटेक्स परिभाषित करता है कि ये पात्रों में कैसे व्यक्त किए जाते हैं।
उदाहरण के लिए, सूचक अंकगणितीय की अवधारणा सी के शब्दार्थ का हिस्सा है; जिस तरह से +
और -
ऑपरेटर्स को पॉइंटर ऑपरेशन को व्यक्त करने के लिए इस्तेमाल किया जा सकता है, वह इसके सिंटैक्स का हिस्सा है।
कभी-कभी, दो भाषाएं उनके शब्दार्थ का हिस्सा साझा करती हैं, लेकिन वाक्यविन्यास अलग-अलग होता है (उदाहरण C # और VB.NET - दोनों मूल्य प्रकार और संदर्भ प्रकारों का उपयोग करते हैं, लेकिन आप जिन वर्णों को परिभाषित करने के लिए टाइप करते हैं वे अलग हैं); अन्य मामलों में, दो भाषाएं समान रूप से समान हैं, लेकिन शब्दार्थ मेल नहीं खाते (जावा बनाम जावास्क्रिप्ट पर विचार करें, जहां समानताएं शुरुआती को भ्रमित करती हैं)।
सिंटेक्स यह है कि आप किसी भाषा के टोकन की व्यवस्था कैसे करते हैं। शब्दार्थ वह है जो उन टोकन का मतलब है (आमतौर पर, टोकन की एक विशेष व्यवस्था का मतलब है)।
आपने यह निर्दिष्ट नहीं किया कि आप केवल प्रोग्रामिंग भाषाओं या प्रोग्रामिंग में प्रयुक्त सामान्य भाषाओं का उल्लेख करते हैं, इसलिए मेरा उत्तर डेटा भाषाओं (जैसे XML, RDF, डेटा प्रकार सिस्टम आदि) के बारे में है:
भाषा-स्वतंत्र मानकों (1995) के निर्माण के अपने सात सुनहरे नियमों में ब्रायन एल। मीक लिखते हैं कि "एक भाषा का वाक्य विन्यास दूसरे का शब्दार्थ हो सकता है" । वह डेटा वर्णन में उपयोग किए गए "वाक्यविन्यास" और "शब्दार्थ" शब्दों को संदर्भित करता है: इसलिए यदि आप कुछ डेटा प्रारूप के विनिर्देश में इन शब्दों पर ठोकर खाते हैं, तो आपको स्पष्ट रूप से यह बताने के लिए कि दोनों शब्दों को "पॉटर्जेबी" से बदलना चाहिए, ताकि आपको बाहर काम करना पड़े अपने लिए अर्थ।
सिंटैक्स और सिमेंटिक के बीच का संबंध, कम से कम बिल्कुल निर्दिष्ट डेटा में, "एन्कोडिंग" शब्द से बेहतर वर्णित किया जा सकता है । सिंटेक्स में सिमेंटिक कूटबद्ध है। रिकॉर्डिंग के रूप में नेस्टेड किया जा सकता है, एक भाषा का वाक्य विन्यास दूसरे का शब्दार्थ है। यदि कोई डेटा के दायरे से परे जाता है, तो यह घोंसला लगभग अनंत हो सकता है, जैसा कि Umberto Eco द्वारा "असीमित अर्धसूत्रीविभाजन" के रूप में वर्णित है।
एक उदाहरण देने के लिए:
लोग आमतौर पर किसी स्तर पर रुकते हैं और इसे अर्थ के रूप में लेते हैं, लेकिन अंत में कोई अंतिम शब्दार्थ नहीं होता है जब तक कि कुछ मनुष्य अपने दिमाग में डेटा की व्याख्या नहीं करते हैं। जैसे ही कोई डेटा के रूप में अर्थ को व्यक्त करने की कोशिश करता है, वह वाक्य रचना बन जाता है।
यदि इसे बीएनएफ (बैकस-नौर फॉर्म) या कुछ इसी तरह से वर्णित किया जा सकता है , तो यह वाक्यविन्यास है। यदि ऐसा नहीं हो सकता, तो यह नहीं है।
दूसरी ओर, शब्दार्थ एक कार्यक्रम के अर्थ (या स्रोत कोड के अन्य हिस्सा) के बारे में है।
और कभी-कभी दोनों के बीच की रेखा धुंधली हो सकती है।
भेद को समझने का एक तरीका यह है कि आपके प्रोग्राम के सिंटैक्स या शब्दार्थ गलत होने पर आपको किस प्रकार की त्रुटियां देखने को मिलती हैं।
एक वाक्यविन्यास त्रुटि भाषा के व्याकरण से मेल करने के लिए स्रोत कोड की विफलता है, उदाहरण के लिए, अर्धविराम नहीं होना जहां किसी की आवश्यकता होती है।
एक शब्दार्थ त्रुटि अन्य भाषा आवश्यकताओं (जो C, उदाहरण के लिए, "अड़चन" कहता है) को संतुष्ट करने में विफलता है; एक उदाहरण लेखन हो सकता है x + y
जहां x
और y
असंगत प्रकार के होते हैं। भाषा व्याकरण आपको बताता है कि एक जोड़ जैसा दिखता है something + something
, लेकिन यह इतना शक्तिशाली नहीं है कि वह बाएं और दाएं ऑपरेंड के प्रकारों पर आवश्यकताओं को व्यक्त कर सके।
(तार्किक त्रुटियां, जैसे 1 का उपयोग करना जहां 2 सही होगा, आमतौर पर संकलक द्वारा पता लगाने योग्य नहीं होते हैं - हालांकि कुछ मामलों में एक संकलक संदिग्ध कोड के बारे में चेतावनी दे सकता है।)
सिंटेक्स वह है जो (लेक्सिकल) प्रतीक कहते हैं। शब्दार्थ का अर्थ है।
विचार करें:
C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- विभिन्न वाक्यविन्यास, एक ही शब्दार्थ।
C #: left_value / right_value
VB.NET: left_value / right_value
- समान वाक्यविन्यास, विभिन्न शब्दार्थ (पूर्णांक के लिए)।
वाक्यविन्यास शब्दों की व्याकरणिक व्यवस्था है एक वाक्य में शब्द क्रम।
(अंग्रेजी) ' कैट डॉग ब्वॉय ' और (प्रोग्रामिंग) ' हाय.5 ' वाक्य-रचना सही नहीं है।
(अंग्रेजी) ' कैट हग्स बॉय ' और (प्रोग्रामिंग) '* 3.2 * 5 *' वाक्यगत रूप से मान्य है।
स्टेटिक शब्दार्थ विज्ञान है कि क्या वाक्यात्मक रूप से मान्य बयानों का कोई अर्थ है।
(अंग्रेजी) ' I are big ' (प्रोग्रामिंग) (python) ' 3 +' hi ' वाक्यगत रूप से सही है लेकिन इसमें स्थैतिक शब्दार्थ त्रुटि है।
शब्दार्थ का अर्थ है बिना किसी स्थैतिक शब्दार्थ त्रुटि के साथ प्रतीकों के वाक्य-विन्यास के सही तार से जुड़ा हुआ वाक्य अर्थात् वाक्य-रचना और शब्द-रूप सही है, लेकिन इसका अर्थ वह नहीं हो सकता है जो अभीष्ट था।
(अंग्रेजी) ' फ्लाइंग प्लेन खतरनाक हो सकते हैं' के दो अर्थ हो सकते हैं अर्थात विमानों का उड़ना खतरनाक हो सकता है या जो विमान उड़ रहे हैं वे खतरनाक हो सकते हैं।
(प्रोग्रामिंग) 'कंप्यूटर कोई त्रुटि संदेश उत्पन्न नहीं करेगा, लेकिन यह वह नहीं करेगा जो आपने इसे करने के लिए कहा था; यह कुछ और करेगा। '
स्रोत : एमआईटी 6.00.1
सिंटैक्स एक भाषा में मान्य बयानों के निर्माण को नियंत्रित करने वाले औपचारिक नियमों को संदर्भित करता है। शब्दार्थ से तात्पर्य नियमों के समुच्चय से है जो कथन का अर्थ देता है।
एक प्रोग्राम में सिंटैक्स के कारण त्रुटियां होती हैं जब प्रोग्रामिंग भाषा के रूबल का उल्लंघन या दुरुपयोग होता है। किसी कार्यक्रम में शब्दार्थ के कारण त्रुटियां तब होती हैं जब कथन सार्थक नहीं होते हैं।
शब्द आदेश वाक्यविन्यास का मूल प्रमुख है, जो समझने की कोशिश कर रहे हैं कि वाक्य संरचना और अर्थ देने में मदद करने के लिए शब्द क्रम के वाक्यविन्यास cues का उपयोग करें। शब्दार्थ एक व्यक्ति के पूर्व ज्ञान के आधार पर एक "वाक्य" के अर्थ की अपनी व्याख्या है। इसलिए एक वाक्य जो प्रतीत होता है कि कोई वाक्यात्मक अर्थ नहीं है, शब्दार्थ cues का उपयोग करते समय इसका अर्थ हो सकता है।
सिंटैक्स का संबंध केवल भाषाई और व्याकरणिक रूप से सही है। शब्दार्थ सभी को पूर्व ज्ञान की आवश्यकता होती है, और जो भाषा विशिष्ट है, उससे कहीं आगे है।
वाक्य "बेबी मिल्क ड्रिंक्स" का वाक्य-विन्यास अर्थ नहीं है, लेकिन शब्दार्थ के माध्यम से अधिकांश लोग इसका अर्थ "बेबी ड्रिंक दूध" के रूप में व्याख्या करेंगे, जैसा कि हमारा पूर्व ज्ञान हमें बताता है कि एक बच्चा दूध पीता है, और इसलिए हम एक अर्थ ढूंढ सकते हैं प्रमुख शब्द।
सिंटेक्स और शब्दों की तरह है रणनीति और रणनीति या छोड़ दिया और सही ।
वे वास्तव में स्वतंत्र सार्वभौमिक अवधारणाएं नहीं हैं, लेकिन संबंधित शब्दों की एक जोड़ी है, जब आप किसी विशेष संदर्भ में होते हैं, तो विपरीत दिशाओं को इंगित करते हैं। लेकिन एक ही चीज़ जो एक पैमाने पर रणनीति है दूसरे पर रणनीति है।
इसलिए यदि आप एक भाषा में कोड लिख रहे हैं, तो वाक्य रचना वह भाषा है जिसका आप उपयोग कर रहे हैं और वांछित व्यवहार शब्दार्थ है। लेकिन अगर आप उस भाषा के लिए कंपाइलर को लागू कर रहे हैं, या चर्चा कर रहे हैं, तो वाक्य रचना व्याकरण और शायद टाइप सिस्टम और उस पर निर्मित सब कुछ शब्दार्थ है। और इसी तरह।
सिंटेक्स वह है जो कंप्यूटर समझता है, शब्दार्थ वह है जो मानव समझता है।
एक कंपाइलर / दुभाषिया आपके डिजाइन के बारे में एक सफेद परवाह नहीं करता है, और मशीन स्तर तक संकलित किसी भी कोड में आपको डिजाइन को तैयार करने में कठिन समय होगा। डेवलपर्स डिजाइन के बारे में परवाह करते हैं क्योंकि एक अच्छा डिजाइन जटिल व्यवहारों और अंतःक्रियाओं को अमूर्त करके जटिलता को कम करने के बारे में है, और विभिन्न प्रकार की समस्याएं खुद को विभिन्न शब्दार्थों के लिए उधार देती हैं। भाषा का विकल्प काफी हद तक इस बात का है कि आप जिस शब्दार्थ का उपयोग करना चाहते हैं, वह कितनी आसानी से और कुशलता से किया जा सकता है।
"सादे सी" के साथ बहुत छोटा उदाहरण:
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
इस उदाहरण में, "-" टोकन के लिए सिंटैक्स एक ही है, लेकिन, इसका एक अलग अर्थ ("सिमेंटिक) है, जहां इसका उपयोग किया जाता है।
"X" असाइनमेंट में, "-" का अर्थ है "घटाव" ऑपरेशन, "y" असाइनमेंट में, "-" का अर्थ है "नकारात्मक संकेत" ऑपरेशन।
-
ऑपरेटर एक ही टोकन हैं , लेकिन वे वाक्यात्मक रूप से भिन्न हैं, क्योंकि वे अलग-अलग संदर्भों में उपयोग किए जाते हैं। 0 - 1
वाक्यविन्यास नियम से मेल खाता है additive-expression: additive-expression - multiplicative-expression
, जबकि - 1
वाक्यविन्यास नियम unary-expression: unary-operator cast-expression
(संदर्भ: C99 मानक) से मेल खाता है ।
-
ओप्रेक्टर्स के बीच का अंतर सिंटैक्टिक है, न कि सिमेंटिक (हालांकि उनके अलग-अलग शब्दार्थ भी हैं)। सिंटैक्स भाषा व्याकरण द्वारा परिभाषित किया गया है, और दो ऑपरेटरों को व्याकरण के विभिन्न वर्गों में निर्दिष्ट किया गया है। एन 1570 ड्राफ्ट देखें, यूनरी ऑपरेटरों के लिए खंड 6.5.3 और एडिटिव ऑपरेटरों के लिए 6.5.6। (बीटीडब्लू, यदि आप एक सी उदाहरण का उपयोग करने जा रहे हैं, तो यह शायद सही void main()
होना चाहिए ; होना चाहिए int main(void)
, और आप गायब हैं #include <stdio.h>
और जो भी हेडर घोषित किया गया हैgetch