क्या किसी मॉड्यूलर कंपाइलर में पोटीयर और गौथियर के बहुरूपी विक्षेपण का उपयोग किया गया है?


15

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

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

किसी ने भी यह किया है, और मुझे इस विचार का उपयोग करके एक संकलक की ओर इशारा करें? (खिलौना संकलक ठीक हैं, और वास्तव में पसंदीदा हैं।)

जवाबों:


6

एक दृष्टिकोण द्वारा वर्णित है

जॉर्जियोस फोरटॉनिस और निकोलास एस। पापसॉप्रो। 2013. एक अलग संकलक में अलग संकलन का समर्थन करना। 2013 स्लेट

जैसा कि @gasche उल्लेख है:

समस्या पर एक अलग दृष्टिकोण इस बात पर विचार करना होगा कि प्रत्येक मॉड्यूल अपने "डिफंक्विलाइज्ड फ़ंक्शंस" प्रकार और डिस्पैचर / हैंडलर को परिभाषित कर सकता है।

nमैं0<मैं<nn-मैं


4

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

क्या आप यहाँ पर जो अर्थ रखते हैं उस पर थोड़ा और विस्तार कर सकते हैं? मुझे समझ नहीं आ रहा है कि आधार मामले को कैसे जोड़ा जा सकता है (क्या यह प्रेषण के पैटर्न-मिलान के लिए डिस्पैचिंग के लिए होगा, या दोनों?) आपके द्वारा बताए गए तरीके से मॉड्यूलरिटी में मदद करता है; वैसे, आप "मॉड्यूल द्वारा मॉड्यूल" आधार से बिल्कुल मतलब क्यों हैं?

मैं एक "बेस केस" का उपयोग कर सकता हूं, किसी दिए गए मॉड्यूल / प्रोग्राम के अंदर, के लिए चयनात्मक विक्षेपण के लिए: आप अपने संशोधित फ़ंक्शन प्रकार के लिए एक अतिरिक्त निर्माता होगा जो एक टैग नहीं है, लेकिन बस सभी 'a -> 'bफ़ंक्शन एम्बेड करता है, ताकि एक फ़ंक्शन पैकिंग हो सके इस निर्माता में, इसे एक संशोधित टैग देने के बजाय, इसके विघटन को रोका जाएगा।

समस्या पर एक अलग दृष्टिकोण पर विचार करना होगा कि प्रत्येक मॉड्यूल अपने स्वयं के "डिफंक्विलाइज्ड फ़ंक्शन" प्रकार और डिस्पैचर / हैंडलर को परिभाषित कर सकता है। मॉड्यूल से कार्य M1प्रकार होगाM1.arrow और उपयोग किया जा सकता है M1.apply, आदि। जबकि यह फ़ंक्शंस के पहले-क्रम के उपयोग के लिए अच्छी तरह से काम करता है, मैं यह अच्छी तरह से नहीं देखता कि आप इसे उच्च-ऑर्डर फ़ंक्शन तक कैसे बढ़ा सकते हैं (जिसे नहीं करना चाहिए पता है कि उनके कार्यात्मक तर्क कहां से आते हैं): यदि आप किसी फ़ंक्शन को इसके डिस्पैचर के साथ बंडल करते हैं, तो आप अप्रत्यक्ष कॉल के दायरे में फिर से प्रवेश कर रहे हैं।

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

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