कॉमन लिस्प ऑब्जेक्ट सिस्टम

From Vigyanwiki
Revision as of 13:32, 15 May 2023 by alpha>Indicwiki (Created page with "{{Other uses|Clos (disambiguation)}} File:Method-combination.png|thumb|right|एएनएसआई कॉमन लिस्प में मानक विधि संय...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
एएनएसआई कॉमन लिस्प में मानक विधि संयोजन

सामान्य लिस्प ऑब्जेक्ट सिस्टम (CLOS) ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की सुविधा है जो अमेरिकी राष्ट्रीय मानक संस्थान कॉमन लिस्प का हिस्सा है। CLOS एक शक्तिशाली गतिशील प्रोग्रामिंग भाषा वस्तु प्रणाली है जो C++ या Java (प्रोग्रामिंग भाषा) जैसी अधिक स्थिर भाषाओं में पाई जाने वाली OOP सुविधाओं से मौलिक रूप से भिन्न है। सीएलओएस पहले के लिस्प ऑब्जेक्ट सिस्टम जैसे जायके (कंप्यूटर विज्ञान) और कॉमनलूप्स से प्रेरित था, हालांकि यह या तो अधिक सामान्य है। मूल रूप से ऐड-ऑन के रूप में प्रस्तावित, CLOS को कॉमन लिस्प के लिए ANSI मानक के हिस्से के रूप में अपनाया गया था और इसे अन्य लिस्प बोलियों जैसे EuLisp या Emacs Lisp में रूपांतरित किया गया है।[1]


सुविधाएँ

सीएलओएस के बुनियादी बिल्डिंग ब्लॉक विधि (कंप्यूटर प्रोग्रामिंग), कक्षा (कंप्यूटर प्रोग्रामिंग), उन वर्गों के उदाहरण और सामान्य कार्य हैं। CLOS उनको परिभाषित करने के लिए मैक्रोज़ प्रदान करता है: defclass, defmethod, और defgeneric. विधि से उदाहरण बनाए जाते हैं make-instance.

कक्षाओं में कई सुपरक्लास (कंप्यूटर विज्ञान) हो सकते हैं, स्लॉट्स की एक सूची (C++/Java भाषा में सदस्य चर) और एक विशेष मेटाक्लास। स्लॉट को कक्षा द्वारा आवंटित किया जा सकता है (कक्षा के सभी उदाहरण स्लॉट साझा करते हैं) या उदाहरण के द्वारा। प्रत्येक स्लॉट का एक नाम होता है और स्लॉट के मूल्य को फ़ंक्शन का उपयोग करके उस नाम से एक्सेस किया जा सकता है slot-value. इसके अतिरिक्त विशेष सामान्य कार्यों को स्लॉट के मान लिखने या पढ़ने के लिए परिभाषित किया जा सकता है। CLOS क्लास में प्रत्येक स्लॉट का एक विशिष्ट नाम होना चाहिए।

सीएलओएस एक बहु प्रेषण प्रणाली है। इसका मतलब यह है कि विधि (कंप्यूटर विज्ञान) को उनके किसी भी या सभी आवश्यक तर्कों पर विशेषीकृत किया जा सकता है। अधिकांश OO भाषाएँ एकल-प्रेषण हैं, जिसका अर्थ है कि विधियाँ केवल पहले तर्क पर विशिष्ट हैं। एक और असामान्य विशेषता यह है कि विधियाँ कक्षाओं से संबंधित नहीं हैं; कक्षाएं सामान्य कार्यों या विधियों के लिए नामस्थान प्रदान नहीं करती हैं। विधियों को कक्षाओं से अलग से परिभाषित किया गया है, और उनकी कोई विशेष पहुँच नहीं है (उदाहरण के लिए यह , स्वयं , या संरक्षित ) वर्ग स्लॉट के लिए।

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

CLOS में डिस्पैच भी अधिकांश OO भाषाओं से अलग है:

  1. तर्कों की सूची को देखते हुए, लागू विधियों की एक सूची निर्धारित की जाती है।
  2. यह सूची उनके पैरामीटर विशेषज्ञों की विशिष्टता के अनुसार क्रमबद्ध है।
  3. इस सूची से चयनित विधियों को तब जेनेरिक फ़ंक्शन द्वारा उपयोग की जाने वाली विधि संयोजन का उपयोग करके एक प्रभावी विधि में जोड़ा जाता है।
  4. प्रभावी विधि को तब मूल तर्कों के साथ कहा जाता है।

यह प्रेषण तंत्र रनटाइम पर काम करता है। इस प्रकार विधियों को जोड़ने या हटाने से रनटाइम पर परिवर्तित प्रभावी तरीके हो सकते हैं (तब भी जब सामान्य फ़ंक्शन को समान तर्कों के साथ कहा जाता है)। विधि संयोजन को बदलने से विभिन्न प्रभावी तरीके भी हो सकते हैं।

उदाहरण के लिए,

; Declare the common argument structure prototype.
(defgeneric f (x y))

; Define an implementation for (f integer t), where t matches all types.
(defmethod f ((x integer) y)
  1)

(f 1 2.0) => 1

; Define an implementation for (f integer real).
(defmethod f ((x integer) (y real))
  2)

(f 1 2.0) => 2  ;Dispatch changed at runtime.

अधिकांश डायनेमिक प्रोग्रामिंग लैंग्वेज में OO सिस्टम की तरह, CLOS Encapsulation (कंप्यूटर विज्ञान) को लागू नहीं करता है। किसी भी स्लॉट का उपयोग करके पहुँचा जा सकता है slot-value फ़ंक्शन या (वैकल्पिक रूप से ऑटो-जेनरेट) एक्सेसर विधियों के माध्यम से। के माध्यम से इसे एक्सेस करने के लिए slot-value आपको स्लॉट का नाम पता होना चाहिए। सीएल प्रोग्रामर भाषा की नाम स्थान सुविधा का उपयोग यह घोषित करने के लिए करते हैं कि निर्यात के लिए कौन से कार्य या डेटा संरचनाएँ अभिप्रेत हैं।

सामान्य (प्राथमिक) विधियों के अलावा भी हैं :before, :after, और :around सहायक तरीके। वर्ग पदानुक्रम के आधार पर एक विशेष क्रम में, पहले दो को प्राथमिक विधि से पहले या बाद में लागू किया जाता है। एक :around विधि नियंत्रित कर सकती है कि प्राथमिक विधि को निष्पादित किया गया है या नहीं। इसके अतिरिक्त, प्रोग्रामर यह निर्दिष्ट कर सकता है कि क्या पदानुक्रम (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) के साथ सभी संभावित प्राथमिक विधियों को बुलाया जाना चाहिए या केवल निकटतम मिलान प्रदान करने वाला।

मानक विधि-संयोजन ऊपर बताए गए तरीकों के पहले, पहले और बाद में प्राथमिक प्रदान करता है। अन्य विधि-संयोजन अन्य विधि प्रकारों के साथ हैं। नई (सरल और जटिल दोनों) विधि-संयोजन और विधि प्रकार परिभाषित किए जा सकते हैं।

सीएलओएस एकाधिक वंशानुक्रम की अनुमति देता है। जब डिफ़ॉल्ट क्रम जिसमें एकाधिक विरासत में विधियों को निष्पादित किया जाता है, सही नहीं है, प्रोग्रामर हीरे की समस्या को विधि संयोजनों के क्रम को निर्दिष्ट करके हल कर सकता है।

सीएलओएस गतिशील है, जिसका अर्थ है कि न केवल सामग्री, बल्कि इसकी वस्तुओं की संरचना को भी रनटाइम पर संशोधित किया जा सकता है। सीएलओएस ऑन-द-फ्लाई (यहां तक ​​​​कि जब प्रश्न में वर्ग के उदाहरण पहले से मौजूद हैं) बदलने के साथ-साथ किसी दिए गए उदाहरण की कक्षा सदस्यता को बदलने का समर्थन करता है। change-class ऑपरेटर। CLOS रनटाइम पर तरीकों को जोड़ने, फिर से परिभाषित करने और हटाने की भी अनुमति देता है। सर्कल-एलीप्से समस्या | सर्कल-एलिप्से समस्या सीएलओएस में आसानी से हल हो जाती है, और अधिकांश ओओपी डिजाइन पैटर्न (कंप्यूटर विज्ञान) या तो गायब हो जाते हैं या गुणात्मक रूप से सरल होते हैं।[2] सीएलओएस एक प्रोटोटाइप-आधारित भाषा नहीं है: वस्तुओं को उस वर्ग के सदस्यों के रूप में त्वरित करने से पहले कक्षाओं को परिभाषित किया जाना चाहिए।

मेटाबजेक्ट प्रोटोकॉल

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

विभिन्न सामान्य लिस्प कार्यान्वयनों में मेटाऑब्जेक्ट प्रोटोकॉल की कला थोड़ा अलग समर्थन है। करीब[3] परियोजना का उद्देश्य लापता सुविधाओं को प्रदान करना है।

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

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

अन्य प्रोग्रामिंग भाषाओं में CLOS

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


अग्रिम पठन

  • Bobrow, Daniel G.; Kahn, Kenneth; Kiczales, Gregor; Masinter, Larry; Stefik, Mark; Zdybel, Frank (June 1986). "CommonLoops: Merging Lisp and Object-Oriented Programming" (PDF). Conference proceedings on Object-oriented Programming Systems Languages and Applications. OOPSLA '86. pp. 17–29. doi:10.1145/28697.28700. ISBN 978-0-89791-204-4. S2CID 62631315. Retrieved 2022-03-17.
  • Veitch, Jim (1998). "A History and Description of CLOS". In Salus, Peter H. (ed.). Handbook of Programming Languages, Volume IV: Functional and Logic Programming Languages (1st ed.). Macmillan Technical Publishing. pp. 107–158. ISBN 1-57870-011-6.


संदर्भ

  1. "CLOS is a standard. Multiple vendors supply CLOS. CLOS (or parts of it) is being used to add object-orientation to other Lisp dialects such as EuLisp or Emacs Lisp." p. 110 of Veitch 1998
  2. In the Design Patterns in Dynamic Languages slides, Peter Norvig presents his findings that 16 out of 23 design patterns taken from various textbooks are either "invisible or simpler" in Dylan or Common Lisp than in C++.
  3. Closer Project: Closer to MOP
  4. Deniau, Laurent (12 March 2010). The C Object System: Using C as a High-Level Object-Oriented Language (PDF). arXiv:1003.2547. CiteSeerX 10.1.1.763.7946. Retrieved 2022-03-17.
  5. Dynace Object Oriented Extension To C
  6. Newton, Jim; Rhodes, Christophe (28 November 2008). "ऑब्जेक्ट-ओरिएंटेड लिस्प में कस्टम विशेषज्ञ". Journal of Universal Computer Science. 14 (20): 3370–3388. CiteSeerX 10.1.1.523.2413. doi:10.3217/jucs-014-20-3370. S2CID 12032836. Retrieved 2022-03-17.
  7. Tiny CLOS, developed by Gregor Kiczales


साहित्य

श्रेणी:सामान्य लिस्प श्रेणी:ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग श्रेणी:लिस्प (प्रोग्रामिंग भाषा)