अनबॉक्ड प्रकारों पर उच्च-रैंक बहुरूपता


10

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

मुझे लगता है कि मैं समझता हूं कि इन प्रकारों को कैसे जांचना है , लेकिन मुझे यकीन नहीं है कि संकलन करते समय क्या करना है। वर्तमान में, मैं पॉलिफ़ोरिक परिभाषाओं को संकलित करके संकलन करता हूं, बहुत कुछ सी ++ टेम्पलेट की तरह, ताकि वे अनबॉक्स वैल्यू के साथ काम कर सकें। जैसे, की एक परिभाषा दी गई है f<T>, अगर कार्यक्रम केवल f<Int32>और f<Char>फिर, केवल उन्हीं विशिष्टताओं को संकलित कार्यक्रम में दिखाई देता है। (मैं अभी के लिए पूरे कार्यक्रम संकलन मान रहा हूँ।)

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

मेरा पहला विचार किसी तरह रैंक -1 एन पॉलीमॉर्फिज्म को रैंक 1 के रूप में एन्कोड करना था , लेकिन मुझे विश्वास नहीं है कि यह सामान्य रूप से संभव है क्योंकि रचनात्मक तर्क में एक फॉर्मूला जरूरी नहीं कि एक सामान्य सामान्य रूप हो।


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

@ fread2281: मैं वास्तव में भाषा के पुराने संस्करण में ऐसा कुछ करता था। मैं वर्तमान में गैर-योग प्रकारों के लिए टैग नहीं बनाता, और कोई GC नहीं है। मुझे लगता है कि यह नील के दृष्टिकोण के साथ भी संगत है।
जॉन पूर्डी

जवाबों:


6

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

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

Kindsκ::=nType constructorsA::=a:κ.A|α|A×B|A+B|AB|refA|Pad(k)|μα:κ.A

यहां, उच्च स्तर का विचार यह है कि एक प्रकार का प्रकार आपको बताता है कि स्मृति में किसी वस्तु को बिछाने के लिए कितने शब्द लगते हैं। किसी भी आकार के लिए, उस विशेष आकार के सभी प्रकारों पर बहुरूपी होना आसान है। चूंकि हर प्रकार के - यहां तक ​​कि बहुरूपी भी - अभी भी एक ज्ञात आकार है, संकलन सी की तुलना में कोई कठिन नहीं है।

दयालु नियम इस अंग्रेजी को गणित में बदल देते हैं, और कुछ इस तरह दिखना चाहिए:

α:nΓΓα:nΓ,α:nA:mΓα:n.A:m
ΓA:nΓB:mΓA×B:n+mΓA:nΓB:nΓA+B:n+1
ΓA:mΓB:nΓAB:1ΓA:nΓrefA:1
ΓPad(k):kΓ,α:nA:nΓμα:n.A:n

तो फोर्ल क्वांटिफायर के लिए जरूरी है कि आप जिस तरह से ओवर कर रहे हैं। इसी तरह, को बाँधना अनबॉक्ड जोड़ी प्रकार है, जो स्मृति में से बगल में तरह रहता है (C संरचना प्रकार की तरह)। असंतुष्ट संघ एक ही आकार के दो मान लेते हैं, और फिर एक विभेदक टैग के लिए एक शब्द जोड़ते हैं। फ़ंक्शंस क्लोजर होते हैं, जिन्हें सूचक द्वारा पर्यावरण और कोड के रिकॉर्ड के रूप में सामान्य रूप से दर्शाया जाता है।A×BAB

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

पुनरावर्ती प्रकारों में मानक गठन नियम होता है, लेकिन ध्यान दें कि पुनरावर्ती घटनाओं का आकार एक ही होना चाहिए, जिसका अर्थ है कि आपको आमतौर पर किंडरिंग वर्क आउट करने के लिए एक पॉइंटर में चिपकना होगा। उदाहरण के लिए, सूची डेटाटाइप का प्रतिनिधित्व किया जा सकता है

μα:1.ref(Pad(2)+int×α)

तो यह एक खाली सूची मूल्य, या किसी अन्य लिंक की गई सूची के लिए एक इंट और पॉइंटर की एक जोड़ी की ओर इशारा करता है।

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


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

1

यह एक "सैद्धांतिक कंप्यूटर विज्ञान" समस्या की तुलना में एक संकलन समस्या के करीब लगता है, इसलिए आप शायद कहीं और पूछ रहे हैं।

सामान्य मामले में, वास्तव में, मुझे लगता है कि एक बॉक्सिंग प्रतिनिधित्व का उपयोग करने के अलावा कोई अन्य समाधान नहीं है। लेकिन मैं यह भी उम्मीद करता हूं कि व्यवहार में आपकी स्थिति की बारीकियों के आधार पर कई अलग-अलग वैकल्पिक विकल्प हैं।

उदा। अनबॉक्सिड तर्कों का निम्न-स्तरीय प्रतिनिधित्व आमतौर पर बहुत कम विकल्पों में वर्गीकृत किया जा सकता है, जैसे पूर्णांक-या-समान, फ्लोटिंग-पॉइंट या पॉइंटर। तो एक फ़ंक्शन के लिए f<T>, शायद आपको वास्तव में केवल 3 अलग-अलग अनबॉक्स किए गए कार्यान्वयन उत्पन्न करने की आवश्यकता है और आप उन 3 कार्यों के एक समूह के रूप में बहुरूपिक का प्रतिनिधित्व कर सकते हैं, इसलिए T से Int32 तक त्वरित रूप से केवल tuple के पहले तत्व का चयन कर रहा है, ...


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

4
ओपी के सवाल में पूरी तरह से वैध टीसीएस समस्याएं हैं, जैसे कि दामा-हिंडले-मिलनर को दूसरे रैंक प्रकारों के साथ विस्तारित करने पर किस तरह का अनुमान लगाया जाता है। सामान्य रैंक -2 में बहुरूपता में पर्णपाती टाइप-इनफेरेंस होता है लेकिन रैंक k> 2 टाइप-इनफैक्शन के लिए अनिर्दिष्ट है। क्या दमास-हिंडले-मिलनर प्रतिबंध इसे बदलता है, मुझे नहीं पता। अंत में बस के बारे में सब कुछ आधुनिक संकलक टीसीएस का हिस्सा होना चाहिए, लेकिन आमतौर पर ऐसा नहीं है क्योंकि संकलक सिद्धांतकारों से आगे हैं।
मार्टिन बर्गर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.