2011-09-15 12 views
6

एफ # 3.0 type providers जोड़ा गया है।कौन सी भाषा मुहावरे/प्रतिमान/विशेषताएं "प्रकार प्रदाताओं" के लिए समर्थन जोड़ने में मुश्किल बनाती हैं?

मुझे आश्चर्य है कि सीएलआर जैसे सीएलआर पर चल रही अन्य भाषाओं में यह भाषा सुविधा जोड़ना संभव है या यदि यह सुविधा केवल एक अधिक कार्यात्मक/कम ओओ प्रोग्रामिंग शैली में अच्छी तरह से काम करती है?

+3

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

+0

@ एसके-तर्क - मुझे लगता है कि टाइप प्रदाताओं _are_ संकलन समय मेटाप्रोग्रामिंग का एक रूप है। इसके अलावा, "अधिक सामान्य" समाधान जो आप प्रशंसा करते हैं, उनके पास ट्रेडऑफ का अपना सेट भी है। उदाहरण के लिए, मेटाओकैमल स्टेजिंग के विचार को शुरू करके टाइप सिस्टम को अधिक जटिल बनाता है (और जहां तक ​​मुझे पता है कि उद्धरण/विभाजन/केवल अभिव्यक्तियों को चलाने की अनुमति है, परिभाषाओं को टाइप नहीं करते हैं)। – kvb

+1

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

उत्तर

7

जैसा कि ब्रायन और टॉमस बताते हैं, इस सुविधा के बारे में विशेष रूप से "कार्यात्मक" कुछ भी नहीं है। यह कंपाइलर को मेटाडेटा प्रदान करने के लिए सिर्फ एक विशेष रूप से चालाक तरीका है।

सी # डिजाइन टीम लंबे समय से इस तरह के विचारों के आसपास लात मार रही है। एक फीचर के लिए सी # टीम में शामिल होने से कुछ साल पहले एक प्रस्ताव था जिसे "टाइप ब्लूप्रिंट्स" (या ऐसा कुछ) कहा जा रहा था, जिससे एक्सएमएल दस्तावेजों, एक्सएमएल स्कीमा और कस्टम कोड का संयोजन जो टाइप मेटाडेटा का लाभ उठा सकता था सी # कंपाइलर द्वारा इस्तेमाल किया जाना चाहिए। मुझे विवरण याद नहीं है और जाहिर है, यह कभी भी सफल नहीं हुआ। (हालांकि यह उस समय दस्तावेज़ दस्तावेज़ प्रारूप के लिए विजुअल स्टूडियो टूल्स के डिजाइन और कार्यान्वयन को प्रभावित करता था, जिसे मैं उस समय काम कर रहा था।)

किसी भी घटना में, हमारे पास इस तरह के जोड़ने के लिए तत्काल क्षितिज पर कोई योजना नहीं है सी # के लिए सुविधा, लेकिन हम यह देखने के लिए बहुत रुचि रखते हैं कि यह F # में ग्राहक समस्याओं को हल करने का अच्छा काम करता है या नहीं।

(हमेशा की तरह, unnannounced और पूरी तरह से काल्पनिक उत्पादों के संभावित भविष्य सुविधाओं के बारे में एरिक के चिंतन मनोरंजन प्रयोजनों के लिए ही कर रहे हैं।)

+0

भी दिलचस्प होगा कि यह स्कैला (siq) और gosu (ots) के लिए कैसे काम करता है ... – soc

+0

मैं कहूंगा कि आपको निर्भरता संकलन मॉडल को बेहतर बनाने की आवश्यकता है। यह सब बहुत निहित है, और संगत नहीं है। मुझे लगता है कि यह बहुत सारे विकास में बाधा डालता है, मैं आपके मंच पर कल्पना कर सकता हूं। – nicolas

5

मुझे कोई तकनीकी कारण नहीं दिख रहा है कि टाइप प्रदाताओं जैसे कुछ को सी # या इसी तरह की भाषाओं में क्यों जोड़ा नहीं जा सका। लैंगुग का एकमात्र परिवार जो टाइप प्रदाताओं को जोड़ने में मुश्किल बनाता है (उसी तरह एफ # में) गतिशील रूप से टाइप की गई भाषा है।

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

