कार्यान्वयन प्रकार


91

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

तो मैं अपनी खुद की एक कार्यात्मक शैली की भाषा का निर्माण शुरू करने वाला हूं, और प्रकार का अनुमान उन चीजों में से एक है जिन्हें मैं लागू करना चाहता हूं। मैं समझता हूं कि यह एक बड़ा विषय है, और मैं कुछ ऐसा बनाने की कोशिश नहीं कर रहा हूं जो पहले नहीं किया गया हो, बस मूल अनुमान ...

किसी भी बिंदु पर क्या पढ़ना है जो मुझे इससे मदद करेगा? अधिमानतः अधिक सैद्धांतिक श्रेणी सिद्धांत / प्रकार सिद्धांत ग्रंथों के विपरीत कुछ अधिक व्यावहारिक / व्यावहारिक। यदि डेटा संरचनाओं / एल्गोरिदम के साथ वहाँ एक कार्यान्वयन चर्चा पाठ है, तो यह सिर्फ प्यारा होगा।


1
वास्तव में सवाल मैं देख रहा था, कुछ महान जवाब के साथ!
पॉल हॉलिंगवर्थ

जवाबों:


90

मुझे बढ़ती कठिनाई के क्रम में, निम्न प्रकार की समझ के लिए मददगार निम्नलिखित संसाधन मिले:

  1. स्वतंत्र रूप से उपलब्ध पुस्तक PLAI , प्रोग्रामिंग लैंग्वेजेस: एप्लिकेशन और इंटरप्रिटेशन के अध्याय 30 (टाइप इनरशन ) , स्केचेस-आधारित प्रकार के निष्कर्ष।
  2. ग्रीष्मकालीन पाठ्यक्रम अमूर्त मूल्यों के रूप में प्रकारों की व्याख्या करते हुए सुरुचिपूर्ण मूल्यांकनकर्ता, टाइप चेकर्स, टाइप रीकंस्ट्रक्टर्स और हेंसेरर्स का उपयोग करते हुए हास्केल को मेटलंगेज के रूप में प्रस्तुत करता है।
  3. EOPL पुस्तक के अध्याय 7 (प्रकार) , प्रोग्रामिंग भाषाओं की अनिवार्यता
  4. अध्याय 22 के (प्रकार पुनर्निर्माण) पुस्तक TAPL , प्रकार और प्रोग्रामिंग भाषाएं , और इसी OCaml कार्यान्वयन टोह और fullrecon
  5. नई किताब DCPL के चैप्टर 13 (टाइप रीकंस्ट्रक्शन) , प्रोग्रामिंग लैंग्वेजेज में डिजाइन कॉन्सेप्ट
  6. शैक्षणिक पत्रों का चयन
  7. क्लोजर कंपाइलर का TypeInference टाइप करने के लिए डेटा प्रवाह विश्लेषण दृष्टिकोण का एक उदाहरण है, जो कि गतिशील भाषाओं के लिए बेहतर है जो कि Hindler Milner दृष्टिकोण है।

हालाँकि, सीखने का सबसे अच्छा तरीका यह है कि, मैं दृढ़ता से एक प्रोग्रामिंग भाषा पाठ्यक्रम के होमवर्क असाइनमेंट के माध्यम से काम करके एक खिलौना कार्यात्मक भाषा के लिए प्रकार की खोज को लागू करने का सुझाव देता हूं।

मैं एमएल में इन दो सुलभ होमवर्क की सिफारिश करता हूं, जिसे आप दोनों एक दिन से भी कम समय में पूरा कर सकते हैं:

  1. पीसीएफ दुभाषिया ( एक समाधान) ) गर्म करने के लिए।
  2. हिंडले-मिलनर प्रकार के आविष्कार के लिए एल्गोरिथ्म डब्ल्यू को लागू करने के लिए पीसीएफ प्रकार का आविष्कार ( एक समाधान )।

ये कार्य अधिक उन्नत पाठ्यक्रम से हैं:

  1. मिनीएमएल को लागू करना

  2. बहुरूपी, अस्तित्ववादी, पुनरावर्ती प्रकार (पीडीएफ)

  3. द्वि-दिशात्मक टंकण (पीडीएफ)

  4. सबटाइपिंग और ऑब्जेक्ट्स (पीडीएफ)


2
क्या यह सिर्फ मेरे लिए है, या PLAI वर्णन काफी हद तक गलत / अपूर्ण है? व्याख्यान इसमें थोड़ा और जोड़ता है, लेकिन फिर भी प्रतीत होता है कि यह काम करने के लिए पर्याप्त नहीं है।
री मियासाका

