गोऑब्जेक्ट: Difference between revisions
No edit summary |
No edit summary |
||
| Line 24: | Line 24: | ||
}} | }} | ||
[[File:Linux kernel System Call Interface and glibc.svg|thumb|300px|चूंकि [[जीएनयू सी लाइब्रेरी]] [[लिनक्स कर्नेल]] [[सिस्टम कॉल]] के लिए एक रैपर के रूप में कार्य करती है, इसलिए जीएलआईबी (जीओब्जेक्ट, जीएलआईबी, [[जीमॉड्यूल]], जीटीएचड और जीआईओ (सॉफ्टवेयर)) में | [[File:Linux kernel System Call Interface and glibc.svg|thumb|300px|चूंकि [[जीएनयू सी लाइब्रेरी]] [[लिनक्स कर्नेल]] [[सिस्टम कॉल]] के लिए एक रैपर के रूप में कार्य करती है, इसलिए जीएलआईबी (जीओब्जेक्ट, जीएलआईबी, [[जीमॉड्यूल]], जीटीएचड और जीआईओ (सॉफ्टवेयर)) में एकत्र किए गए लाइब्रेरी अपने विशिष्ट फंक्शन के लिए आगे के रैपर के रूप में कार्य करती हैं।]]जीएलआईबी[[ वस्तु प्रणाली | ऑब्जेक्ट सिस्टम]] या '''जीओब्जेक्ट''', एक [[मुफ्त सॉफ्टवेयर|मुक्त सॉफ्टवेयर]] [[ सॉफ्टवेयर पुस्तकालय |लाइब्रेरी]] है जो पोर्टेबल ऑब्जेक्ट (वस्तु) सिस्टम और पारदर्शी अनुप्रस्थ-भाषा अंतर प्रचालनीयता प्रदान करती है। जीओब्जेक्ट को वस्तु-उन्मुख सी प्रोग्रामिंग आधारित एपीआई प्रदान करने के लिए सी प्रोग्राम में प्रत्यक्ष रूप मे उपयोग के लिए और पारदर्शी अनुप्रस्थ-भाषा अंतर प्रचालनीयता प्रदान करने के लिए अन्य भाषाओं में बाइंडिंग प्रोग्रामिंग के माध्यम से [[PyGObject|<code>PyGObject</code>]]को डिज़ाइन किया गया है। | ||
== इतिहास == | == इतिहास == | ||
<code>GLib</code>और <code>libc</code>पर निर्भर करते हुए, | <code>GLib</code>और <code>libc</code>पर निर्भर करते हुए, जीओब्जेक्ट <code>GNOME</code> का आधार है। इसका उपयोग [[GTK|जीटीके]], [[Pango|पंगो]], [[अभिगम्यता टूलकिट]] और अधिकांश उच्च-स्तरीय जीनोम लाइब्रेरी जैसे [[GStreamer|<code>GStreamer</code>]]और अनुप्रयोगों में किया जाता है। <code>GTK+ 2.0</code> से पहले जीओब्जेक्ट के समान कोड जीटीके कोडबेस का एक भाग था। यह "<code>GObject</code>" नाम अभी तक उपयोग में नहीं था, सामान्य आधारित क्लास को <code>GtkObject</code> कहा जाता था। | ||
<code>GTK+ 2.0</code> के प्रारम्भ होने पर इसकी सामान्य उपयोगिता के कारण वस्तु प्रणाली को एक अलग लाइब्रेरी में निकाला गया था। इस प्रक्रिया में <code>GtkObject</code> वर्ग के अधिकांश गैर-जीयूआई विशिष्ट भागों को | <code>GTK+ 2.0</code> के प्रारम्भ होने पर इसकी सामान्य उपयोगिता के कारण वस्तु प्रणाली को एक अलग लाइब्रेरी में निकाला गया था। इस प्रक्रिया में <code>GtkObject</code> वर्ग के अधिकांश गैर-जीयूआई विशिष्ट भागों को जीओब्जेक्ट के नए सामान्य आधारित क्लास में ले जाया गया था। 11 मार्च 2002 (<code>GTK+ 2.0</code> की प्रकाशन तिथि) से एक अलग लाइब्रेरी के रूप में अस्तित्व में आने के बाद जीओब्जेक्ट लाइब्रेरी का उपयोग अब कई गैर-जीयूआई प्रोग्रामों जैसे [[कमांड लाइन]] और [[सर्वर (कंप्यूटिंग)]] अनुप्रयोगों द्वारा किया जाता है। | ||
== जीएलआईबी से संबंध == | == जीएलआईबी से संबंध == | ||
हालाँकि | हालाँकि जीओब्जेक्ट के पास दस्तावेज़ीकरण का अपना अलग समूह है<ref>{{cite web|url=https://developer.gnome.org/gobject/stable/|title=GObject Reference Manual}}</ref> और सामान्यतः इसे अपनी साझा लाइब्रेरी फ़ाइल में संकलित किया जाता है। जीओब्जेक्ट का स्रोत कोड <code>GLib</code> स्रोत ट्री में रहता है और <code>GLib</code> के साथ वितरित किया जाता है। इस कारण से जीओब्जेक्ट <code>GLib</code> संस्करण संख्याओं का उपयोग करता है और सामान्यतः <code>GLib</code> के साथ पैक किया जाता है। उदाहरण के लिए [[डेबियन]] जीओब्जेक्ट को अपने <code>libglib2.0</code> पैकेज समूह में रखता है। | ||
== टाइप प्रणाली == | == टाइप प्रणाली == | ||
| Line 42: | Line 42: | ||
=== मौलिक प्रकार === | === मौलिक प्रकार === | ||
वे प्रकार जिनमें कोई संबद्ध वर्ग नहीं होता है उन्हें गैर-वर्गीकृत कहा जाता है। ये प्रकार उन सभी प्रकारों के साथ जो मूल वर्ग के किसी न किसी रूप से अनुरूप हैं, मौलिक प्रकार के रूप में जाने जाते हैं। वे प्रकार जिनसे अन्य सभी प्रकार प्राप्त होते | वे प्रकार जिनमें कोई संबद्ध वर्ग नहीं होता है उन्हें गैर-वर्गीकृत कहा जाता है। ये प्रकार उन सभी प्रकारों के साथ जो मूल वर्ग के किसी न किसी रूप से अनुरूप हैं, मौलिक प्रकार के रूप में जाने जाते हैं। वे प्रकार जिनसे अन्य सभी प्रकार प्राप्त होते हैं ये एक अपेक्षाकृत संवृत समुच्चय बनाते हैं। हालांकि औसत उपयोगकर्ता से अपने स्वयं के मौलिक प्रकार बनाने की संभावना नहीं की जाती है और कस्टम क्लास पदानुक्रम बनाने के लिए इसका लाभ प्राप्त किया गया है अर्थात क्लास पदानुक्रम जीओब्जेक्ट क्लास पर आधारित नहीं हैं। | ||
जीएलआईबी 2.9.2 के अनुसार,<ref>{{cite web|url=https://developer.gnome.org/gobject/stable|title=GObject Reference Manual - Stable}}</ref> गैर-वर्गीकृत अंतर्निर्मित मौलिक प्रकार हैं: | जीएलआईबी 2.9.2 के अनुसार,<ref>{{cite web|url=https://developer.gnome.org/gobject/stable|title=GObject Reference Manual - Stable}}</ref> गैर-वर्गीकृत अंतर्निर्मित मौलिक प्रकार हैं: | ||
| Line 57: | Line 57: | ||
* आधारिक इंटरफ़ेस प्रकार आधार क्लास प्रकार के अनुरूप लेकिन मानक इंटरफ़ेस उत्तराधिकारिक मूल <code>G_TYPE_INTERFACE</code> का प्रतिनिधित्व करता है। | * आधारिक इंटरफ़ेस प्रकार आधार क्लास प्रकार के अनुरूप लेकिन मानक इंटरफ़ेस उत्तराधिकारिक मूल <code>G_TYPE_INTERFACE</code> का प्रतिनिधित्व करता है। | ||
* [[बॉक्सिंग प्रकार|बॉक्सिंग]] संरचनाओं के लिए एक प्रकार, जिसका उपयोग साधारण मान वाली वस्तुओं या विदेशी वस्तुओं को संदर्भ-गणित "बॉक्स" <code>G_TYPE_BOXED</code>) में प्रयुक्त करने के लिए किया जाता है। | * [[बॉक्सिंग प्रकार|बॉक्सिंग]] संरचनाओं के लिए एक प्रकार, जिसका उपयोग साधारण मान वाली वस्तुओं या विदेशी वस्तुओं को संदर्भ-गणित "बॉक्स" <code>G_TYPE_BOXED</code>) में प्रयुक्त करने के लिए किया जाता है। | ||
* "पैरामीटर विनिर्देश वस्तु" के लिए एक प्रकार, जिसका उपयोग वस्तु गुणों <code>G_TYPE_PARAM</code> के लिए मेटाडेटा का वर्णन करने के लिए | * "पैरामीटर विनिर्देश वस्तु" के लिए एक प्रकार, जिसका उपयोग वस्तु गुणों <code>G_TYPE_PARAM</code> के लिए मेटाडेटा का वर्णन करने के लिए जीओब्जेक्ट में प्रयोग किया जाता है। | ||
वे प्रकार जिन्हें टाइप प्रणाली द्वारा स्वचालित रूप से त्वरित किया जा सकता है तात्कालिक प्रकार कहलाते हैं। इन प्रकारों की एक महत्वपूर्ण विशेषता यह है कि किसी भी उदाहरण के पहले बाइट्स में सदैव उदाहरण के प्रकार से संबद्ध वर्ग संरचना (वर्चुअल तालिका का एक रूप) के लिए एक संकेतक होते है। इस कारण से किसी भी तात्कालिक प्रकार को वर्गीकृत किया जाना चाहिए। विरोधाभासी रूप से कोई भी गैर-वर्गीकृत प्रकार (जैसे पूर्णांक या स्ट्रिंग) गैर-तात्कालिक होना चाहिए। दूसरी ओर अधिकांश वर्गीकृत प्रकार तात्कालिक होते हैं, लेकिन कुछ, जैसे इंटरफ़ेस प्रकार तात्कालिक प्रकार नहीं होते हैं। | वे प्रकार जिन्हें टाइप प्रणाली द्वारा स्वचालित रूप से त्वरित किया जा सकता है तात्कालिक प्रकार कहलाते हैं। इन प्रकारों की एक महत्वपूर्ण विशेषता यह है कि किसी भी उदाहरण के पहले बाइट्स में सदैव उदाहरण के प्रकार से संबद्ध वर्ग संरचना (वर्चुअल तालिका का एक रूप) के लिए एक संकेतक होते है। इस कारण से किसी भी तात्कालिक प्रकार को वर्गीकृत किया जाना चाहिए। विरोधाभासी रूप से कोई भी गैर-वर्गीकृत प्रकार (जैसे पूर्णांक या स्ट्रिंग) गैर-तात्कालिक होना चाहिए। दूसरी ओर अधिकांश वर्गीकृत प्रकार तात्कालिक होते हैं, लेकिन कुछ, जैसे इंटरफ़ेस प्रकार तात्कालिक प्रकार नहीं होते हैं। | ||
=== व्युत्पन्न प्रकार === | === व्युत्पन्न प्रकार === | ||
अंतर्निहित | अंतर्निहित जीओब्जेक्ट मौलिक प्रकारों से प्राप्त प्रकार सामान्यतः चार श्रेणियों में आते हैं: | ||
; सूचीबद्ध प्रकार और फ्लैग प्रकार: सामान्यतः प्रत्येक सूचीबद्ध प्रकार और प्रत्येक पूर्णांक-आधारित बिटफील्ड प्रकार (अर्थात, प्रत्येक <code>enum</code> प्रकार) जिसे कोई किसी प्रकार से उपयोग करना चाहता है जो वस्तु प्रणाली से संबंधित है उदाहरण के लिए वस्तु विशेषता के प्रकार के रूप में पंजीकृत होना चाहिए। प्रकार प्रणाली के साथ सामान्यतः प्रारम्भिक कोड जो इन प्रकारों को पंजीकृत करने का ध्यान रखता है, <code>glib-mkenums</code> नामक एक स्वचालित उपकरण द्वारा उत्पन्न किया जाता है और एक अलग फ़ाइल में संग्रहीत किया जाता है।<ref>{{cite web|url=https://developer.gnome.org/gobject/stable/glib-mkenums.html|title=glib-mkenums, GObject Reference Manual}}</ref> | ; सूचीबद्ध प्रकार और फ्लैग प्रकार: सामान्यतः प्रत्येक सूचीबद्ध प्रकार और प्रत्येक पूर्णांक-आधारित बिटफील्ड प्रकार (अर्थात, प्रत्येक <code>enum</code> प्रकार) जिसे कोई किसी प्रकार से उपयोग करना चाहता है जो वस्तु प्रणाली से संबंधित है उदाहरण के लिए वस्तु विशेषता के प्रकार के रूप में पंजीकृत होना चाहिए। प्रकार प्रणाली के साथ सामान्यतः प्रारम्भिक कोड जो इन प्रकारों को पंजीकृत करने का ध्यान रखता है, <code>glib-mkenums</code> नामक एक स्वचालित उपकरण द्वारा उत्पन्न किया जाता है और एक अलग फ़ाइल में संग्रहीत किया जाता है।<ref>{{cite web|url=https://developer.gnome.org/gobject/stable/glib-mkenums.html|title=glib-mkenums, GObject Reference Manual}}</ref> | ||
; बॉक्सिंग प्रकार: कुछ डेटा संरचनाएँ जो पूर्ण श्रेणी प्रकार (सभी ओवरहेड व्यय के साथ) बनाने के लिए बहुत सरल हैं, उन्हें अभी भी टाइप प्रणाली के साथ पंजीकृत करने की आवश्यकता हो सकती है। उदाहरण के लिए हमारे पास एक वर्ग हो सकता है जिसमें हम <code>background-color</code> जोड़ना चाहते हैं, जिसका मान एक संरचना का उदाहरण होना चाहिए जो {{code|2=c|1=struct color { int r, g, b; <nowiki>}</nowiki> }}. | ; बॉक्सिंग प्रकार: कुछ डेटा संरचनाएँ जो पूर्ण श्रेणी प्रकार (सभी ओवरहेड व्यय के साथ) बनाने के लिए बहुत सरल हैं, उन्हें अभी भी टाइप प्रणाली के साथ पंजीकृत करने की आवश्यकता हो सकती है। उदाहरण के लिए हमारे पास एक वर्ग हो सकता है जिसमें हम <code>background-color</code> जोड़ना चाहते हैं, जिसका मान एक संरचना का उदाहरण होना चाहिए जो {{code|2=c|1=struct color { int r, g, b; <nowiki>}</nowiki> }}. जीओब्जेक्ट को उपवर्गित करने से बचने के लिए हम इस संरचना का प्रतिनिधित्व करने के लिए एक बॉक्स प्रकार बना सकते हैं। प्रतिलिपि बनाने और मुक्त करने के लिए जीओब्जेक्ट फ़ंक्शन प्रदान कर सकते हैं। जीओब्जेक्ट सरल GLib डेटा प्रकारों को एकत्र बॉक्स प्रकार के साथ संयुक्त करता है। बॉक्सिंग प्रकारों के लिए एक अन्य उपयोग विदेशी वस्तुओं को एक टैग की गई गणना में प्रयुक्त करने के तरीके के रूप में है। जिसे टाइप सिस्टम पहचान सकता है और जान लेगा कि कैसे अनुकरण और मुक्त करना है। | ||
; अपारदर्शी सूचक प्रकार: कभी-कभी, उन वस्तुओं के लिए जिन्हें न तो | ; अपारदर्शी सूचक प्रकार: कभी-कभी, उन वस्तुओं के लिए जिन्हें न तो प्रतिलिपि करने, न ही संदर्भ-गणना करने और न ही मुक्त करने की आवश्यकता होती है। यहां तक कि एक बॉक्स प्रकार भी अतिविस्तार होगा। जबकि ऐसी वस्तुओं को केवल अपारदर्शी पॉइंटर्स <code>G_TYPE_POINTER</code> के रूप में मानकर जीओब्जेक्ट में उपयोग किया जा सकता है। प्रायः एक व्युत्पन्न पॉइंटर प्रकार बनाना एक अच्छा विचार है। इस तथ्य का दस्तावेजीकरण करते हुए कि पॉइंटर्स को एक विशेष प्रकार की वस्तु का संदर्भ देना चाहिए, यद्यपि इसके विषय में और कुछ नही कहा जा सकता है। | ||
; वर्ग और इंटरफ़ेस प्रकार: <code>GObject</code> एप्लिकेशन में अधिकांश प्रकार मूल वर्ग | ; वर्ग और इंटरफ़ेस प्रकार: <code>GObject</code> एप्लिकेशन में अधिकांश प्रकार मूल वर्ग जीओब्जेक्ट से प्रत्यक्ष या अप्रत्यक्ष रूप से प्राप्त शब्द के सामान्य वस्तु उन्मुख अर्थ में कक्षाएं होती है। ऐसे इंटरफ़ेस भी हैं, जिनमें क्लासिक जावा-शैली इंटरफ़ेस के विपरीत कार्यान्वित प्रकार सम्मिलित हो सकते हैं। इस प्रकार जीओब्जेक्ट इंटरफेस को मिक्सिन के रूप में वर्णित किया जा सकता है। | ||
== मैसेजिंग प्रणाली == | == मैसेजिंग प्रणाली == | ||
<code>GObject</code> मैसेजिंग प्रणाली में दो पूरक भाग क्लोजर और संकेत होते हैं। | <code>GObject</code> मैसेजिंग प्रणाली में दो पूरक भाग क्लोजर और संकेत होते हैं। | ||
; क्लोजर: <code>GObject</code> क्लोजर कॉलबैक का एक सामान्यीकृत संस्करण है। C और | ; क्लोजर: <code>GObject</code> क्लोजर कॉलबैक का एक सामान्यीकृत संस्करण है। C और सी++ में लिखे गए क्लोजर के साथ-साथ अपेक्षाकृत भाषाओं (जब बाइंडिंग प्रदान की जाती है) के लिए समर्थन उपस्थित है। यह (उदाहरण के लिए) पायथन और जावा में लिखे गए कोड को जीओब्जेक्ट क्लोजर के माध्यम से प्रयुक्त करने की स्वीकृति देता है। | ||
; संकेत: संकेत प्राथमिक तंत्र है जिसके द्वारा क्लोजर प्रयुक्त किया जाता है। वस्तु संकेत श्रोताओं को टाइप प्रणाली के साथ पंजीकृत करते हैं, किसी दिए गए संकेत और दिए गए क्लोजर के बीच मैपिंग निर्दिष्ट करते हैं। एक पंजीकृत संकेत के उत्सर्जन पर उस संकेत का स्थगित होना प्रयुक्त हो जाता है। जीटीके में सभी मूल जीयूआई घटनाएं (जैसे माउस गति और कीबोर्ड क्रियाएं) श्रोताओं के लिए संभावित रूप से कार्य करने के लिए जीओब्जेक्ट संकेत उत्पन्न कर सकती हैं। | ; संकेत: संकेत प्राथमिक तंत्र है जिसके द्वारा क्लोजर प्रयुक्त किया जाता है। वस्तु संकेत श्रोताओं को टाइप प्रणाली के साथ पंजीकृत करते हैं, किसी दिए गए संकेत और दिए गए क्लोजर के बीच मैपिंग निर्दिष्ट करते हैं। एक पंजीकृत संकेत के उत्सर्जन पर उस संकेत का स्थगित होना प्रयुक्त हो जाता है। जीटीके में सभी मूल जीयूआई घटनाएं (जैसे माउस गति और कीबोर्ड क्रियाएं) श्रोताओं के लिए संभावित रूप से कार्य करने के लिए जीओब्जेक्ट संकेत उत्पन्न कर सकती हैं। | ||
== वर्ग कार्यान्वयन == | == वर्ग कार्यान्वयन == | ||
प्रत्येक | प्रत्येक जीओब्जेक्ट वर्ग को कम से कम दो संरचनाओं, वर्ग संरचना और अनुरोध संरचना द्वारा कार्यान्वित किया जाता है। | ||
; वर्ग संरचना: वर्ग संरचना | ; वर्ग संरचना: वर्ग संरचना सी++ वर्ग की व्यवहार्यता के अनुरूप है। इसका प्रारम्भ उच्च क्लास की वर्ग संरचना से होनी चाहिए। इसके बाद यह फ़ंक्शन पॉइंटर्स का एक समूह रखेगा और क्लास की प्रत्येक वर्चुअल विधि के लिए एक वर्ग-विशिष्ट चर का उपयोग वर्ग के सदस्यों का अनुकरण करने के लिए किया जा सकता है। | ||
; अनुरोध संरचना | ; अनुरोध संरचना | ||
अनुरोध संरचना जो प्रति वस्तु अनुरोध अनुकरण में सम्मिलित होती है। जिसे सुपरक्लास की अनुरोध संरचना से प्रारम्भ होना चाहिए (यह सुनिश्चित करता है कि सभी अनुरोध क्लास संरचना के लिए एक पॉइंटर से प्रारम्भ होते हैं, क्योंकि सभी मौलिक तात्कालिक प्रकार इस विशेषता को साझा करते हैं। सुपरक्लास से संबंधित डेटा के बाद संरचना | अनुरोध संरचना जो प्रति वस्तु अनुरोध अनुकरण में सम्मिलित होती है। जिसे सुपरक्लास की अनुरोध संरचना से प्रारम्भ होना चाहिए (यह सुनिश्चित करता है कि सभी अनुरोध क्लास संरचना के लिए एक पॉइंटर से प्रारम्भ होते हैं, क्योंकि सभी मौलिक तात्कालिक प्रकार इस विशेषता को साझा करते हैं। सुपरक्लास से संबंधित डेटा के बाद संरचना सी++ सदस्य चर के अनुरूप किसी भी उदाहरण-विशिष्ट चर को धारण कर सकती है। | ||
<code>GObject</code> फ्रेमवर्क में एक वर्ग को परिभाषित करना जटिल होता है, जिसके लिए बड़ी मात्रा में बॉयलरप्लेट कोड जैसे टाइप कास्टिंग मैक्रोज़ की मैन्युअल परिभाषा और अस्पष्ट प्रकार पंजीकरण की आवश्यकता होती है। इसके अतिरिक्त सी संरचना में "सार्वजनिक", "संरक्षित" या "निजी" जैसे एक्सेस संशोधक नहीं हो सकते हैं। स्पष्टीकरण प्रदान करने के लिए वर्कअराउंड का उपयोग किया जाना चाहिए। एक दृष्टिकोण निजी डेटा के लिए एक सूचक को सम्मिलित करना है। जिसे पारंपरिक रूप से अनुरोध संरचना में <code>_priv</code> कहा जाता है। निजी संरचना को सार्वजनिक हेडर फ़ाइल में घोषित किया जा सकता है, लेकिन केवल कार्यान्वयन फ़ाइल में परिभाषित किया जा सकता है, जिसका प्रभाव यह है कि निजी डेटा उपयोगकर्ताओं के लिए अपारदर्शी है, लेकिन कार्यान्वयनकर्ता के लिए पारदर्शी है। यदि निजी संरचना जीटाइप के साथ पंजीकृत है, तो इसे वस्तु प्रणाली द्वारा स्वचालित रूप से आवंटित किया जा सकता है। वास्तव में यदि कोई निजी डेटा की आवश्यकता होने पर प्रत्येक बार <code>G_TYPE_INSTANCE_GET_PRIVATE</code> का उपयोग करने को तैयार है, तो <code>_priv</code> पॉइंटर को सम्मिलित करना भी आवश्यक नहीं होता है। | <code>GObject</code> फ्रेमवर्क में एक वर्ग को परिभाषित करना जटिल होता है, जिसके लिए बड़ी मात्रा में बॉयलरप्लेट कोड जैसे टाइप कास्टिंग मैक्रोज़ की मैन्युअल परिभाषा और अस्पष्ट प्रकार पंजीकरण की आवश्यकता होती है। इसके अतिरिक्त सी संरचना में "सार्वजनिक", "संरक्षित" या "निजी" जैसे एक्सेस संशोधक नहीं हो सकते हैं। स्पष्टीकरण प्रदान करने के लिए वर्कअराउंड का उपयोग किया जाना चाहिए। एक दृष्टिकोण निजी डेटा के लिए एक सूचक को सम्मिलित करना है। जिसे पारंपरिक रूप से अनुरोध संरचना में <code>_priv</code> कहा जाता है। निजी संरचना को सार्वजनिक हेडर फ़ाइल में घोषित किया जा सकता है, लेकिन केवल कार्यान्वयन फ़ाइल में परिभाषित किया जा सकता है, जिसका प्रभाव यह है कि निजी डेटा उपयोगकर्ताओं के लिए अपारदर्शी है, लेकिन कार्यान्वयनकर्ता के लिए पारदर्शी है। यदि निजी संरचना जीटाइप के साथ पंजीकृत है, तो इसे वस्तु प्रणाली द्वारा स्वचालित रूप से आवंटित किया जा सकता है। वास्तव में यदि कोई निजी डेटा की आवश्यकता होने पर प्रत्येक बार <code>G_TYPE_INSTANCE_GET_PRIVATE</code> का उपयोग करने को तैयार है, तो <code>_priv</code> पॉइंटर को सम्मिलित करना भी आवश्यक नहीं होता है। | ||
इनमें से कुछ जटिलताओं को संबोधित करने के लिए कई उच्च-स्तरीय भाषाएँ सम्मिलित हैं जो स्रोत से स्रोत C में | इनमें से कुछ जटिलताओं को संबोधित करने के लिए कई उच्च-स्तरीय भाषाएँ सम्मिलित हैं जो स्रोत से स्रोत C में जीओब्जेक्ट को संकलित करती हैं। जावा प्रोग्रामिंग भाषा C शैली का उपयोग करती है और [[वेनिला (कंप्यूटिंग)]] C कोड में पूर्व-संसाधित होती है। जीओब्जेक्ट या [https://www.jirka.org/gob.html जीओबी-2], जावा की मेमोरी मे एक टेम्पलेट विश्लेषण प्रदान करता है। | ||
== गोब्जेक्ट आत्मनिरीक्षण == | == गोब्जेक्ट आत्मनिरीक्षण == | ||
* [https://wiki.gnome.org/Projects/GObjectIntrospection GObject आत्मनिरीक्षण] संक्षिप्त जीआईआर<ref>{{cite web |title=आत्मनिरीक्षण, सारांश|url=https://developer.gnome.org/documentation/guidelines/programming/introspection.html |website=Gnome Developer, Programming Guidelines - Specific How-Tos |access-date=9 August 2020}}</ref> C लाइब्रेरी | * [https://wiki.gnome.org/Projects/GObjectIntrospection GObject आत्मनिरीक्षण] संक्षिप्त जीआईआर<ref>{{cite web |title=आत्मनिरीक्षण, सारांश|url=https://developer.gnome.org/documentation/guidelines/programming/introspection.html |website=Gnome Developer, Programming Guidelines - Specific How-Tos |access-date=9 August 2020}}</ref> C लाइब्रेरी जीओब्जेक्ट का उपयोग करके और भाषा बाइंडिंग सीएफ [[जीटीके के लिए भाषा बंधनों की सूची|जीटीके]] के लिए भाषा बाइंडिंग की सूची के बीच एक विदेशी फ़ंक्शन इंटरफ़ेस मध्य परत है। | ||
== उपयोग == | == उपयोग == | ||
सी और गोब्जेक्ट के संयोजन का उपयोग कई सफल मुक्त सॉफ्टवेयर जैसे कि गनोम डेस्कटॉप, जीटीके टूलकिट और जीआईएमपी छवि मैनीपुलेशन प्रोग्राम परियोजनाओं में किया जाता है। | सी और गोब्जेक्ट के संयोजन का उपयोग कई सफल मुक्त सॉफ्टवेयर जैसे कि गनोम डेस्कटॉप, जीटीके टूलकिट और जीआईएमपी छवि मैनीपुलेशन प्रोग्राम परियोजनाओं में किया जाता है। | ||
हालाँकि कई | हालाँकि कई जीओब्जेक्ट एप्लिकेशन पूरी तरह से C में लिखे गए हैं, जीओब्जेक्ट सिस्टम कई अन्य भाषाओं जैसे सी++, जावा, रूबी, पायथन, सामान्य लिस्प और डॉटनेट/मोनो के मूल ऑब्जेक्ट सिस्टम में अच्छी तरह से मैप करता है। जिसके परिणामस्वरूप जीओब्जेक्ट फ्रेमवर्क का उपयोग करने वाले अच्छी तरह से लिखित लाइब्रेरी के लिए भाषा बाइंडिंग बनाना सामान्यतः अपेक्षाकृत दोष रहित होता है। | ||
हालाँकि सबसे पहले C में | हालाँकि सबसे पहले C में जीओब्जेक्ट कोड लिखना अपेक्षाकृत क्रियात्मक है। लाइब्रेरी को सीखने में काफी समय लगता है और उच्च-स्तरीय वस्तु-उन्मुख भाषाओं में अनुभव वाले प्रोग्रामर को प्रायः C में जीओब्जेक्ट के साथ कार्य करना अपेक्षाकृत कठिन लगता है। उदाहरण के लिए एक उपवर्ग (यहां तक कि जीओब्जेक्ट का एक उपवर्ग भी) बनाना संभव हो सकता है। बड़ी मात्रा में [[बॉयलरप्लेट कोड]] लिखने या कॉपी करने की आवश्यकता होती है।<ref>{{cite web|title=एक नया गोब्जेक्ट कैसे परिभाषित और कार्यान्वित करें|url=https://developer.gnome.org/gobject/stable/howto-gobject.html|work=gnome.org|access-date=27 July 2013}}</ref> हालाँकि जावा का उपयोग करना एक ऐसी भाषा जो मुख्य रूप से जीओब्जेक्ट के साथ कार्य करने के लिए डिज़ाइन की गई है और जो C में परिवर्तित होती है और जीओब्जेक्ट के साथ कार्य करने या जीओब्जेक्ट आधारित लाइब्रेरी लिखने को अच्छा बनाने की संभावना है। हालाँकि वे वास्तव में [[प्रथम श्रेणी की वस्तु|प्रथम श्रेणी की वस्तुए]] नहीं हैं (जीटाइप में कोई वास्तविक मेटाटाइप नहीं हैं), कक्षाएं और इंटरफेस जैसे मेटाऑब्जेक्ट रनटाइम पर जीओब्जेक्ट अनुप्रयोगों द्वारा बनायी जाती हैं और [[आत्मनिरीक्षण (कंप्यूटर विज्ञान)]] के लिए अच्छा समर्थन प्रदान करती हैं। आत्मनिरीक्षण क्षमताओं का उपयोग भाषा बाइंडिंग और ग्लेड जैसे उपयोगकर्ता इंटरफ़ेस डिज़ाइन अनुप्रयोगों द्वारा किया जाता है ताकि एक साझा लाइब्रेरी को प्रयुक्त करने जैसी वस्तुओ को करने की स्वीकृति प्राप्त हो सके जो एक जीओब्जेक्ट क्लास प्रदान करता है जो सामान्यतः ग्लेड की स्थिति में कुछ प्रकार का विजेट प्रदान करता है और फिर क्लास के सभी गुणों की एक सूची प्राप्त करता है। इस प्रकार की जानकारी और दस्तावेज़ीकरण स्ट्रिंग्स के साथ पूर्ण होता है। | ||
== अन्य ऑब्जेक्ट सिस्टम से तुलना == | == अन्य ऑब्जेक्ट सिस्टम से तुलना == | ||
| Line 97: | Line 97: | ||
{{Unreferenced section|date=November 2018}} | {{Unreferenced section|date=November 2018}} | ||
<code>GObject</code> सी प्रोग्रामिंग के लिए प्रायः पूर्ण वस्तु प्रणाली प्रदान करता है।{{citation needed|date=November 2018}} इसे C-व्युत्पन्न भाषाओं जैसे | <code>GObject</code> सी प्रोग्रामिंग के लिए प्रायः पूर्ण वस्तु प्रणाली प्रदान करता है।{{citation needed|date=November 2018}} इसे C-व्युत्पन्न भाषाओं जैसे सी++ और वैकल्पिक-सी प्रोग्रामिंग के विकल्प के रूप में देखा जा सकता है। हालांकि दोनों अपनी-अपनी वस्तु प्रणाली के अतिरिक्त कई अन्य सुविधाएं भी प्रदान करती हैं। सी++ और जीओब्जेक्ट के बीच एक आसानी से देखा जाने वाला अंतर यह है कि जीओब्जेक्ट (जावा की तरह) कई भाषाओ का समर्थन नहीं करता है।<ref>{{Cite web|url=https://stackoverflow.com/questions/9747468/why-was-the-gobject-system-created/9747627|title=c++ - Why Was the GObject System Created?|website=Stack Overflow|access-date=2019-11-16}}</ref> | ||
<code>GObject</code> द्वारा GLib के g_[[malloc]] () मेमोरी आवंटन फ़ंक्शन के उपयोग से प्रोग्राम मेमोरी नष्ट होने पर बिना किसी कारण के यह बाहर निकल निकल जाता है। C लाइब्रेरी के Malloc(), | <code>GObject</code> द्वारा GLib के g_[[malloc]] () मेमोरी आवंटन फ़ंक्शन के उपयोग से प्रोग्राम मेमोरी नष्ट होने पर बिना किसी कारण के यह बाहर निकल निकल जाता है। C लाइब्रेरी के Malloc(), सी++ के नए और अन्य सामान्य मेमोरी आवंटन के विपरीत जो किसी प्रोग्राम मे एसका सामना करने या यहां तक कि पूरी तरह से पुनर्प्राप्त करने की स्वीकृति देता है। बस दुर्घटनाग्रस्त हुए बिना मेमोरी की स्थितियाँ<ref>{{Cite web|url=https://developer.gnome.org/glib/stable/glib-Memory-Allocation.html#g-malloc|title=Memory Allocation: GLib Reference Manual|website=developer.gnome.org|access-date=2019-11-16}}</ref> इस सॉफ्टवेयर में जीओब्जेक्ट को सम्मिलित करने के विपरीत कार्य करती है जहां सीमित मेमोरी के सामने नम्यता महत्वपूर्ण है या जहां बहुत अधिक या बहुत बड़ी वस्तुओं को सामान्यतः नियंत्रित किया जाता है। G_try_new() का उपयोग तब किया जा सकता है उदाहरण के लिए जब एक बड़ी वस्तु के लिए मेमोरी आवंटन विफल होने की अधिक संभावना होती है लेकिन यह स्वीकृति नहीं दे सकता है कि आवंटन कोड में कहीं और विफल नहीं हो सकता है।<ref>{{Cite web|url=https://developer.gnome.org/glib/stable/glib-Memory-Allocation.html#g-try-new|title=Memory Allocation: GLib Reference Manual|website=developer.gnome.org|access-date=2019-11-17}}</ref> | ||
इसका एक और महत्वपूर्ण अंतर यह है कि जबकि | इसका एक और महत्वपूर्ण अंतर यह है कि जबकि सी++ और वैकल्पिक-सी प्रोग्रामिंग अलग-अलग भाषाएं हैं तो जीओब्जेक्ट पूरी तरह से एक लाइब्रेरी है और इस प्रकार कोई नया विश्लेषण या कंपाइलर बुद्धिमत्ता प्रस्तुत नहीं करता है। उदाहरण के लिए <code>GObject</code>आधारित C कोड लिखते समय, स्पष्ट कास्टिंग करना प्रायः आवश्यक होता है।{{citation needed|date=November 2018}} इसलिए "<code>GObject</code> के साथ C" जिसे साधारण C से अलग भाषा के रूप में माना जाता है। वैकल्पिक C की तरह साधारण C का एक जटिल उच्च समूह सी++ है। | ||
उन प्लेटफ़ॉर्म पर जहां कोई मानक एबीआई नहीं है जो सभी | उन प्लेटफ़ॉर्म पर जहां कोई मानक एबीआई नहीं है जो सभी सी++ कंपाइलरों पर कार्य करता है जो सामान्यतः स्थित नहीं है, क्योंकि सामान्यतः इटेनियम एबीआई या माइक्रोसॉफ्ट एबीआई का अनुसरण किया जाता है। एक सी++ कंपाइलर के साथ संकलित लाइब्रेरी सदैव कॉल करने में सक्षम नहीं होती है लाइब्रेरी को किसी भिन्न लाइब्रेरी के साथ संकलित किया गया है। सभी निर्यातित प्रतीकों की विशिष्टता सुनिश्चित करने के लिए संकलक विभिन्न प्रकार के नाम प्रबंधन का उपयोग करते हैं। यह आवश्यक है क्योंकि, उदाहरण के लिए, दो अलग-अलग वर्गों में समान नाम वाले सदस्य फ़ंक्शन हो सकते हैं, एक फ़ंक्शन नाम कई बार ओवरलोड हो सकता है या समान नाम वाले फ़ंक्शन अलग-अलग नामस्थानों में दिखाई दे सकते हैं, लेकिन वैकल्पिक कोड में इन ओवरलैप्स की स्वीकृति नहीं है। {{citation needed|date=November 2018}} इसके विपरीत, चूंकि सी किसी भी प्रकार के ओवरलोडिंग या नेमस्पेसिंग का समर्थन नहीं करता है, सी लाइब्रेरी के लेखक सामान्यतः अपने निर्यातित नामों की वैश्विक विशिष्टता सुनिश्चित करने के लिए स्पष्ट उपसर्गों का उपयोग करते है।{{citation needed|date=November 2018}} इसलिए, वस्तु-उन्मुख होने के अतिरिक्त C में लिखी गई <code>GObject</code>आधारित लाइब्रेरी सदैव समान बाहरी प्रतीक नामों का उपयोग करती है फिर चाहे किसी भी कंपाइलर का उपयोग किया गया हो। | ||
लगभग अधिक अंतर संकेतों पर | लगभग अधिक अंतर संकेतों पर जीओब्जेक्ट का महत्व है जिसे अन्य भाषाओं में घटनाएँ कहा जाता है।{{citation needed|date=November 2018}} यह महत्व इस तथ्य से लिया गया है कि जीओब्जेक्ट को विशेष रूप से जीयूआई टूलकिट की आवश्यकताओ को पूरा करने के लिए डिज़ाइन किया गया था। जबकि अधिकांश वस्तु-उन्मुख भाषाओं के लिए संकेत लाइब्रेरी उपस्थित हैं, जीओब्जेक्ट की स्थिति में इसे वस्तु प्रणाली में बनाया गया है। इसी कारण से एक सामान्य जीओब्जेक्ट एप्लिकेशन गैर-<code>GObject</code> एप्लिकेशन की तुलना में बहुत अधिक स्थिति तक संकेत का उपयोग करता है। जिससे जीओब्जेक्ट घटकों को साधारण सी++ या जावा का उपयोग करने वाले घटकों की तुलना में बहुत अधिक स्पष्टीकरण और पुन: प्रयोज्य बना दिखाई देता है।{{citation needed|date=November 2018}}{{According to whom|date=November 2018}} यदि [[glibmm|<code>glibmm</code>]]<code>/[[gtkmm]]</code>, ग्लिब/जीटीके के लिए आधिकारिक प्रोग्रामिंग क्रमशः सी++ का उपयोग किया जाता है, तो साधारण libsigc++ मानक सी++ का उपयोग करके अंतर्निहित जीओब्जेक्ट संकेतों के आसान उपयोग की स्वीकृति देता है। यद्यपि संकेत के अन्य कार्यान्वयन लगभग सभी प्लेटफार्मों पर उपलब्ध हैं। हालांकि कभी-कभी एक अतिरिक्त लाइब्रेरी जैसे सी++ के लिए बूस्ट संकेत-2 की आवश्यकता होती है। | ||
{{See also|आईबीएम प्रणाली वस्तु मॉडल#संकलित वर्ग लाइब्रेरी के लिए समर्थन की तुलना|l1=सीओएम, वैकल्पिक-सी, एसओएम, विंडोज रनटाइम, एक्सपीकॉम के साथ तुलना}} | {{See also|आईबीएम प्रणाली वस्तु मॉडल#संकलित वर्ग लाइब्रेरी के लिए समर्थन की तुलना|l1=सीओएम, वैकल्पिक-सी, एसओएम, विंडोज रनटाइम, एक्सपीकॉम के साथ तुलना}} | ||
| Line 119: | Line 119: | ||
==बाहरी संबंध== | ==बाहरी संबंध== | ||
* [https://developer.gnome.org/gobject/stable/ The | * [https://developer.gnome.org/gobject/stable/ The जीओब्जेक्ट Reference Manual (and tutorial)] | ||
* [https://web.archive.org/web/20170202012725/http://article.gmane.org/gmane.comp.gnome.gtk%2B.devel.general/6329 GObject Tutorial Aug 2004] | * [https://web.archive.org/web/20170202012725/http://article.gmane.org/gmane.comp.gnome.gtk%2B.devel.general/6329 GObject Tutorial Aug 2004] | ||
* [https://www.jirka.org/gob.html GOB2 — the | * [https://www.jirka.org/gob.html GOB2 — the जीओब्जेक्ट Builder] | ||
* [https://wiki.gnome.org/Projects/Vala Vala Homepage] | * [https://wiki.gnome.org/Projects/Vala Vala Homepage] | ||
Revision as of 09:04, 26 June 2023
| Developer(s) | गनोम परियोजना |
|---|---|
| Initial release | 11 March 2002 |
| Written in | सी |
| Operating system | क्रॉस-प्लेटफॉर्म |
| Available in | बहुभाषी[which?] |
| Type | सॉफ्टवेयर लाइब्रेरी |
| License | जीएनयू एलजीपीएल |
| Website | developer |
जीएलआईबी ऑब्जेक्ट सिस्टम या जीओब्जेक्ट, एक मुक्त सॉफ्टवेयर लाइब्रेरी है जो पोर्टेबल ऑब्जेक्ट (वस्तु) सिस्टम और पारदर्शी अनुप्रस्थ-भाषा अंतर प्रचालनीयता प्रदान करती है। जीओब्जेक्ट को वस्तु-उन्मुख सी प्रोग्रामिंग आधारित एपीआई प्रदान करने के लिए सी प्रोग्राम में प्रत्यक्ष रूप मे उपयोग के लिए और पारदर्शी अनुप्रस्थ-भाषा अंतर प्रचालनीयता प्रदान करने के लिए अन्य भाषाओं में बाइंडिंग प्रोग्रामिंग के माध्यम से PyGObjectको डिज़ाइन किया गया है।
इतिहास
GLibऔर libcपर निर्भर करते हुए, जीओब्जेक्ट GNOME का आधार है। इसका उपयोग जीटीके, पंगो, अभिगम्यता टूलकिट और अधिकांश उच्च-स्तरीय जीनोम लाइब्रेरी जैसे GStreamerऔर अनुप्रयोगों में किया जाता है। GTK+ 2.0 से पहले जीओब्जेक्ट के समान कोड जीटीके कोडबेस का एक भाग था। यह "GObject" नाम अभी तक उपयोग में नहीं था, सामान्य आधारित क्लास को GtkObject कहा जाता था।
GTK+ 2.0 के प्रारम्भ होने पर इसकी सामान्य उपयोगिता के कारण वस्तु प्रणाली को एक अलग लाइब्रेरी में निकाला गया था। इस प्रक्रिया में GtkObject वर्ग के अधिकांश गैर-जीयूआई विशिष्ट भागों को जीओब्जेक्ट के नए सामान्य आधारित क्लास में ले जाया गया था। 11 मार्च 2002 (GTK+ 2.0 की प्रकाशन तिथि) से एक अलग लाइब्रेरी के रूप में अस्तित्व में आने के बाद जीओब्जेक्ट लाइब्रेरी का उपयोग अब कई गैर-जीयूआई प्रोग्रामों जैसे कमांड लाइन और सर्वर (कंप्यूटिंग) अनुप्रयोगों द्वारा किया जाता है।
जीएलआईबी से संबंध
हालाँकि जीओब्जेक्ट के पास दस्तावेज़ीकरण का अपना अलग समूह है[1] और सामान्यतः इसे अपनी साझा लाइब्रेरी फ़ाइल में संकलित किया जाता है। जीओब्जेक्ट का स्रोत कोड GLib स्रोत ट्री में रहता है और GLib के साथ वितरित किया जाता है। इस कारण से जीओब्जेक्ट GLib संस्करण संख्याओं का उपयोग करता है और सामान्यतः GLib के साथ पैक किया जाता है। उदाहरण के लिए डेबियन जीओब्जेक्ट को अपने libglib2.0 पैकेज समूह में रखता है।
टाइप प्रणाली
जीओब्जेक्ट फ्रेमवर्क के सबसे आधारिक स्तर पर एक सामान्य और गतिशील प्रकार की प्रणाली निहित है जिसे GTypeकहा जाता है। जीटाइप प्रणाली सभी ऑब्जेक्ट्स का रनटाइम विवरण रखता है जो ग्लू-कोड को कई भाषा बाइंडिंग की सुविधा प्रदान करता है। जीटाइप प्रणाली गैर-वर्गीकृत प्रकारों जैसे अपारदर्शी पॉइंटर्स, स्ट्रिंग और विभिन्न आकार के पूर्णांक और फ़्लोटिंग पॉइंट संख्याओं के अतिरिक्त किसी भी एकल विशेषता वाली वर्ग संरचना का संरक्षण करती है।
टाइप प्रणाली किसी भी पंजीकृत प्रकार से संबंधित मानों को आयोजित करना और नष्ट करना जानती है। यह पूर्णांक जैसे प्रकारों के लिए अपेक्षाकृत सामान्य है, लेकिन कई जटिल वस्तुओ की संदर्भ के लिए गणना की जाती हैं, जबकि कुछ वस्तुएँ जटिल हैं लेकिन उनकी संदर्भ-गणना नहीं की जाती हैं। जब टाइप प्रणाली किसी संदर्भ-गणित वस्तु का अनुकरण करता है तो यह सामान्यतः केवल इसकी संदर्भ संख्या को बढ़ाता है जबकि एक जटिल गैर संदर्भ गणना वाली वस्तु (जैसे कि एक स्ट्रिंग) की प्रतिलिपि बनाते समय यह सामान्यतः मेमोरी आवंटित करके एक वास्तविक प्रतिलिपि बनाता है।
इस आधारिक कार्यक्षमता का उपयोग GValue को प्रयुक्त करने के लिए किया जाता है। एक प्रकार की सामान्य गणना जो टाइप प्रणाली द्वारा ज्ञात किसी भी प्रकार के मान को धारण कर सकती है। ऐसी गणना विशेष रूप से उपयोगी होती हैं जब गतिशील रूप से टाइप किए गए भाषा वातावरण के साथ अनुमान करते हैं जिसमें सभी मूल मान टाइप-टैग की गई गणना में रहते हैं।
मौलिक प्रकार
वे प्रकार जिनमें कोई संबद्ध वर्ग नहीं होता है उन्हें गैर-वर्गीकृत कहा जाता है। ये प्रकार उन सभी प्रकारों के साथ जो मूल वर्ग के किसी न किसी रूप से अनुरूप हैं, मौलिक प्रकार के रूप में जाने जाते हैं। वे प्रकार जिनसे अन्य सभी प्रकार प्राप्त होते हैं ये एक अपेक्षाकृत संवृत समुच्चय बनाते हैं। हालांकि औसत उपयोगकर्ता से अपने स्वयं के मौलिक प्रकार बनाने की संभावना नहीं की जाती है और कस्टम क्लास पदानुक्रम बनाने के लिए इसका लाभ प्राप्त किया गया है अर्थात क्लास पदानुक्रम जीओब्जेक्ट क्लास पर आधारित नहीं हैं।
जीएलआईबी 2.9.2 के अनुसार,[2] गैर-वर्गीकृत अंतर्निर्मित मौलिक प्रकार हैं:
- एक रिक्त प्रकार, जो C के शून्य
void(G_TYPE_NONEके अनुरूप है। - सी प्रोग्रामिंग के हस्ताक्षरित और अहस्ताक्षरित प्रकार
char,int,long, और 64-बिट पूर्णांक (G_TYPE_CHAR,G_TYPE_UCHAR,G_TYPE_INT,G_TYPE_UINT,G_TYPE_LONG,G_TYPE_ULONG,G_TYPE_INT64, औरG_TYPE_UINT64) के अनुरूप है। - एक बूलियन प्रकार (
G_TYPE_BOOLEAN) है। - गणना प्रकार और फ्लैग प्रकार दोनों सी के
enumप्रकार के अनुरूप हैं, लेकिन इसमें भिन्नता है कि उत्तरार्द्ध का उपयोग केवल बिट क्षेत्र (G_TYPE_ENUMऔरG_TYPE_FLAGS) के लिए किया जाता है। - सी प्रोग्रामिंग के अनुरूप एकल और दोहरा परिशुद्धता आईईईई फ्लोट के लिए
floatऔरdoubleया (G_TYPE_FLOATऔरG_TYPE_DOUBLE) है। - एक स्ट्रिंग प्रकार, जो C के
char *(G_TYPE_STRING) के अनुरूप है। - एक अपारदर्शी सूचक प्रकार, जो C के
void *(G_TYPE_POINTER) के अनुरूप है।
वर्गीकृत अंतर्निहित मौलिक प्रकार हैं:
GObjectके उदाहरणों के लिए एक आधार क्लास प्रकार मानक क्लास उत्तराधिकारिक मूल (G_TYPE_OBJECT) है।- आधारिक इंटरफ़ेस प्रकार आधार क्लास प्रकार के अनुरूप लेकिन मानक इंटरफ़ेस उत्तराधिकारिक मूल
G_TYPE_INTERFACEका प्रतिनिधित्व करता है। - बॉक्सिंग संरचनाओं के लिए एक प्रकार, जिसका उपयोग साधारण मान वाली वस्तुओं या विदेशी वस्तुओं को संदर्भ-गणित "बॉक्स"
G_TYPE_BOXED) में प्रयुक्त करने के लिए किया जाता है। - "पैरामीटर विनिर्देश वस्तु" के लिए एक प्रकार, जिसका उपयोग वस्तु गुणों
G_TYPE_PARAMके लिए मेटाडेटा का वर्णन करने के लिए जीओब्जेक्ट में प्रयोग किया जाता है।
वे प्रकार जिन्हें टाइप प्रणाली द्वारा स्वचालित रूप से त्वरित किया जा सकता है तात्कालिक प्रकार कहलाते हैं। इन प्रकारों की एक महत्वपूर्ण विशेषता यह है कि किसी भी उदाहरण के पहले बाइट्स में सदैव उदाहरण के प्रकार से संबद्ध वर्ग संरचना (वर्चुअल तालिका का एक रूप) के लिए एक संकेतक होते है। इस कारण से किसी भी तात्कालिक प्रकार को वर्गीकृत किया जाना चाहिए। विरोधाभासी रूप से कोई भी गैर-वर्गीकृत प्रकार (जैसे पूर्णांक या स्ट्रिंग) गैर-तात्कालिक होना चाहिए। दूसरी ओर अधिकांश वर्गीकृत प्रकार तात्कालिक होते हैं, लेकिन कुछ, जैसे इंटरफ़ेस प्रकार तात्कालिक प्रकार नहीं होते हैं।
व्युत्पन्न प्रकार
अंतर्निहित जीओब्जेक्ट मौलिक प्रकारों से प्राप्त प्रकार सामान्यतः चार श्रेणियों में आते हैं:
- सूचीबद्ध प्रकार और फ्लैग प्रकार
- सामान्यतः प्रत्येक सूचीबद्ध प्रकार और प्रत्येक पूर्णांक-आधारित बिटफील्ड प्रकार (अर्थात, प्रत्येक
enumप्रकार) जिसे कोई किसी प्रकार से उपयोग करना चाहता है जो वस्तु प्रणाली से संबंधित है उदाहरण के लिए वस्तु विशेषता के प्रकार के रूप में पंजीकृत होना चाहिए। प्रकार प्रणाली के साथ सामान्यतः प्रारम्भिक कोड जो इन प्रकारों को पंजीकृत करने का ध्यान रखता है,glib-mkenumsनामक एक स्वचालित उपकरण द्वारा उत्पन्न किया जाता है और एक अलग फ़ाइल में संग्रहीत किया जाता है।[3] - बॉक्सिंग प्रकार
- कुछ डेटा संरचनाएँ जो पूर्ण श्रेणी प्रकार (सभी ओवरहेड व्यय के साथ) बनाने के लिए बहुत सरल हैं, उन्हें अभी भी टाइप प्रणाली के साथ पंजीकृत करने की आवश्यकता हो सकती है। उदाहरण के लिए हमारे पास एक वर्ग हो सकता है जिसमें हम
background-colorजोड़ना चाहते हैं, जिसका मान एक संरचना का उदाहरण होना चाहिए जोstruct color { int r, g, b; }. जीओब्जेक्ट को उपवर्गित करने से बचने के लिए हम इस संरचना का प्रतिनिधित्व करने के लिए एक बॉक्स प्रकार बना सकते हैं। प्रतिलिपि बनाने और मुक्त करने के लिए जीओब्जेक्ट फ़ंक्शन प्रदान कर सकते हैं। जीओब्जेक्ट सरल GLib डेटा प्रकारों को एकत्र बॉक्स प्रकार के साथ संयुक्त करता है। बॉक्सिंग प्रकारों के लिए एक अन्य उपयोग विदेशी वस्तुओं को एक टैग की गई गणना में प्रयुक्त करने के तरीके के रूप में है। जिसे टाइप सिस्टम पहचान सकता है और जान लेगा कि कैसे अनुकरण और मुक्त करना है। - अपारदर्शी सूचक प्रकार
- कभी-कभी, उन वस्तुओं के लिए जिन्हें न तो प्रतिलिपि करने, न ही संदर्भ-गणना करने और न ही मुक्त करने की आवश्यकता होती है। यहां तक कि एक बॉक्स प्रकार भी अतिविस्तार होगा। जबकि ऐसी वस्तुओं को केवल अपारदर्शी पॉइंटर्स
G_TYPE_POINTERके रूप में मानकर जीओब्जेक्ट में उपयोग किया जा सकता है। प्रायः एक व्युत्पन्न पॉइंटर प्रकार बनाना एक अच्छा विचार है। इस तथ्य का दस्तावेजीकरण करते हुए कि पॉइंटर्स को एक विशेष प्रकार की वस्तु का संदर्भ देना चाहिए, यद्यपि इसके विषय में और कुछ नही कहा जा सकता है। - वर्ग और इंटरफ़ेस प्रकार
GObjectएप्लिकेशन में अधिकांश प्रकार मूल वर्ग जीओब्जेक्ट से प्रत्यक्ष या अप्रत्यक्ष रूप से प्राप्त शब्द के सामान्य वस्तु उन्मुख अर्थ में कक्षाएं होती है। ऐसे इंटरफ़ेस भी हैं, जिनमें क्लासिक जावा-शैली इंटरफ़ेस के विपरीत कार्यान्वित प्रकार सम्मिलित हो सकते हैं। इस प्रकार जीओब्जेक्ट इंटरफेस को मिक्सिन के रूप में वर्णित किया जा सकता है।
मैसेजिंग प्रणाली
GObject मैसेजिंग प्रणाली में दो पूरक भाग क्लोजर और संकेत होते हैं।
- क्लोजर
GObjectक्लोजर कॉलबैक का एक सामान्यीकृत संस्करण है। C और सी++ में लिखे गए क्लोजर के साथ-साथ अपेक्षाकृत भाषाओं (जब बाइंडिंग प्रदान की जाती है) के लिए समर्थन उपस्थित है। यह (उदाहरण के लिए) पायथन और जावा में लिखे गए कोड को जीओब्जेक्ट क्लोजर के माध्यम से प्रयुक्त करने की स्वीकृति देता है।- संकेत
- संकेत प्राथमिक तंत्र है जिसके द्वारा क्लोजर प्रयुक्त किया जाता है। वस्तु संकेत श्रोताओं को टाइप प्रणाली के साथ पंजीकृत करते हैं, किसी दिए गए संकेत और दिए गए क्लोजर के बीच मैपिंग निर्दिष्ट करते हैं। एक पंजीकृत संकेत के उत्सर्जन पर उस संकेत का स्थगित होना प्रयुक्त हो जाता है। जीटीके में सभी मूल जीयूआई घटनाएं (जैसे माउस गति और कीबोर्ड क्रियाएं) श्रोताओं के लिए संभावित रूप से कार्य करने के लिए जीओब्जेक्ट संकेत उत्पन्न कर सकती हैं।
वर्ग कार्यान्वयन
प्रत्येक जीओब्जेक्ट वर्ग को कम से कम दो संरचनाओं, वर्ग संरचना और अनुरोध संरचना द्वारा कार्यान्वित किया जाता है।
- वर्ग संरचना
- वर्ग संरचना सी++ वर्ग की व्यवहार्यता के अनुरूप है। इसका प्रारम्भ उच्च क्लास की वर्ग संरचना से होनी चाहिए। इसके बाद यह फ़ंक्शन पॉइंटर्स का एक समूह रखेगा और क्लास की प्रत्येक वर्चुअल विधि के लिए एक वर्ग-विशिष्ट चर का उपयोग वर्ग के सदस्यों का अनुकरण करने के लिए किया जा सकता है।
- अनुरोध संरचना
अनुरोध संरचना जो प्रति वस्तु अनुरोध अनुकरण में सम्मिलित होती है। जिसे सुपरक्लास की अनुरोध संरचना से प्रारम्भ होना चाहिए (यह सुनिश्चित करता है कि सभी अनुरोध क्लास संरचना के लिए एक पॉइंटर से प्रारम्भ होते हैं, क्योंकि सभी मौलिक तात्कालिक प्रकार इस विशेषता को साझा करते हैं। सुपरक्लास से संबंधित डेटा के बाद संरचना सी++ सदस्य चर के अनुरूप किसी भी उदाहरण-विशिष्ट चर को धारण कर सकती है।
GObject फ्रेमवर्क में एक वर्ग को परिभाषित करना जटिल होता है, जिसके लिए बड़ी मात्रा में बॉयलरप्लेट कोड जैसे टाइप कास्टिंग मैक्रोज़ की मैन्युअल परिभाषा और अस्पष्ट प्रकार पंजीकरण की आवश्यकता होती है। इसके अतिरिक्त सी संरचना में "सार्वजनिक", "संरक्षित" या "निजी" जैसे एक्सेस संशोधक नहीं हो सकते हैं। स्पष्टीकरण प्रदान करने के लिए वर्कअराउंड का उपयोग किया जाना चाहिए। एक दृष्टिकोण निजी डेटा के लिए एक सूचक को सम्मिलित करना है। जिसे पारंपरिक रूप से अनुरोध संरचना में _priv कहा जाता है। निजी संरचना को सार्वजनिक हेडर फ़ाइल में घोषित किया जा सकता है, लेकिन केवल कार्यान्वयन फ़ाइल में परिभाषित किया जा सकता है, जिसका प्रभाव यह है कि निजी डेटा उपयोगकर्ताओं के लिए अपारदर्शी है, लेकिन कार्यान्वयनकर्ता के लिए पारदर्शी है। यदि निजी संरचना जीटाइप के साथ पंजीकृत है, तो इसे वस्तु प्रणाली द्वारा स्वचालित रूप से आवंटित किया जा सकता है। वास्तव में यदि कोई निजी डेटा की आवश्यकता होने पर प्रत्येक बार G_TYPE_INSTANCE_GET_PRIVATE का उपयोग करने को तैयार है, तो _priv पॉइंटर को सम्मिलित करना भी आवश्यक नहीं होता है।
इनमें से कुछ जटिलताओं को संबोधित करने के लिए कई उच्च-स्तरीय भाषाएँ सम्मिलित हैं जो स्रोत से स्रोत C में जीओब्जेक्ट को संकलित करती हैं। जावा प्रोग्रामिंग भाषा C शैली का उपयोग करती है और वेनिला (कंप्यूटिंग) C कोड में पूर्व-संसाधित होती है। जीओब्जेक्ट या जीओबी-2, जावा की मेमोरी मे एक टेम्पलेट विश्लेषण प्रदान करता है।
गोब्जेक्ट आत्मनिरीक्षण
- GObject आत्मनिरीक्षण संक्षिप्त जीआईआर[4] C लाइब्रेरी जीओब्जेक्ट का उपयोग करके और भाषा बाइंडिंग सीएफ जीटीके के लिए भाषा बाइंडिंग की सूची के बीच एक विदेशी फ़ंक्शन इंटरफ़ेस मध्य परत है।
उपयोग
सी और गोब्जेक्ट के संयोजन का उपयोग कई सफल मुक्त सॉफ्टवेयर जैसे कि गनोम डेस्कटॉप, जीटीके टूलकिट और जीआईएमपी छवि मैनीपुलेशन प्रोग्राम परियोजनाओं में किया जाता है।
हालाँकि कई जीओब्जेक्ट एप्लिकेशन पूरी तरह से C में लिखे गए हैं, जीओब्जेक्ट सिस्टम कई अन्य भाषाओं जैसे सी++, जावा, रूबी, पायथन, सामान्य लिस्प और डॉटनेट/मोनो के मूल ऑब्जेक्ट सिस्टम में अच्छी तरह से मैप करता है। जिसके परिणामस्वरूप जीओब्जेक्ट फ्रेमवर्क का उपयोग करने वाले अच्छी तरह से लिखित लाइब्रेरी के लिए भाषा बाइंडिंग बनाना सामान्यतः अपेक्षाकृत दोष रहित होता है।
हालाँकि सबसे पहले C में जीओब्जेक्ट कोड लिखना अपेक्षाकृत क्रियात्मक है। लाइब्रेरी को सीखने में काफी समय लगता है और उच्च-स्तरीय वस्तु-उन्मुख भाषाओं में अनुभव वाले प्रोग्रामर को प्रायः C में जीओब्जेक्ट के साथ कार्य करना अपेक्षाकृत कठिन लगता है। उदाहरण के लिए एक उपवर्ग (यहां तक कि जीओब्जेक्ट का एक उपवर्ग भी) बनाना संभव हो सकता है। बड़ी मात्रा में बॉयलरप्लेट कोड लिखने या कॉपी करने की आवश्यकता होती है।[5] हालाँकि जावा का उपयोग करना एक ऐसी भाषा जो मुख्य रूप से जीओब्जेक्ट के साथ कार्य करने के लिए डिज़ाइन की गई है और जो C में परिवर्तित होती है और जीओब्जेक्ट के साथ कार्य करने या जीओब्जेक्ट आधारित लाइब्रेरी लिखने को अच्छा बनाने की संभावना है। हालाँकि वे वास्तव में प्रथम श्रेणी की वस्तुए नहीं हैं (जीटाइप में कोई वास्तविक मेटाटाइप नहीं हैं), कक्षाएं और इंटरफेस जैसे मेटाऑब्जेक्ट रनटाइम पर जीओब्जेक्ट अनुप्रयोगों द्वारा बनायी जाती हैं और आत्मनिरीक्षण (कंप्यूटर विज्ञान) के लिए अच्छा समर्थन प्रदान करती हैं। आत्मनिरीक्षण क्षमताओं का उपयोग भाषा बाइंडिंग और ग्लेड जैसे उपयोगकर्ता इंटरफ़ेस डिज़ाइन अनुप्रयोगों द्वारा किया जाता है ताकि एक साझा लाइब्रेरी को प्रयुक्त करने जैसी वस्तुओ को करने की स्वीकृति प्राप्त हो सके जो एक जीओब्जेक्ट क्लास प्रदान करता है जो सामान्यतः ग्लेड की स्थिति में कुछ प्रकार का विजेट प्रदान करता है और फिर क्लास के सभी गुणों की एक सूची प्राप्त करता है। इस प्रकार की जानकारी और दस्तावेज़ीकरण स्ट्रिंग्स के साथ पूर्ण होता है।
अन्य ऑब्जेक्ट सिस्टम से तुलना
This section possibly contains original research. (December 2011) (Learn how and when to remove this template message) |
This section does not cite any sources. (November 2018) (Learn how and when to remove this template message) |
GObject सी प्रोग्रामिंग के लिए प्रायः पूर्ण वस्तु प्रणाली प्रदान करता है।[citation needed] इसे C-व्युत्पन्न भाषाओं जैसे सी++ और वैकल्पिक-सी प्रोग्रामिंग के विकल्प के रूप में देखा जा सकता है। हालांकि दोनों अपनी-अपनी वस्तु प्रणाली के अतिरिक्त कई अन्य सुविधाएं भी प्रदान करती हैं। सी++ और जीओब्जेक्ट के बीच एक आसानी से देखा जाने वाला अंतर यह है कि जीओब्जेक्ट (जावा की तरह) कई भाषाओ का समर्थन नहीं करता है।[6]
GObject द्वारा GLib के g_malloc () मेमोरी आवंटन फ़ंक्शन के उपयोग से प्रोग्राम मेमोरी नष्ट होने पर बिना किसी कारण के यह बाहर निकल निकल जाता है। C लाइब्रेरी के Malloc(), सी++ के नए और अन्य सामान्य मेमोरी आवंटन के विपरीत जो किसी प्रोग्राम मे एसका सामना करने या यहां तक कि पूरी तरह से पुनर्प्राप्त करने की स्वीकृति देता है। बस दुर्घटनाग्रस्त हुए बिना मेमोरी की स्थितियाँ[7] इस सॉफ्टवेयर में जीओब्जेक्ट को सम्मिलित करने के विपरीत कार्य करती है जहां सीमित मेमोरी के सामने नम्यता महत्वपूर्ण है या जहां बहुत अधिक या बहुत बड़ी वस्तुओं को सामान्यतः नियंत्रित किया जाता है। G_try_new() का उपयोग तब किया जा सकता है उदाहरण के लिए जब एक बड़ी वस्तु के लिए मेमोरी आवंटन विफल होने की अधिक संभावना होती है लेकिन यह स्वीकृति नहीं दे सकता है कि आवंटन कोड में कहीं और विफल नहीं हो सकता है।[8]
इसका एक और महत्वपूर्ण अंतर यह है कि जबकि सी++ और वैकल्पिक-सी प्रोग्रामिंग अलग-अलग भाषाएं हैं तो जीओब्जेक्ट पूरी तरह से एक लाइब्रेरी है और इस प्रकार कोई नया विश्लेषण या कंपाइलर बुद्धिमत्ता प्रस्तुत नहीं करता है। उदाहरण के लिए GObjectआधारित C कोड लिखते समय, स्पष्ट कास्टिंग करना प्रायः आवश्यक होता है।[citation needed] इसलिए "GObject के साथ C" जिसे साधारण C से अलग भाषा के रूप में माना जाता है। वैकल्पिक C की तरह साधारण C का एक जटिल उच्च समूह सी++ है।
उन प्लेटफ़ॉर्म पर जहां कोई मानक एबीआई नहीं है जो सभी सी++ कंपाइलरों पर कार्य करता है जो सामान्यतः स्थित नहीं है, क्योंकि सामान्यतः इटेनियम एबीआई या माइक्रोसॉफ्ट एबीआई का अनुसरण किया जाता है। एक सी++ कंपाइलर के साथ संकलित लाइब्रेरी सदैव कॉल करने में सक्षम नहीं होती है लाइब्रेरी को किसी भिन्न लाइब्रेरी के साथ संकलित किया गया है। सभी निर्यातित प्रतीकों की विशिष्टता सुनिश्चित करने के लिए संकलक विभिन्न प्रकार के नाम प्रबंधन का उपयोग करते हैं। यह आवश्यक है क्योंकि, उदाहरण के लिए, दो अलग-अलग वर्गों में समान नाम वाले सदस्य फ़ंक्शन हो सकते हैं, एक फ़ंक्शन नाम कई बार ओवरलोड हो सकता है या समान नाम वाले फ़ंक्शन अलग-अलग नामस्थानों में दिखाई दे सकते हैं, लेकिन वैकल्पिक कोड में इन ओवरलैप्स की स्वीकृति नहीं है।[citation needed] इसके विपरीत, चूंकि सी किसी भी प्रकार के ओवरलोडिंग या नेमस्पेसिंग का समर्थन नहीं करता है, सी लाइब्रेरी के लेखक सामान्यतः अपने निर्यातित नामों की वैश्विक विशिष्टता सुनिश्चित करने के लिए स्पष्ट उपसर्गों का उपयोग करते है।[citation needed] इसलिए, वस्तु-उन्मुख होने के अतिरिक्त C में लिखी गई GObjectआधारित लाइब्रेरी सदैव समान बाहरी प्रतीक नामों का उपयोग करती है फिर चाहे किसी भी कंपाइलर का उपयोग किया गया हो।
लगभग अधिक अंतर संकेतों पर जीओब्जेक्ट का महत्व है जिसे अन्य भाषाओं में घटनाएँ कहा जाता है।[citation needed] यह महत्व इस तथ्य से लिया गया है कि जीओब्जेक्ट को विशेष रूप से जीयूआई टूलकिट की आवश्यकताओ को पूरा करने के लिए डिज़ाइन किया गया था। जबकि अधिकांश वस्तु-उन्मुख भाषाओं के लिए संकेत लाइब्रेरी उपस्थित हैं, जीओब्जेक्ट की स्थिति में इसे वस्तु प्रणाली में बनाया गया है। इसी कारण से एक सामान्य जीओब्जेक्ट एप्लिकेशन गैर-GObject एप्लिकेशन की तुलना में बहुत अधिक स्थिति तक संकेत का उपयोग करता है। जिससे जीओब्जेक्ट घटकों को साधारण सी++ या जावा का उपयोग करने वाले घटकों की तुलना में बहुत अधिक स्पष्टीकरण और पुन: प्रयोज्य बना दिखाई देता है।[citation needed][according to whom?] यदि glibmm/gtkmm, ग्लिब/जीटीके के लिए आधिकारिक प्रोग्रामिंग क्रमशः सी++ का उपयोग किया जाता है, तो साधारण libsigc++ मानक सी++ का उपयोग करके अंतर्निहित जीओब्जेक्ट संकेतों के आसान उपयोग की स्वीकृति देता है। यद्यपि संकेत के अन्य कार्यान्वयन लगभग सभी प्लेटफार्मों पर उपलब्ध हैं। हालांकि कभी-कभी एक अतिरिक्त लाइब्रेरी जैसे सी++ के लिए बूस्ट संकेत-2 की आवश्यकता होती है।
यह भी देखें
- वैला (प्रोग्रामिंग भाषा)-
GObject-आधारित प्रोग्रामिंग भाषा जिसमें C जैसा वाक्य विन्यास स्रोत कंपाइलर है। - जिन्न (प्रोग्रामिंग भाषा) - पायथन-शैली वैला कंपाइलर के लिए वैकल्पिक वाक्य विन्यास स्रोत है।
संदर्भ
- ↑ "GObject Reference Manual".
- ↑ "GObject Reference Manual - Stable".
- ↑ "glib-mkenums, GObject Reference Manual".
- ↑ "आत्मनिरीक्षण, सारांश". Gnome Developer, Programming Guidelines - Specific How-Tos. Retrieved 9 August 2020.
- ↑ "एक नया गोब्जेक्ट कैसे परिभाषित और कार्यान्वित करें". gnome.org. Retrieved 27 July 2013.
- ↑ "c++ - Why Was the GObject System Created?". Stack Overflow. Retrieved 2019-11-16.
- ↑ "Memory Allocation: GLib Reference Manual". developer.gnome.org. Retrieved 2019-11-16.
- ↑ "Memory Allocation: GLib Reference Manual". developer.gnome.org. Retrieved 2019-11-17.