वे एफ # की सुविधा के रूप में सीधे क्यों लागू किए जाते हैं? मुझे लगता है कि मेटा प्रोग्रामिंग सिस्टम को वास्तव में जटिल होना चाहिए (ध्यान दें कि इसका समर्थन करने के लिए प्रकार वास्तव में जेनरेट नहीं किए गए हैं)। अन्य चीजें जो इसका उपयोग करके की जा सकती हैं, एफ # भाषा में बहुत योगदान नहीं देगी (वे केवल इसे जटिल बना देंगे, जो एक बुरी चीज है)। हालांकि, अगर आपके पास कुछ प्रकार की कंपाइलर एक्स्टेंसिबिलिटी थी तो आपको समान चीज़ मिल सकती है।

असल में, मुझे लगता है कि सी # टीम भविष्य में टाइप प्रदाताओं जैसे कुछ जोड़ देगा (उन्होंने कुछ समय के लिए कंपाइलर एक्स्टेंसिबिलिटी के बारे में बात की थी)।

+1

मुझे संदेह है कि एक मेटाप्रोग्रामिंग उपप्रणाली जटिल हो सकती है। वास्तव में, एक सभ्य मेटाप्रोग्रामिंग वाला कोई भी भाषा एक मोनोलिथिक भाषा से बहुत सरल है, क्योंकि यह एक कंपाइलर कोर की बजाय लाइब्रेरी में भाषा सुविधाओं को परिभाषित करने की अनुमति देता है। उदाहरण के लिए, नेमेरल की मूल भाषा कितनी छोटी है, देखें। –

+0

इसके लिए मेटाप्रोग्रामिंग की कोई आवश्यकता नहीं है। – soc

+1

@ एसके-तर्क - ध्यान रखें कि कार्यक्रम के मेटा भाग को आईडीई से संभवतः कुछ सुरक्षा प्रतिबंधों के साथ बुलाया जाना चाहिए। इसके अलावा यह http://www.programmableweb.com/ से सभी प्रकारों को "उत्पन्न" नहीं कर सकता है, क्योंकि इसके लिए पर्याप्त स्मृति नहीं होगी। इसे आलसी प्रकार उत्पन्न करने की जरूरत है। पूरे मेटा सिस्टम को अभी भी .NET को संकलित करना होगा ... मुझे यकीन है कि यह F # के एक संस्करण से अधिक विकास करेगा। –

8

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

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

for e in Freebase.Science.``Chemical Elements`` do 
    printfn "%d: %s - %s" e.``Atomic number`` e.Name e.Discoverer.Name 

या whatnot (मैं सटीक कोड बेतकल्लुफ़ की जरूरत नहीं है), लेकिन बस के रूप में आसानी से कोड है कि बेसबॉल के आँकड़े के बारे में जानकारी हो जाता है, या लिखने प्रसिद्ध अभिनेता है जब दवा पुनर्वसन सुविधाओं में, या फ्रीबेज के माध्यम से उपलब्ध एक अन्य प्रकार की जानकारी में किया गया है।