मुझे PLAI पुस्तक के 2012 संस्करण में एल्गोरिथ्म भी नहीं मिला। बाधा सूची के लिए कोई विकल्प नहीं हैं। इसके बजाय, मैंने PLAI पुस्तक के 2003-7 संस्करण में टाइप इंफ़ॉर्मेशन एल्गोरिथ्म को लागू किया, यह बेहतर काम करने लगता है, और साथ ही साथ बहुरूपता को भी स्केल करता है।
हेयकेल

28

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

http://www.plai.org/

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

बिना किसी भाषा के let, आप उपर्युक्त बाधाओं को आँख बंद करके प्रतिस्थापन द्वारा हल कर सकते हैं। उदाहरण के लिए:

(if (= 1 2) 
    1 
    2)

यहाँ, हम यह कह सकते हैं कि यदि कथन की स्थिति बूलियन होनी चाहिए, और यह कि यदि कथन का प्रकार उसके प्रकार thenऔर elseखंड के समान है। चूंकि हम जानते हैं 1और2 संख्याएँ हैं, प्रतिस्थापन के द्वारा, हम जानते हैं कि ifकथन एक संख्या है।

जहां चीजें खराब हो जाती हैं, और जो कुछ समय के लिए मुझे समझ नहीं आ रहा था, वह चल रहा है:

(let ((id (lambda (x) x)))
    (id id))

यहाँ, हम idएक फ़ंक्शन के लिए बाध्य हैं जो आपने जो भी पास किया है उसे वापस लौटाता है, अन्यथा पहचान फ़ंक्शन के रूप में जाना जाता है। समस्या यह है कि फ़ंक्शन का पैरामीटर किस प्रकार के xप्रत्येक उपयोग पर अलग है id। दूसरा idप्रकार का एक फ़ंक्शन है a -> a, जहां aकुछ भी हो सकता है। पहला प्रकार का है(a -> a) -> (a -> a) । इसे लेट-पोलिमोर्फ़िज्म के रूप में जाना जाता है। एक विशेष क्रम में बाधाओं को हल करने के लिए महत्वपूर्ण है: पहले परिभाषा के लिए बाधाओं को हल करें id। यह होगा a -> a। फिर ताजा, idप्रत्येक स्थान के लिए बाधाओं के प्रकार की अलग-अलग प्रतियों को प्रतिस्थापित किया जा सकता idहै, उदाहरण के लिएa2 -> a2 और a3 -> a3

कि ऑनलाइन संसाधनों में आसानी से समझाया नहीं गया था। वे एल्गोरिथ्म डब्ल्यू या एम का उल्लेख करेंगे, लेकिन यह नहीं कि वे बाधाओं को हल करने के मामले में कैसे काम करते हैं, या यह लेट-पॉलीमॉर्फिज्म पर रोक क्यों नहीं लगाता है: उनमें से प्रत्येक एल्गोरिदम बाधाओं को हल करने पर एक आदेश लागू करता है।

मुझे यह संसाधन अल्गोरिदम डब्ल्यू, एम, और बाधा निर्माण की सामान्य अवधारणा और सभी को एक साथ हल करने के लिए बेहद मददगार लगा। यह थोड़ा घना है, लेकिन बहुत से बेहतर है:

http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf

कई अन्य कागजात भी अच्छे हैं:

http://people.cs.uu.nl/bastiaan/papers.html

मुझे उम्मीद है कि यह कुछ हद तक अजीब दुनिया को स्पष्ट करने में मदद करता है।


7

कार्यात्मक भाषाओं के लिए हिंडले मिलनर के अलावा, गतिशील भाषा के लिए टाइपिंग के लिए एक और लोकप्रिय तरीका है abstract interpretation

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

Pysonar2 पायथन के लिए अमूर्त व्याख्या का एक सुरुचिपूर्ण कार्यान्वयन है। इसका उपयोग Google द्वारा पायथन परियोजनाओं का विश्लेषण करने के लिए किया जाता है। मूल रूप से यह visitor patternप्रासंगिक एएसटी नोड के लिए मूल्यांकन कॉल को भेजने के लिए उपयोग करता है। विज़िटर फ़ंक्शन transform स्वीकार करता contextहै जिसमें वर्तमान नोड का मूल्यांकन किया जाएगा, और वर्तमान नोड का प्रकार लौटाएगा।



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