2008-12-02 18 views
12

मैं लुआ के लिए Linq की तरह कुछ करने के बारे में सोच रहा था, और मैं एक सामान्य विचार कैसे Linq काम करता है, लेकिन अगर वहाँ एक अच्छा लेख था या अगर किसी को समझा सकता है कि कैसे सी # बनाता Linq संभवलिंक काम कैसे करता है (दृश्यों के पीछे)?

नोट सोच रहा था: मेरा मतलब है दृश्यों के पीछे, जैसे कि यह कोड बाइंडिंग कैसे उत्पन्न करता है और यह सब, उपयोगकर्ता सिंटैक्स को समाप्त नहीं करता है।

+0

क्या आपका मतलब अंतर्निहित वाक्यविन्यास/पेड़ों में क्वेरी का अनुवाद कैसे किया जाता है या निष्पादन अर्थ में LINQ फ़ंक्शन कैसे करता है? – JaredPar

+0

पर मैं अधिकतर संकलन समय प्रणालियों के बारे में चिंतित हूं –

उत्तर

18

यह क्योंकि LINQ इतने सारे अलग अलग बातें है इस सवाल का जवाब देना मुश्किल है। उदाहरण के लिए, सी # के लिए चिपके हुए, निम्नलिखित बातें शामिल हैं:

  • क्वेरी भाव जो तब सामान्य रूप से संकलित किया गया है "क्वेरी भाव के बिना सी #" "पूर्व संसाधित" में कर रहे हैं। Spec का क्वेरी अभिव्यक्ति भाग वास्तव में छोटा है - यह मूल रूप से एक यांत्रिक अनुवाद है जो क्वेरी के वास्तविक अर्थ के बारे में कुछ भी नहीं मानता है, "आदेश द्वारा ऑर्डरबी/फिरबी/आदि में अनुवाद किया गया है"।
  • प्रतिनिधियों को निष्पादन योग्य कोड के रूप में एक विशेष हस्ताक्षर के साथ मनमानी कार्यों का प्रतिनिधित्व करने के लिए उपयोग किया जाता है।
  • अभिव्यक्ति पेड़ एक ही बात का प्रतिनिधित्व करने के लिए उपयोग किया जाता है, लेकिन के रूप में डेटा (जो जांच की जा सकती और अनुवाद एक अलग रूप है, उदा SQL में)
  • लैम्ब्डा भाव या तो प्रतिनिधियों या अभिव्यक्ति पेड़ों में स्रोत कोड कन्वर्ट करने के लिए उपयोग किया जाता है।
  • अधिकतर LINQ प्रदाताओं द्वारा विस्तार विधि विधियों का उपयोग स्थिर विधि कॉल को एक साथ करने के लिए किया जाता है। इससे प्रभावी रूप से बहुत अधिक शक्ति प्राप्त करने के लिए एक सरल इंटरफ़ेस (उदा। IEnumerable<T>) की अनुमति मिलती है।
  • अनुमानों के लिए बेनामी प्रकारों का उपयोग किया जाता है - जहां आपके पास डेटा का कुछ अलग संग्रह होता है, और आप उस डेटा के प्रत्येक पहलू के बिट्स चाहते हैं, एक अनाम प्रकार आपको उन्हें एक साथ इकट्ठा करने की अनुमति देता है।
  • लागू रूप से टाइप किए गए स्थानीय चर (var) प्राथमिक रूप से टाइप किए गए भाषा को बनाए रखने के लिए अज्ञात प्रकारों के साथ काम करते समय उपयोग किए जाते हैं, जहां आप स्पष्ट रूप से प्रकार के नाम को "बोलने" में सक्षम नहीं हो सकते हैं।
  • इटरेटर ब्लॉक आमतौर पर इन-प्रोसेस पूछताछ को लागू करने के लिए उपयोग किए जाते हैं, उदा। LINQ से ऑब्जेक्ट्स के लिए।
  • टाइप अनुमान का उपयोग पूरी चीज को बहुत आसान बनाने के लिए किया जाता है - LINQ में बहुत सी सामान्य तरीके हैं, और बिना किसी अनुमान के यह वास्तव में दर्दनाक होगा।
  • कोड पीढ़ी कोड में एक मॉडल (dbml जैसे) मुड़ने के लिए प्रयोग किया जाता है
  • आंशिक प्रकार तैयार किए गए कोड तानाना प्रदान करने के लिए उपयोग किया जाता है
  • गुण

जाहिर है एक LINQ प्रदाताओं के लिए मेटाडाटा प्रदान करने के लिए उपयोग किया जाता है इनमें से बहुत सारे LINQ द्वारा उपयोग किए गए केवल नहीं हैं, लेकिन विभिन्न LINQ प्रौद्योगिकियां उन पर निर्भर करती हैं।

