2010-08-19 9 views
15

तो मैं बिटवाइस में डी भाषा (http://www.bitwisemag.com/copy/programming/d/interview/d_programming_language.html) के बारे में वाल्टर उज्ज्वल के साथ इस साक्षात्कार पढ़ रहा हूँ, और मैं इस वाकई दिलचस्प उद्धरण भर में भाषा पार्स के बारे में आते हैं:वाल्टर ब्राइट का शब्द "अनावश्यकता" का उपयोग ... या 'बिल्ली का मतलब यह है?'

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

और अब मैं यह समझने की कोशिश कर रहा हूं कि जब वह "अनावश्यकता" कहता है तो उसका क्या मतलब है।

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

+1

मुझे लगता है कि वह यहां वाक्यविन्यास के बारे में बात कर रहा है। मशीन कोड शायद वह किस चीज के बारे में बात कर रहा है उससे बहुत करीब है। मान्य मशीन कोड ऑप्स की कोई भी स्ट्रिंग वैध वाक्यविन्यास है। –

+0

यह निर्देश सेट पर निर्भर करता है। कुछ निश्चित रूप से अवैध निर्देश हैं, जो अक्सर एक जाल का कारण बनता है। –

+0

लेकिन यह एक स्क्रिप्ट में एक वर्ण सेट से अमान्य वर्णों का उपयोग करने जैसा है, यह वास्तव में एक वाक्यविन्यास मुद्दा नहीं है। यदि आप इनपुट वर्णों के सेट को वैध मशीन कोड ऑप्स में सीमित करते हैं तो आप उन्हें किसी भी क्रम में डाल सकते हैं और आपके पास एक वैध प्रोग्राम है (जहां तक ​​भाषा का सिंटैक्स संबंधित है)। तो इस भाषा में कोई अनावश्यकता नहीं है। –

उत्तर

9

विधानसभा भाषा (सबसे संयोजन भाषाओँ, वैसे भी) नहीं है कि जैसे - वे काफी कठोर वाक्य रचना है, और अधिकांश यादृच्छिक तारों को त्रुटियों के रूप में निदान किया जाएगा।

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

उन लोगों के लिए जो इसे याद करते हैं, टीईसीओ किसी भी संभावित इनपुट को कुछ अर्थ देने के लिए प्रसिद्ध (कुख्यात?) था, इसलिए यह काफी समान था। एक दिलचस्प चुनौती यह जानना था कि क्या होगा यदि आपने अपना नाम टाइप किया है (एक उदाहरण के लिए)।

+2

पुन। TECO: नियंत्रण या मेटा को पकड़ने और Emacs में अपना नाम टाइप करने के प्रभाव की भविष्यवाणी करने में एक समान चुनौती है। पुराने स्कूल लाने के लिए –

+0

+1। धन्यवाद, यह सिर्फ उस तरह की चीज थी जिसके बारे में मैं सोच रहा था। – tel

+0

आपके पास एक TECO लिंक है? – BCS

3

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

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

+0

असल में सही है, हालांकि उदाहरण सबसे अच्छा नहीं है: शीर्षलेख केवल कंपाइलर को "मदद" करते हैं जिसमें वे सिंगल-पास-कंपाइलर्स को संभव बनाते हैं (क्योंकि आगे के संदर्भ वर्जित हैं)। – delnan

+0

@ डेलनान, मैं इसका पालन नहीं करता हूं। सी में, हेडर के बिना, कंपाइलर आपके फ़ंक्शन कॉल को बिल्कुल भी नहीं देख सकता है। सबसे अच्छा, आपको एक लिंकर त्रुटि मिल जाएगी। हेडर में अनावश्यक जानकारी इस प्रकार संकलक को प्रोग्रामर को कुछ त्रुटियों से बचाने देती है। –

+0

अग्रेषित घोषणाएं! = शीर्षलेख। अग्रेषित घोषणाएं एकल-पास कंपाइलर्स को संभव बनाती हैं। टाइपर्स जानकारी ऑब्जेक्ट फ़ाइल प्रारूप का हिस्सा नहीं होने पर हेडर अलग संकलन संभव बनाते हैं। – dan04

7

ठीक है, सी # से एक उदाहरण का उपयोग करने के लिए (क्योंकि मुझे डी पता नहीं है)। आप एक सार विधि के साथ एक वर्ग है, तो वर्ग में ही सार चिह्नित किया जाना चाहिए:

public abstract class MyClass 
{ 
    public abstract MyFunc(); 
} 

अब, यह संकलक के लिए तुच्छ हो जाएगा स्वचालित रूप से सार के रूप में चिह्नित करने के लिए MyClass (कि जिस तरह से सी ++ यह संभालती है), लेकिन सी # में, आपको इसे स्पष्ट रूप से करना होगा, ताकि आपके इरादे स्पष्ट हो जाएं।

इसी प्रकार virtual विधियों के साथ। सी ++ में, यदि बेस क्लास में आभासी घोषित किया जाता है, तो सभी व्युत्पन्न कक्षाओं में एक विधि स्वचालित रूप से वर्चुअल होती है। सी # में, विधि को स्पष्ट रूप से override चिह्नित किया जाना चाहिए, इसलिए आप जो चाहते थे उसके बारे में कोई भ्रम नहीं है।

+0

लेकिन ये उदाहरण पार्सर/कंपाइलर को अधिक अंतर्दृष्टि देने में मदद नहीं करते हैं, है ना? मेरा मतलब यह है कि यह दोनों मामलों में ठीक से जानता है कि क्या हो रहा है और ठीक उसी तरह प्रतिक्रिया दे सकता है। –

+0

कंपाइलर जानता है कि * यह * कोड का मतलब क्या है; यह नहीं जानता कि * आप * कोड का मतलब क्या है। –

+0

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

8

nglsh nclds ll XTR लीटर की srts टी बिल्कुल mk यह EZR को पढ़ा

+0

बहुत अच्छा उदाहरण :) –