कार्यान्वयन बिंदु-दृश्य से, यह सभी फ्रीबेस के लिए स्कीमा उत्पन्न करने और इसे .NET a-prei में लाने के लिए अक्षम है; आप बस इसे सेट अप करने के लिए शुरुआत में एक संकलन-समय कदम नहीं उठा सकते हैं। आप छोटे डेटा स्रोतों के लिए ऐसा कर सकते हैं, और वास्तव में कई अन्य प्रकार के प्रदाता इस रणनीति का उपयोग करते हैं, उदा। एक SQL प्रकार प्रदाता डेटाबेस पर इंगित करता है, और उस डेटाबेस में सभी प्रकार के लिए .NET प्रकार उत्पन्न करता है। लेकिन यह रणनीति फ्रीबेज जैसे बड़े क्लाउड डेटा स्टोर के लिए काम नहीं करती है, क्योंकि बहुत से पारस्परिक प्रकार हैं (यदि आपने फ्रीबेज के लिए .NET मेटाडेटा उत्पन्न करने का प्रयास किया है, तो आप पाएंगे कि लाखों प्रकार हैं (जिनमें से ChemicalElementAtomicNumber और Discoverer और Name और कई अन्य फ़ील्ड हैं, लेकिन सचमुच ऐसे लाखों प्रकार हैं) जिन्हें आपको 32-बिट .NET प्रक्रिया में उपलब्ध होने की तुलना में अधिक स्मृति की आवश्यकता है, केवल पूरे प्रकार की स्कीमा का प्रतिनिधित्व करने के लिए।

तो एफ # टाइप-प्रदाता रणनीति एक एपीआई आर्किटेक्चर है जो टाइप प्रदाताओं को ऑन-डिमांड की जानकारी प्रदान करने की अनुमति देती है, जो आईडीई के भीतर डिज़ाइन-टाइम पर चलती है। जब तक आप टाइप न करें Freebase.Science., प्रकार प्रदाता को विज्ञान श्रेणियों के तहत इकाइयों के बारे में जानने की आवश्यकता नहीं है, लेकिन एक बार जब आप .Science के बाद दबाते हैं, तो प्रकार प्रदाता जा सकता है और संपूर्ण स्कीमा का एक और स्तर सीखने के लिए एपीआई से पूछ सकता है जानें कि विज्ञान के अंतर्गत कौन सी श्रेणियां मौजूद हैं, जिनमें से एक ChemicalElements है। और फिर जब आप उनमें से किसी एक को "डॉट" करने का प्रयास करते हैं, तो यह पता लगाएगा कि तत्वों पर परमाणु संख्याएं हैं और क्या नहीं। तो टाइप प्रदाता समय-समय पर उस समय संपादक को टाइप करने के लिए सटीक कोड से निपटने के लिए पूरी तरह से स्कीमा को पर्याप्त रूप से प्राप्त करता है। नतीजतन, उपयोगकर्ता को अभी भी जानकारी के ब्रह्मांड के किसी भी हिस्से का पता लगाने की आजादी है, लेकिन किसी भी एक स्रोत कोड फ़ाइल या इंटरैक्टिव सत्र केवल उपलब्ध होने के एक छोटे से अंश का पता लगाएगा। जब संकलन/कोडेजन का समय आता है, तो कंपाइलर को केवल उस डेटा को वास्तव में उपयोग करने के लिए पर्याप्त कोड उत्पन्न करने की आवश्यकता होती है, जिसे उपयोगकर्ता ने वास्तव में अपने कोड में उपयोग किया है, संभावित डेटाटाइम बिट्स की बजाय पूरे डेटा स्टोर से बात करने की संभावना है।

(हो सकता है कि आपको लगता है कि अब आज के मेटा प्रोग्रामिंग सुविधाओं में से कुछ के साथ, मैं नहीं जानता कि क्या कर सकते हैं, लेकिन लोगों के बारे में मैं स्कूल में एक लंबा वापस आसानी से इस संभाला नहीं हो सकता था, जबकि सीखा है।)

+0

+1 :) – Ankur

+1

क्या मैं सही ढंग से समझता हूं कि कोड में स्पष्ट रूप से संदर्भित प्रकारों के लिए जानकारी _only_ उत्पन्न की जाएगी? क्या इसका मतलब है कि आपके पूरे "डेटा के ब्रह्मांड" को पीछे हटाना असंभव है? – Daniel

+1

टाइप प्रदाता इसे पसंद करने के लिए चुन सकता है, लेकिन कंपाइलर केवल अपने स्थिर पैरामीटर के साथ इसे चालू करने जा रहा है, और फिर इसे 'ऑन-डिमांड' में कॉल करें। तो उदा। बॉक्स में SQLConnection प्रदाता सिर्फ संपूर्ण स्कीमा को .NET प्रकारों के सामने के रूप में उत्पन्न करता है, जबकि एक फ्रीबेस प्रदाता को स्पष्ट रूप से तब तक प्रतीक्षा करनी चाहिए जब तक कि संकलक प्रत्येक कॉल के साथ काम करने की मांग पर मांग न करे। – Brian