यदि आप रुचि रखने वाले पहलुओं के बारे में अधिक संकेत दे सकते हैं, तो हम अधिक जानकारी प्रदान करने में सक्षम हो सकते हैं।

यदि आप ऑब्जेक्ट्स को LINQ को प्रभावी ढंग से कार्यान्वित करने में रुचि रखते हैं, तो आपको कुछ हफ्ते पहले पढ़ाई में डीडीडी में दी गई एक बात में रूचि हो सकती है - मूल रूप से एक घंटे में जितना संभव हो सके LINQ से ऑब्जेक्ट्स को कार्यान्वित करना। हम इसके अंत तक बहुत दूर थे, लेकिन आपको दयालु का एक बहुत अच्छा विचार देना चाहिए जो आपको करने की ज़रूरत है (और बफरिंग/स्ट्रीमिंग, इटरेटर ब्लॉक, क्वेरी अभिव्यक्ति अनुवाद इत्यादि)। वीडियो अभी तक नहीं हैं (और मैंने अभी तक डाउनलोड के लिए कोड नहीं रखा है) लेकिन यदि आप रुचि रखते हैं, तो मुझे [email protected] पर एक मेल छोड़ दो और मैं आपको बता दूंगा कि वे कब उठ रहे हैं । (मैं शायद इसके बारे में भी ब्लॉग करूंगा।)

+0

यह बहुत सी चीजें हैं और आप वास्तव में निष्पादन पक्ष में भी नहीं पहुंच पाए। यहां तक ​​कि अधिक बालों वाले विवरण रहते हैं। – JaredPar

+0

ठीक है एक दिन, यदि समय परमिट करता है तो लुआ के लिए एक पूर्ण LINQ प्रणाली होना बहुत अच्छा होगा, लेकिन क्या आप पूरी बात का जिक्र करते हैं कि यह बहुत जटिल है, इस पल के लिए मैं कम फल से शुरू करने और मेरे काम करने के बारे में सोच रहा हूं ऊपर की ओर। –

+0

मैं LUA से अपरिचित हूं, क्या यह iterators का समर्थन करता है? यह वास्तव में नींव है जिस पर अधिकांश LINQ – JaredPar

3

Mono (आंशिक रूप से?) LINQ लागू करता है, और opensource है। शायद आप उनके कार्यान्वयन में देख सकते हैं?

+0

अच्छी शुरुआत की तरह लगता है –

2

शायद मेरे LINQ for R6RS Scheme कुछ अंतर्दृष्टि प्रदान करेंगे।

यह 100% अर्थात् है, और लगभग 100% वाक्य रचनात्मक रूप से LINQ के समान ही है, '' 'के बजाय' तत्काल 'का उपयोग करके अतिरिक्त सॉर्ट पैरामीटर के उल्लेखनीय अपवाद के साथ।

कुछ नियम/मान्यताओं:

  • केवल सूचियों के साथ काम कर, कोई क्वेरी प्रदाताओं।
  • आलसी नहीं, लेकिन उत्सुक समझ।
  • कोई स्थिर प्रकार नहीं है, क्योंकि योजना उनका उपयोग नहीं करती है।

मेरे कार्यान्वयन में कुछ मूल प्रक्रियाओं पर निर्भर करता है:

  • मानचित्र - 'SelectMany'
  • के लिए इस्तेमाल किया - 'कहाँ'
  • समतल के लिए इस्तेमाल किया - 'चुनें'
  • फिल्टर के लिए इस्तेमाल किया
  • सॉर्ट - एक बहु-कुंजी सॉर्टिंग प्रक्रिया
  • समूह - समूह बनाने के लिए

बाकी संरचना सभी मैक्रो का उपयोग करके बनाई गई है।

बाइंडिंग एक सूची में संग्रहित की जाती है जिसे स्वच्छता सुनिश्चित करने के लिए बाध्य पहचानकर्ताओं के साथ टैग किया जाता है। बाध्यकारी निकाले जाते हैं और स्थानीय रूप से रिबाउंड होते हैं जहां कभी अभिव्यक्ति होती है।

मैंने अपने blog पर प्रगति को ट्रैक किया है, जो संभावित मुद्दों पर कुछ अंतर्दृष्टि प्रदान कर सकता है।

+0

यह वास्तव में सहायक होना चाहिए। धन्यवाद –

1

मैट वॉरेन के ब्लॉग सभी जवाब (और एक नमूना IQueryable प्रदाता कार्यान्वयन आप लाभ मिला देने के लिए) है:

http://blogs.msdn.com/mattwar/

2

डिजाइन विचारों के लिए, c omega पर एक नज़र, अनुसंधान परियोजना है कि Linq जनम ले । लिंक आपके परिप्रेक्ष्य के आधार पर सी ओमेगा का एक अधिक व्यावहारिक या पानी वाला संस्करण है।

संबंधित मुद्दे