+8

असल में, यह सब कुछ छेड़छाड़ करने के लिए psibolse है लेकिन fserit और lsat ltteers lseat smoe snsee पर एक wrod और raiten के। और द रिज़न फोनेटिज़िज्ड इंग्लिश हज़ेंट कोट इज़ दैट पर यह नोटोरियाली मोर डिस्काल्ट टू राइड राधाथ धा विज़ुअल क्यूज यूव धा कुरेंट ऑर्थोग्राफी। –

23

मैं इस बात पर ध्यान केंद्रित करूंगा कि क्यों (मुझे लगता है) वाल्थर ब्राइट सोचता है कि पुनर्वित्त अच्छा है। चलिए एक उदाहरण के रूप में एक्सएमएल लेते हैं। यह टुकड़ा:

<foo>...</foo> 

redunancy है, बंद टैग redunant है अगर हम एस-भाव के बजाय का उपयोग करें:

(foo ...) 

यह कम है, और प्रोग्रामर अधिक बार आवश्यक से foo टाइप करने के लिए नहीं है उस स्निपेट को समझने के लिए। कम redunancy। लेकिन यह, कमियां है के रूप में http://www.prescod.net/xml/sexprs.html से एक उदाहरण दिखाता है:

(document author: "[email protected]" 
    (para "This is a paragraph " (footnote "(better than the one under there)" ".") 
    (para "Ha! I made you say \"underwear\".")) 


<document author="[email protected]"> 
<para>This is a paragraph <footnote>(just a little one).</para> 
<para>Ha! I made you say "underwear".</para> 
</document> 

दोनों में, अंत टैग/फुटनोट के लिए एक बंद कोष्ठक याद आ रही है। जैसे ही पार्सर </para> देखता है, एक्सएमएल संस्करण सादा अमान्य है। एस-एक्सप्रेशन एक दस्तावेज़ के अंत तक केवल अमान्य है, और केवल तभी यदि आपके पास कहीं और अनियंत्रित बंद पैर नहीं है। तो कुछ मामलों में, पुनर्मिलन मदद करता है कि लेखक का अर्थ क्या है (और इसे व्यक्त करने के तरीके में त्रुटियों को इंगित करें)।

+0

बहुत पूर्ण उत्तर के लिए धन्यवाद। क्या आप कहीं भी जानते हैं कि मैं इस तरह की चीज को वास्तव में कैसे कार्यान्वित करता हूं इस पर एक और तकनीकी/सैद्धांतिक चर्चा की तलाश शुरू कर सकता हूं? मुझे लगता है कि यह पता लगाना बहुत आसान है कि XML पार्सर को की अपेक्षा करते समय त्रुटि को कैसे पहचानता है, लेकिन आम तौर पर, पार्सर्स कॉलम, पंक्ति और त्रुटि के प्रकार को कैसे खोजते हैं? क्या "डमीज़ के लिए त्रुटि-हैंडलिंग की सामान्य सिद्धांत" की तरह है? – tel

+0

जहां तक ​​पता है कि "त्रुटि-हैंडलिंग की सामान्य सिद्धांत" बिल्कुल नहीं है। ऐसा लगता है कि यह एक कला का अधिक है। – BCS

+0

मैं बीसीएस से सहमत हूं, मुझे नहीं लगता कि ऐसी कोई चीज है। लेकिन मुझे लगता है कि (कुछ) सामान्य कंपाइलर संसाधन (जिनमें से अधिकतर फ्रंटेंड i.e. पार्सर पर अधिक ध्यान केंद्रित करते हैं) में ऐसा करने का * एक * तरीका शामिल है। – delnan

2

मुझे लगता है कि रिडंडेंसी का एक बेहतर उदाहरण int a[10] = जैसा कुछ है। इस बिंदु पर, संकलक जानता है कि आगे क्या आना चाहिए, एक int सरणी प्रारंभकर्ता, और यदि कोई निम्न सरणी प्रारंभकर्ता नहीं है तो उचित त्रुटि संदेश के साथ आ सकता है। यदि भाषा वाक्यविन्यास ने कहा कि कुछ भी int a[10] का पालन कर सकता है, तो संकलक के लिए समस्याओं को समझने के लिए यह बहुत कठिन होगा।

4

मुझे लगता है कि वह भाषा में वाक्य रचनात्मक संरचनाओं के बारे में बात कर रहा था और उनका व्याख्या कैसे किया जा सकता है। उदाहरण के तौर पर, नम्र "अगर" कथन पर विचार करें, जो कई भाषाओं में प्रदान की जाती है।

बैश (खोल स्क्रिप्ट) में, यह इस तरह दिखता है:

if [ cond ]; then 
    stmts; 
elif [ other_cond ]; then 
    other_stmts; 
else 
    other_other_stmts; 
fi 
सी में

(w/एकल statments, कोई घुंघराले ब्रेसिज़):

if (cond) 
    stmt; 
else if (other_cond) 
    other_stmt; 
else 
    other_other_stmt; 

आप देख सकते हैं कि पार्टी में, सी में मौजूद कथन के मुकाबले बहुत अधिक वाक्य रचनात्मक संरचना है। असल में, बैश में सभी नियंत्रण संरचनाओं में अपने स्वयं के बंद करने वाले डिलीमीटर (जैसे if/then/fi, for/do/done, case/in/esac, ...) हैं, जबकि सी में घुंघराले ब्रेस है हर जगह इस्तेमाल किया। ये अद्वितीय डिलीमीटर कोड के अर्थ को असंबद्ध करते हैं, और इस प्रकार संदर्भ प्रदान करते हैं जिससे दुभाषिया/कंपाइलर त्रुटि की स्थिति का निदान कर सकता है और उन्हें उपयोगकर्ता को रिपोर्ट कर सकता है।

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

+3

इन सभी डिज़ाइन ट्रेडऑफ के बारे में सोचने के लिए यह बहुत साफ है जो इन सभी भाषाओं के लेआउट और सिंटैक्स को रेखांकित करता है। यह वास्तव में आपको एहसास देता है कि किसी भाषा के पहलुओं को लिखना, उदाहरण के लिए, वाक्यविन्यास की पसंद, मनमानी या केवल "शैली" का एक कार्य कुछ हद तक बेवकूफ है। इन सभी विकल्पों को जानबूझकर बनाया गया था और (मुझे कम से कम अच्छी भाषाओं के मामले में अनुमान लगाया जाता है) तर्कसंगत रूप से। यह विचार है कि इन सभी विरोधाभासी लक्ष्यों के बीच ट्रेडऑफ भी यह समझाने में मदद करता है कि वहाँ 1000+ भाषा की तरह क्यों है :) – tel

+1

भी 'while; do; done' है। मुझे नहीं लगता कि यह वास्तव में डिजाइन द्वारा भी है; पारंपरिक sh का सिर्फ एक आर्टिफैक्ट। और फिर, ज़ाहिर है, जावा है, अविश्वसनीय रूप से वर्बोज़ पहचानकर्ताओं और ब्रेसिज़ के मुट्ठी भर के साथ। –

+0

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

0

तो वर्णों का कोई भी यादृच्छिक अनुक्रम एक वैध प्रोग्राम है।

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

संबंधित मुद्दे