संदर्भ संवेदनशील व्याकरण और प्रकार


25

1) क्या, यदि कोई हो, स्थैतिक टाइपिंग और औपचारिक व्याकरण के बीच संबंध है?

2) विशेष रूप से, क्या यह संभव है कि एक रैखिक बाउंड ऑटोमेटन के लिए यह जांचना संभव है कि क्या, सी + + या एसएमएल कार्यक्रम अच्छी तरह से तैयार है? एक नेस्टेड स्टैक ऑटोमेटन?

3) क्या औपचारिक व्याकरण की शर्तों में स्थिर टाइपिंग नियमों को व्यक्त करने का एक स्वाभाविक तरीका है?

जवाबों:


20

यह जाँचने के लिए कि क्या C ++ प्रोग्राम्स, और LBA के लिए यह संभव नहीं है कि SML प्रोग्राम अच्छी तरह से टाइप किए गए हैं या नहीं, रैखिक बाउंड ऑटोमेटा के लिए यह संभव नहीं है। C ++ में ट्यूरिंग-पूर्ण प्रकार की प्रणाली है, क्योंकि आप टेम्पलेट मेटापोग्राम के रूप में मनमाने कार्यक्रमों को कोड कर सकते हैं।

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

fun delta x = (x, x)        (* this has type 'a -> ('a * 'a), so its return value
                               has a type double the size of its argument *)

fun f1 x = delta (delta x)  (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)        
fun f3 x = f2 (f2 x)        (* This function has a HUGE type *)

सी या पास्कल जैसे सरल प्रकार के सिस्टम के लिए, मेरा मानना ​​है कि एलबीए के लिए इसकी जांच करना संभव है।

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

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

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


4

जहाँ तक मुझे पता है कि प्रकार की शुद्धता दिलचस्प मामलों के लिए अपरिहार्य है, तो स्पष्ट रूप से औपचारिक व्याकरण हर प्रकार की प्रणाली पर कब्जा नहीं कर सकता है जिसके बारे में आप सोच सकते हैं।

मुझे पता है कि प्रमुख संकलक जनरेटर नियमों के लिए मनमाने ढंग से विधेय की अनुमति देते हैं जो एक नियम को निष्पादित होने से रोकते हैं यदि विधेय का मूल्यांकन नहीं करता है true, जैसे { type(e1) == type(e2) } (expression e1) '+' (expression e2)। इस अवधारणा को आसानी से औपचारिक रूप दिया जा सकता है; अनुमत प्रतिबंधों पर उपयुक्त प्रतिबंध तब एलबीए द्वारा निर्णायकता प्राप्त कर सकते हैं।

इस तरह के विधेय का निर्णय करना रनटाइम के संबंध में कम से कम कठिन है, इसलिए मुझे लगता है कि लोग चरण में व्यवहार्यता की जांच करने के लिए चरण में जानकारी एकत्र करते हुए, पुनरावृत्त पार्सिंग करते हैं । उदाहरण के लिए, आप एक पास में एक नेम टेबल बना सकते हैं और फिर जाँच सकते हैं कि उपयोग किए गए सभी चर (दृष्टि) एक दूसरे रन में घोषित किए गए हैं।k + kk+1

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