टाइप इरेज़र इज़ गुड
तथ्यों से चिपके रहते हैं
इस प्रकार के बहुत से उत्तर ट्विटर उपयोगकर्ता के साथ बहुत अधिक चिंतित हैं। यह संदेशों पर ध्यान केंद्रित रखने में मददगार है न कि संदेशवाहक। इस प्रकार अभी तक उल्लिखित अंशों के साथ एक सुसंगत संदेश है:
जावा उपयोगकर्ता टाइप इरेज़र के बारे में शिकायत करते हैं तो यह मज़ेदार होता है, जो कि जावा की सही बात है, जबकि सभी चीजों को अनदेखा करना गलत है।
मुझे भारी लाभ (जैसे परोपकार) और शून्य लागत (कथित लागत कल्पना की सीमा है) मिलती है।
new T एक टूटा हुआ प्रोग्राम है। यह "सभी प्रस्ताव सत्य हैं" दावे के लिए समसामयिक है। मैं इसमें बड़ा नहीं हूं।
एक लक्ष्य: उचित कार्यक्रम
ये ट्वीट एक ऐसे परिप्रेक्ष्य को दर्शाते हैं जो इस बात में दिलचस्पी नहीं रखता है कि क्या हम मशीन को कुछ कर सकते हैं , लेकिन इससे अधिक कि क्या हम यह तर्क दे सकते हैं कि मशीन कुछ ऐसा करेगी जो हम वास्तव में चाहते हैं। अच्छा तर्क एक प्रमाण है। सबूत औपचारिक संकेतन या कुछ कम औपचारिक में निर्दिष्ट किए जा सकते हैं। विनिर्देश भाषा के बावजूद, उन्हें स्पष्ट और कठोर होना चाहिए। अनौपचारिक विशिष्टताओं को सही ढंग से संरचना करना असंभव नहीं है, लेकिन अक्सर व्यावहारिक प्रोग्रामिंग में दोषपूर्ण हैं। अनौपचारिक तर्क के साथ हमारे पास जो समस्याएँ हैं उनके लिए हम स्वचालित और खोजपूर्ण परीक्षणों जैसे उपचारों को समाप्त करते हैं। यह कहना नहीं है कि परीक्षण आंतरिक रूप से एक बुरा विचार है, लेकिन उद्धृत ट्विटर उपयोगकर्ता सुझाव दे रहा है कि बहुत बेहतर तरीका है।
इसलिए हमारा लक्ष्य सही कार्यक्रम है जिसे हम स्पष्ट रूप से और कठोरता से इस तरह से समझ सकते हैं कि मशीन वास्तव में कार्यक्रम को कैसे निष्पादित करेगी। हालांकि, यह एकमात्र लक्ष्य नहीं है। हम यह भी चाहते हैं कि हमारे तर्क में अभिव्यक्ति की डिग्री हो। उदाहरण के लिए, केवल इतना ही है कि हम प्रस्ताव तर्क के साथ व्यक्त कर सकते हैं। पहले-क्रम के तर्क जैसे कुछ से सार्वभौमिक (∀) और अस्तित्वगत (quant) मात्रा का ठहराव होना अच्छा है।
तर्क के लिए टाइप सिस्टम का उपयोग करना
इन लक्ष्यों को बहुत अच्छी तरह से टाइप सिस्टम द्वारा संबोधित किया जा सकता है। करी-हावर्ड पत्राचार के कारण यह विशेष रूप से स्पष्ट है । इस पत्राचार को अक्सर निम्नलिखित सादृश्य के साथ व्यक्त किया जाता है: प्रकार कार्यक्रमों के होते हैं जैसे प्रमेय प्रमाण होते हैं।
यह पत्राचार कुछ गहरा है। हम तार्किक अभिव्यक्तियाँ ले सकते हैं, और उन्हें पत्राचार के माध्यम से प्रकारों में अनुवाद कर सकते हैं। फिर यदि हमारे पास एक ही प्रकार के हस्ताक्षर के साथ एक कार्यक्रम है जो संकलित करता है, तो हमने साबित कर दिया है कि तार्किक अभिव्यक्ति सार्वभौमिक रूप से सच है (एक तनातनी)। ऐसा इसलिए है क्योंकि पत्राचार दो तरफा है। प्रकार / कार्यक्रम और प्रमेय / प्रूफ दुनिया के बीच परिवर्तन यांत्रिक हैं, और कई मामलों में स्वचालित हो सकते हैं।
करी-हावर्ड एक कार्यक्रम के लिए विनिर्देशों के साथ क्या करना चाहते हैं में अच्छी तरह से निभाता है।
क्या जावा में टाइप सिस्टम उपयोगी हैं?
यहां तक कि करी-हावर्ड की समझ के साथ, कुछ लोगों को एक प्रकार की प्रणाली के मूल्य को खारिज करना आसान लगता है, जब यह
- के साथ काम करना बेहद कठिन है
- सीमित अभिव्यक्ति के साथ एक तर्क के लिए (करी-हावर्ड के माध्यम से) मेल खाती है
- टूट गया है (जो "कमजोर" या "मजबूत" के रूप में सिस्टम के लक्षण वर्णन के लिए जाता है)।
पहले बिंदु के बारे में, शायद IDEs जावा के प्रकार की प्रणाली को आसान बनाते हैं (जो कि अत्यधिक व्यक्तिपरक है)।
दूसरे बिंदु के संबंध में, जावा लगभग होता है पहले-क्रम के तर्क के अनुरूप । जेनरिक सार्वभौमिक परिमाणीकरण के बराबर प्रणाली का उपयोग करते हैं। दुर्भाग्य से, वाइल्डकार्ड केवल अस्तित्वगत मात्रा का एक छोटा सा हिस्सा देते हैं। लेकिन सार्वभौमिक मात्रा का ठहराव बहुत अच्छी शुरुआत है। यह कहने में सक्षम होना अच्छा है कि सभी संभावित सूचियों के List<A>
लिए सार्वभौमिक रूप से काम करने के लिए फ़ंक्शन क्योंकि ए पूरी तरह से असंबंधित है। इसके कारण ट्विटर उपयोगकर्ता "समरूपता" के संबंध में बात कर रहा है।
परोपकार के बारे में अक्सर उद्धृत पेपर फिलिप वाडलर की प्रमेय है! । इस पत्र के बारे में जो दिलचस्प है वह यह है कि केवल एक प्रकार के हस्ताक्षर से, हम कुछ बहुत ही दिलचस्प आक्रमणकारियों को साबित कर सकते हैं। अगर हम इन आक्रमणकारियों के लिए स्वचालित परीक्षण लिखेंगे तो हम अपना बहुत समय बर्बाद करेंगे। उदाहरण के लिए, के लिएList<A>
अकेले हस्ताक्षर के लिएflatten
<A> List<A> flatten(List<List<A>> nestedLists);
हम इसका कारण बन सकते हैं
flatten(nestedList.map(l -> l.map(any_function)))
≡ flatten(nestList).map(any_function)
यह एक सरल उदाहरण है, और आप शायद इसके बारे में अनौपचारिक रूप से कारण कर सकते हैं, लेकिन यह भी अच्छा है जब हमें इस तरह के सबूत औपचारिक रूप से टाइप सिस्टम से मुफ्त में मिलते हैं और संकलक द्वारा जांच की जाती है।
न मिटाने से गालियां पड़ सकती हैं
भाषा के कार्यान्वयन के दृष्टिकोण से, जावा के जेनेरिक (जो सार्वभौमिक प्रकार के अनुरूप हैं) हमारे कार्यक्रम क्या करते हैं, इसके बारे में प्रमाण प्राप्त करने के लिए उपयोग की जाने वाली पारमार्थिकता में बहुत भारी भूमिका निभाते हैं। यह बताई गई तीसरी समस्या के लिए हो जाता है। सबूत और शुद्धता के इन सभी लाभों के लिए दोषों के बिना कार्यान्वित ध्वनि प्रकार की प्रणाली की आवश्यकता होती है। जावा में निश्चित रूप से कुछ भाषा विशेषताएं हैं जो हमें हमारे तर्क को चकनाचूर करने की अनुमति देती हैं। इनमें शामिल हैं, लेकिन इन तक सीमित नहीं हैं:
- एक बाहरी प्रणाली के साथ दुष्प्रभाव
- प्रतिबिंब
गैर-मिटाया गया जेनेरिक कई तरीकों से संबंधित है। बिना मिटाए रनटाइम की जानकारी है जो कि कार्यान्वयन के साथ होती है जिसे हम अपने एल्गोरिदम को डिजाइन करने के लिए उपयोग कर सकते हैं। इसका मतलब यह है कि सांख्यिकीय रूप से, जब हम कार्यक्रमों के बारे में तर्क देते हैं, तो हमारे पास पूरी तस्वीर नहीं होती है। परावर्तन गंभीर रूप से किसी भी प्रमाण की शुद्धता की धमकी देता है जो हम सांख्यिकीय रूप से करते हैं। यह कोई संयोग प्रतिबिंब नहीं है जो कई प्रकार के पेचीदा दोषों की ओर ले जाता है।
तो ऐसे कौन से तरीके हैं जो गैर-मिटे हुए जेनरिक "उपयोगी" हो सकते हैं? आइए ट्वीट में वर्णित उपयोग पर विचार करें:
<T> T broken { return new T(); }
यदि T के पास कोई arg निर्माता नहीं है तो क्या होगा? कुछ भाषाओं में आपको जो मिलता है वह शून्य है। या शायद आप अशक्त मूल्य को छोड़ देते हैं और एक अपवाद को बढ़ाने के लिए सीधे जाते हैं (जो कि शून्य मान वैसे भी नेतृत्व करते हैं)। क्योंकि हमारी भाषा ट्यूरिंग पूर्ण है, इस कारण से यह असंभव है कि किन कॉलों broken
में "सुरक्षित" प्रकार शामिल होंगे जिनमें कोई भी अर्ग निर्माणकर्ता नहीं होगा और जो नहीं होंगे। हमने यह निश्चितता खो दी है कि हमारा कार्यक्रम सार्वभौमिक रूप से काम करता है।
मिटा देने का अर्थ है कि हमने तर्क किया है (ताकि मिटा दें)
इसलिए अगर हम अपने कार्यक्रमों के बारे में तर्क करना चाहते हैं, तो हमें दृढ़ता से सलाह दी जाती है कि हम उन भाषा विशेषताओं को न लें, जो हमारे तर्क को धमकी देती हैं। एक बार जब हम ऐसा कर लेते हैं, तो फिर रनटाइम के प्रकार क्यों नहीं छोड़ते? उनकी जरूरत नहीं है। हम इस संतुष्टि के साथ कुछ दक्षता और सरलता प्राप्त कर सकते हैं कि कोई भी जाति विफल नहीं होगी या यह तरीका आह्वान पर गायब हो सकता है।
मिटा देने से तर्क को बढ़ावा मिलता है।