गोऑब्जेक्ट: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 24: Line 24:
}}
}}


[[File:Linux kernel System Call Interface and glibc.svg|thumb|300px|चूंकि [[जीएनयू सी लाइब्रेरी]] [[लिनक्स कर्नेल]] [[सिस्टम कॉल]] के लिए एक रैपर के रूप में कार्य करती है, इसलिए जीएलआईबी (जीओब्जेक्ट, जीएलआईबी, [[जीमॉड्यूल]], जीटीएचड और जीआईओ (सॉफ्टवेयर)) में बंडल किए गए पुस्तकालय अपने विशिष्ट कार्यों के लिए आगे के रैपर के रूप में काम करते हैं।]]जीएलआईबी[[ वस्तु प्रणाली | ऑब्जेक्ट सिस्टम]] या '''जीओब्जेक्ट''', एक [[मुफ्त सॉफ्टवेयर]] [[ सॉफ्टवेयर पुस्तकालय |सॉफ्टवेयर पुस्तकालय]] है जो पोर्टेबल ऑब्जेक्ट (वस्तु) सिस्टम और पारदर्शी क्रॉस-लैंग्वेज अंतर प्रचालनीयता प्रदान करती है। <code>GObject</code>को वस्तु-उन्मुख C-आधारित एपीआई प्रदान करने के लिए C प्रोग्राम में सीधे उपयोग के लिए और पारदर्शी क्रॉस-लैंग्वेज अंतर प्रचालनीयता प्रदान करने के लिए अन्य भाषाओं में बाइंडिंग के माध्यम से उपयोग के लिए [[PyGObject]] डिज़ाइन किया गया है।
[[File:Linux kernel System Call Interface and glibc.svg|thumb|300px|चूंकि [[जीएनयू सी लाइब्रेरी]] [[लिनक्स कर्नेल]] [[सिस्टम कॉल]] के लिए एक रैपर के रूप में कार्य करती है, इसलिए जीएलआईबी (जीओब्जेक्ट, जीएलआईबी, [[जीमॉड्यूल]], जीटीएचड और जीआईओ (सॉफ्टवेयर)) में बंडल किए गए लाइब्रेरी अपने विशिष्ट कार्यों के लिए आगे के रैपर के रूप में काम करते हैं।]]जीएलआईबी[[ वस्तु प्रणाली | ऑब्जेक्ट सिस्टम]] या '''जीओब्जेक्ट''', एक [[मुफ्त सॉफ्टवेयर|मुक्त सॉफ्टवेयर]] [[ सॉफ्टवेयर पुस्तकालय |लाइब्रेरी]] है जो पोर्टेबल ऑब्जेक्ट (वस्तु) सिस्टम और पारदर्शी अनुप्रस्थ-भाषा अंतर प्रचालनीयता प्रदान करती है। <code>GObject</code>को वस्तु-उन्मुख सी प्रोग्रामिंग आधारित एपीआई प्रदान करने के लिए सी प्रोग्राम में प्रत्यक्ष रूप मे उपयोग के लिए और पारदर्शी अनुप्रस्थ-भाषा अंतर प्रचालनीयता प्रदान करने के लिए अन्य भाषाओं में बाइंडिंग प्रोग्रामिंग के माध्यम से [[PyGObject|<code>PyGObject</code>]]को डिज़ाइन किया गया है।


== इतिहास ==
== इतिहास ==
केवल GLib और libc पर निर्भर करते हुए, <code>GObject</code> <code>GNOME</code> की आधारशिला है और इसका उपयोग [[GTK]], [[Pango]], [[अभिगम्यता टूलकिट]] और अधिकांश उच्च-स्तरीय जीनोम लाइब्रेरी जैसे [[GStreamer|<code>GStreamer</code>]]और अनुप्रयोगों में किया जाता है। GTK+ 2.0 से पहले, <code>GObject</code> के समान कोड GTK कोडबेस का हिस्सा था। "<code>GObject</code>" नाम अभी तक उपयोग में नहीं था, सामान्य बेसक्लास को <code>GtkObject</code> कहा जाता था।
<code>GLib</code>और <code>libc</code>पर निर्भर करते हुए, <code>GObject</code> <code>GNOME</code> का आधार है। इसका उपयोग [[GTK|जीटीके]], [[Pango|पंगो]], [[अभिगम्यता टूलकिट]] और अधिकांश उच्च-स्तरीय जीनोम लाइब्रेरी जैसे [[GStreamer|<code>GStreamer</code>]]और अनुप्रयोगों में किया जाता है। <code>GTK+ 2.0</code> से पहले <code>GObject</code> के समान कोड जीटीके कोडबेस का एक भाग था। यह "<code>GObject</code>" नाम अभी तक उपयोग में नहीं था, सामान्य आधारित क्लास को <code>GtkObject</code> कहा जाता था।


जीटीके+ 2.0 के जारी होने पर, इसकी सामान्य उपयोगिता के कारण ऑब्जेक्ट सिस्टम को एक अलग लाइब्रेरी में निकाला गया था। इस प्रक्रिया में, <code>GtkObject</code> वर्ग के अधिकांश गैर-जीयूआई-विशिष्ट भागों को <code>GObject</code>, नए सामान्य बेसक्लास में ले जाया गया। 11 मार्च 2002 (जीटीके+ 2.0 की रिलीज़ तिथि) से एक अलग लाइब्रेरी के रूप में अस्तित्व में आने के बाद, गोब्जेक्ट लाइब्रेरी का उपयोग अब कई गैर-जीयूआई कार्यक्रमों जैसे [[कमांड लाइन]] और [[सर्वर (कंप्यूटिंग)]] अनुप्रयोगों द्वारा किया जाता है।
<code>GTK+ 2.0</code> के प्रारम्भ होने पर इसकी सामान्य उपयोगिता के कारण वस्तु प्रणाली को एक अलग लाइब्रेरी में निकाला गया था। इस प्रक्रिया में <code>GtkObject</code> वर्ग के अधिकांश गैर-जीयूआई विशिष्ट भागों को <code>GObject</code> के नए सामान्य आधारित क्लास में ले जाया गया था। 11 मार्च 2002 (<code>GTK+ 2.0</code> की प्रकाशन तिथि) से एक अलग लाइब्रेरी के रूप में अस्तित्व में आने के बाद <code>GObject</code> लाइब्रेरी का उपयोग अब कई गैर-जीयूआई प्रोग्रामों जैसे [[कमांड लाइन]] और [[सर्वर (कंप्यूटिंग)]] अनुप्रयोगों द्वारा किया जाता है।


== जीएलआईबी से संबंध ==
== जीएलआईबी से संबंध ==
हालाँकि <code>GObject</code> के पास दस्तावेज़ीकरण का अपना अलग सेट है<ref>{{cite web|url=https://developer.gnome.org/gobject/stable/|title=GObject Reference Manual}}</ref> और सामान्यतः इसे अपनी साझा लाइब्रेरी फ़ाइल में संकलित किया जाता है, <code>GObject</code> का स्रोत कोड GLib स्रोत ट्री में रहता है और GLib के साथ वितरित किया जाता है। इस कारण से, <code>GObject</code> GLib संस्करण संख्याओं का उपयोग करता है और सामान्यतः GLib के साथ पैक किया जाता है (उदाहरण के लिए, [[डेबियन]] <code>GObject</code> को अपने <code>libglib2.0</code> पैकेज परिवार में रखता है)।
हालाँकि <code>GObject</code> के पास दस्तावेज़ीकरण का अपना अलग समूह है<ref>{{cite web|url=https://developer.gnome.org/gobject/stable/|title=GObject Reference Manual}}</ref> और सामान्यतः इसे अपनी साझा लाइब्रेरी फ़ाइल में संकलित किया जाता है। <code>GObject</code> का स्रोत कोड <code>GLib</code> स्रोत ट्री में रहता है और <code>GLib</code> के साथ वितरित किया जाता है। इस कारण से <code>GObject</code> <code>GLib</code> संस्करण संख्याओं का उपयोग करता है और सामान्यतः <code>GLib</code> के साथ पैक किया जाता है। उदाहरण के लिए, [[डेबियन]] <code>GObject</code> को अपने <code>libglib2.0</code> पैकेज समूह में रखता है।


== टाइप सिस्टम ==
== टाइप प्रणाली ==
<code>GObject</code> फ्रेमवर्क के सबसे बुनियादी स्तर पर एक सामान्य और गतिशील प्रकार की प्रणाली निहित है जिसे GType कहा जाता है। जीटाइप सिस्टम सभी ऑब्जेक्ट्स का रनटाइम विवरण रखता है जो ग्लू कोड को कई भाषा बाइंडिंग की सुविधा प्रदान करता है। प्रकार प्रणाली गैर-वर्गीकृत प्रकारों जैसे अपारदर्शी पॉइंटर्स, [[ स्ट्रिंग (कंप्यूटर विज्ञान) |स्ट्रिंग]] और विभिन्न आकार के पूर्णांक और फ़्लोटिंग पॉइंट संख्याओं के अलावा, किसी भी एकल विरासत वाली वर्ग संरचना को संभाल सकती है।
जीओब्जेक्ट फ्रेमवर्क के सबसे आधारिक स्तर पर एक सामान्य और गतिशील प्रकार की प्रणाली निहित है जिसे <code>GType</code>कहा जाता है। जीटाइप प्रणाली सभी ऑब्जेक्ट्स का रनटाइम विवरण रखता है जो ग्लू-कोड को कई भाषा बाइंडिंग की सुविधा प्रदान करता है। जीटाइप प्रणाली गैर-वर्गीकृत प्रकारों जैसे अपारदर्शी पॉइंटर्स, [[ स्ट्रिंग (कंप्यूटर विज्ञान) |स्ट्रिंग]] और विभिन्न आकार के पूर्णांक और फ़्लोटिंग पॉइंट संख्याओं के अतिरिक्त किसी भी एकल विशेषता वाली वर्ग संरचना का संरक्षण करती है।


टाइप सिस्टम जानता है कि किसी भी पंजीकृत प्रकार से संबंधित मूल्यों को कैसे कॉपी, असाइन और नष्ट किया जाए। यह पूर्णांक जैसे प्रकारों के लिए मामूली है, लेकिन कई जटिल वस्तुएं संदर्भ-गणना की जाती हैं, जबकि कुछ जटिल हैं लेकिन संदर्भ-गणना नहीं की जाती हैं। जब टाइप सिस्टम किसी संदर्भ-गणित वस्तु की "कॉपी" करता है, तो यह सामान्यतः केवल इसकी संदर्भ संख्या को बढ़ाएगा, जबकि एक जटिल गैर-संदर्भ-गिनती वाली वस्तु (जैसे कि एक स्ट्रिंग) की प्रतिलिपि बनाते समय यह सामान्यतः मेमोरी आवंटित करके एक वास्तविक प्रतिलिपि बनाएगा।
टाइप प्रणाली किसी भी पंजीकृत प्रकार से संबंधित मानों को आयोजित करना और नष्ट करना जानती है। यह पूर्णांक जैसे प्रकारों के लिए अपेक्षाकृत सामान्य है, लेकिन कई जटिल वस्तुओ की संदर्भ के लिए गणना की जाती हैं, जबकि कुछ वस्तुएँ जटिल हैं लेकिन उनकी संदर्भ-गणना नहीं की जाती हैं। जब टाइप प्रणाली किसी संदर्भ-गणित वस्तु का अनुकरण करता है तो यह सामान्यतः केवल इसकी संदर्भ संख्या को बढ़ाता है जबकि एक जटिल गैर संदर्भ गणना वाली वस्तु (जैसे कि एक स्ट्रिंग) की प्रतिलिपि बनाते समय यह सामान्यतः मेमोरी आवंटित करके एक वास्तविक प्रतिलिपि बनाता है।


इस बुनियादी कार्यक्षमता का उपयोग <code>GValue</code> को लागू करने के लिए किया जाता है, एक प्रकार का सामान्य कंटेनर जो टाइप सिस्टम द्वारा ज्ञात किसी भी प्रकार के मान को धारण कर सकता है। ऐसे कंटेनर विशेष रूप से उपयोगी होते हैं जब गतिशील रूप से टाइप किए गए भाषा वातावरण के साथ बातचीत करते हैं जिसमें सभी मूल मान ऐसे टाइप-टैग किए गए कंटेनर में रहते हैं।
इस आधारिक कार्यक्षमता का उपयोग <code>GValue</code> को प्रयुक्त करने के लिए किया जाता है। एक प्रकार की सामान्य गणना जो टाइप प्रणाली द्वारा ज्ञात किसी भी प्रकार के मान को धारण कर सकती है। ऐसी गणना विशेष रूप से उपयोगी होती हैं जब गतिशील रूप से टाइप किए गए भाषा वातावरण के साथ अनुमान करते हैं जिसमें सभी मूल मान टाइप-टैग की गई गणना में रहते हैं।


=== मौलिक प्रकार ===
=== मौलिक प्रकार ===
वे प्रकार जिनमें कोई संबद्ध वर्ग नहीं होता, उन्हें गैर-वर्गीकृत कहा जाता है। ये प्रकार, उन सभी प्रकारों के साथ, जो मूल वर्ग के किसी न किसी रूप से मेल खाते हैं, मौलिक प्रकार के रूप में जाने जाते हैं: वे प्रकार जिनसे अन्य सभी प्रकार प्राप्त होते हैं। ये एक अपेक्षाकृत बंद सेट बनाते हैं, लेकिन हालांकि औसत उपयोगकर्ता से अपने स्वयं के मौलिक प्रकार बनाने की उम्मीद नहीं की जाती है, संभावना मौजूद है और कस्टम क्लास पदानुक्रम बनाने के लिए इसका फायदा उठाया गया है - यानी, क्लास पदानुक्रम <code>GObject</code> क्लास पर आधारित नहीं हैं।
वे प्रकार जिनमें कोई संबद्ध वर्ग नहीं होता है उन्हें गैर-वर्गीकृत कहा जाता है। ये प्रकार उन सभी प्रकारों के साथ जो मूल वर्ग के किसी न किसी रूप से अनुरूप हैं, मौलिक प्रकार के रूप में जाने जाते हैं। वे प्रकार जिनसे अन्य सभी प्रकार प्राप्त होते हैं। ये एक अपेक्षाकृत संवृत समुच्चय बनाते हैं। हालांकि औसत उपयोगकर्ता से अपने स्वयं के मौलिक प्रकार बनाने की संभावना नहीं की जाती है और कस्टम क्लास पदानुक्रम बनाने के लिए इसका लाभ प्राप्त किया गया है अर्थात क्लास पदानुक्रम <code>GObject</code> क्लास पर आधारित नहीं हैं।


जीएलआईबी 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> गैर-वर्गीकृत अंतर्निर्मित मौलिक प्रकार हैं:
* एक खाली प्रकार, सी के अनुरूप <code>void</code> (<code>G_TYPE_NONE</code>);
* एक रिक्त प्रकार, जो C के शून्य<code>void</code> (<code>G_TYPE_NONE</code> के अनुरूप है।
*सी के हस्ताक्षरित और अहस्ताक्षरित प्रकार के अनुरूप <code>char</code>, <code>int</code>, <code>long</code>, और 64-बिट पूर्णांक (<code>G_TYPE_CHAR</code>, <code>G_TYPE_UCHAR</code>, <code>G_TYPE_INT</code>, <code>G_TYPE_UINT</code>, <code>G_TYPE_LONG</code>, <code>G_TYPE_ULONG</code>, <code>G_TYPE_INT64</code>, और <code>G_TYPE_UINT64</code>);
*सी प्रोग्रामिंग के हस्ताक्षरित और अहस्ताक्षरित प्रकार <code>char</code>, <code>int</code>, <code>long</code>, और 64-बिट पूर्णांक (<code>G_TYPE_CHAR</code>, <code>G_TYPE_UCHAR</code>, <code>G_TYPE_INT</code>, <code>G_TYPE_UINT</code>, <code>G_TYPE_LONG</code>, <code>G_TYPE_ULONG</code>, <code>G_TYPE_INT64</code>, और <code>G_TYPE_UINT64</code>) के अनुरूप है।
* एक बूलियन प्रकार (<code>G_TYPE_BOOLEAN</code>);
* एक बूलियन प्रकार (<code>G_TYPE_BOOLEAN</code>) है।
* एक गणना प्रकार और एक "झंडे" प्रकार, दोनों सी के अनुरूप <code>enum</code> प्रकार, लेकिन इसमें भिन्नता है कि बाद वाले का उपयोग केवल [[बिट फ़ील्ड]] के लिए किया जाता है (<code>G_TYPE_ENUM</code> और <code>G_TYPE_FLAGS</code>);
* गणना प्रकार और फ्लैग प्रकार दोनों सी के <code>enum</code> प्रकार के अनुरूप हैं, लेकिन इसमें भिन्नता है कि उत्तरार्द्ध का उपयोग केवल [[बिट फ़ील्ड|बिट क्षेत्र]] (<code>G_TYPE_ENUM</code> और <code>G_TYPE_FLAGS</code>) के लिए किया जाता है।
* सी के अनुरूप सिंगल- और डबल-परिशुद्धता [[आईईईई फ्लोट]] के लिए प्रकार <code>float</code> और <code>double</code> (<code>G_TYPE_FLOAT</code> और <code>G_TYPE_DOUBLE</code>);
* सी प्रोग्रामिंग के अनुरूप एकल और दोहरा परिशुद्धता [[आईईईई फ्लोट]] के लिए <code>float</code> और <code>double</code> या (<code>G_TYPE_FLOAT</code> और <code>G_TYPE_DOUBLE</code>) है।
* एक स्ट्रिंग प्रकार, सी के अनुरूप <code>char *</code> (<code>G_TYPE_STRING</code>);
* एक स्ट्रिंग प्रकार, जो C के <code>char *</code> (<code>G_TYPE_STRING</code>) के अनुरूप है।
* एक अपारदर्शी सूचक प्रकार, सी के अनुरूप <code>void *</code> (<code>G_TYPE_POINTER</code>).
* एक अपारदर्शी सूचक प्रकार, जो C के <code>void *</code> (<code>G_TYPE_POINTER</code>) के अनुरूप है।


वर्गीकृत अंतर्निहित मौलिक प्रकार हैं:
वर्गीकृत अंतर्निहित मौलिक प्रकार हैं:
* के उदाहरणों के लिए एक आधार वर्ग प्रकार <code>GObject</code>, मानक वर्ग वंशानुक्रम वृक्ष की जड़ (<code>G_TYPE_OBJECT</code>)
* <code>GObject</code>के उदाहरणों के लिए एक आधार क्लास प्रकार मानक क्लास उत्तराधिकारिक मूल (<code>G_TYPE_OBJECT</code>) है।
* एक बेस इंटरफ़ेस प्रकार, बेस क्लास प्रकार के अनुरूप लेकिन मानक इंटरफ़ेस इनहेरिटेंस ट्री की जड़ का प्रतिनिधित्व करता है (<code>G_TYPE_INTERFACE</code>)
* आधारिक इंटरफ़ेस प्रकार आधार क्लास प्रकार के अनुरूप लेकिन मानक इंटरफ़ेस उत्तराधिकारिक मूल <code>G_TYPE_INTERFACE</code> का प्रतिनिधित्व करता है।
* [[बॉक्सिंग प्रकार]] की संरचनाओं के लिए एक प्रकार, जिसका उपयोग संदर्भ-गणना "बक्से" में साधारण मूल्य वस्तुओं या विदेशी वस्तुओं को लपेटने के लिए किया जाता है (<code>G_TYPE_BOXED</code>)
* [[बॉक्सिंग प्रकार|बॉक्सिंग]] संरचनाओं के लिए एक प्रकार, जिसका उपयोग साधारण मान वाली वस्तुओं या विदेशी वस्तुओं को संदर्भ-गणित "बॉक्स" <code>G_TYPE_BOXED</code>) में प्रयुक्त करने के लिए किया जाता है।
* "पैरामीटर विनिर्देश ऑब्जेक्ट्स" के लिए एक प्रकार, जिसका उपयोग <code>GObject</code> में ऑब्जेक्ट गुणों के लिए [[ मेटा डेटा |मेटा डेटा]] का वर्णन करने के लिए किया जाता है (<code>G_TYPE_PARAM</code>).
* "पैरामीटर विनिर्देश वस्तु" के लिए एक प्रकार, जिसका उपयोग वस्तु गुणों <code>G_TYPE_PARAM</code> के लिए मेटाडेटा का वर्णन करने के लिए <code>GObject</code> में प्रयोग किया जाता है।


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


=== व्युत्पन्न प्रकार ===
=== व्युत्पन्न प्रकार ===
अंतर्निहित <code>GObject</code> मौलिक प्रकारों से प्राप्त होने वाले प्रकार गिरते हैं
अंतर्निहित <code>GObject</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>GObject</code> को उपवर्गित करने से बचने के लिए, हम इस संरचना का प्रतिनिधित्व करने के लिए एक बॉक्स प्रकार बना सकते हैं, और प्रतिलिपि बनाने और मुक्त करने के लिए फ़ंक्शन प्रदान कर सकते हैं। GObject सरल GLib डेटा प्रकारों को लपेटने वाले मुट्ठी भर बॉक्स प्रकार के साथ जहाज करता है। बॉक्सिंग प्रकारों के लिए एक अन्य उपयोग विदेशी वस्तुओं को एक टैग किए गए कंटेनर में लपेटने के तरीके के रूप में है, जिसे टाइप प्रणाली पहचान सकता है और जानता है कि कैसे कॉपी और मुक्त किया जाए।
; बॉक्स्ड प्रकार: कुछ डेटा संरचनाएँ जो पूर्ण श्रेणी प्रकार (सभी ओवरहेड खर्च के साथ) बनाने के लिए बहुत सरल हैं, उन्हें अभी भी टाइप सिस्टम के साथ पंजीकृत करने की आवश्यकता हो सकती है। उदाहरण के लिए, हमारे पास एक वर्ग हो सकता है जिसमें हम <code>background-color</code> गुण जोड़ना चाहते हैं, जिसका मान एक संरचना का उदाहरण होना चाहिए जो {{code|2=c|1=struct color { int r, g, b; <nowiki>}</nowiki> }}. <code>GObject</code> को उपवर्गित करने से बचने के लिए, हम इस संरचना का प्रतिनिधित्व करने के लिए एक बॉक्स प्रकार बना सकते हैं, और प्रतिलिपि बनाने और मुक्त करने के लिए फ़ंक्शन प्रदान कर सकते हैं। GObject सरल GLib डेटा प्रकारों को लपेटने वाले मुट्ठी भर बॉक्स प्रकार के साथ जहाज करता है। बॉक्सिंग प्रकारों के लिए एक अन्य उपयोग विदेशी वस्तुओं को एक टैग किए गए कंटेनर में लपेटने के तरीके के रूप में है, जिसे टाइप सिस्टम पहचान सकता है और जानता है कि कैसे कॉपी और मुक्त किया जाए।
; अपारदर्शी सूचक प्रकार: कभी-कभी, उन वस्तुओं के लिए जिन्हें न तो कॉपी करने, न ही संदर्भ-गणना करने और न ही मुक्त करने की आवश्यकता होती है, यहां तक ​​कि एक बॉक्स प्रकार भी अतिश्योक्तिपूर्ण होगा। जबकि ऐसी वस्तुओं को केवल अपारदर्शी पॉइंटर्स <code>G_TYPE_POINTER</code> के रूप में मानकर <code>GObject</code> में उपयोग किया जा सकता है, अक्सर एक व्युत्पन्न पॉइंटर प्रकार बनाना एक अच्छा विचार है, इस तथ्य का दस्तावेजीकरण करते हुए कि पॉइंटर्स को एक विशेष प्रकार की वस्तु का संदर्भ देना चाहिए, भले ही और कुछ नहीं इसके बारे में कहा जाता है.
; अपारदर्शी सूचक प्रकार: कभी-कभी, उन वस्तुओं के लिए जिन्हें न तो कॉपी करने, न ही संदर्भ-गणना करने और न ही मुक्त करने की आवश्यकता होती है, यहां तक ​​कि एक बॉक्स प्रकार भी अतिश्योक्तिपूर्ण होगा। जबकि ऐसी वस्तुओं को केवल अपारदर्शी पॉइंटर्स <code>G_TYPE_POINTER</code> के रूप में मानकर <code>GObject</code> में उपयोग किया जा सकता है, अक्सर एक व्युत्पन्न पॉइंटर प्रकार बनाना एक अच्छा विचार है, इस तथ्य का दस्तावेजीकरण करते हुए कि पॉइंटर्स को एक विशेष प्रकार की वस्तु का संदर्भ देना चाहिए, भले ही और कुछ नहीं इसके बारे में कहा जाता है.
; वर्ग और इंटरफ़ेस प्रकार: GObject एप्लिकेशन में अधिकांश प्रकार क्लास होंगे - शब्द के सामान्य वस्तु-उन्मुख अर्थ में - प्रत्यक्ष या अप्रत्यक्ष रूप से रूट क्लास, <code>GObject</code> से प्राप्त होंगे। ऐसे इंटरफ़ेस भी हैं, जिनमें क्लासिक जावा-शैली इंटरफ़ेस के विपरीत, कार्यान्वित तरीके सम्मिलित हो सकते हैं। इस प्रकार <code>GObject</code> इंटरफेस को मिक्सिन के रूप में वर्णित किया जा सकता है।
; वर्ग और इंटरफ़ेस प्रकार: GObject एप्लिकेशन में अधिकांश प्रकार क्लास होंगे - शब्द के सामान्य वस्तु-उन्मुख अर्थ में - प्रत्यक्ष या अप्रत्यक्ष रूप से रूट क्लास, <code>GObject</code> से प्राप्त होंगे। ऐसे इंटरफ़ेस भी हैं, जिनमें क्लासिक जावा-शैली इंटरफ़ेस के विपरीत, कार्यान्वित तरीके सम्मिलित हो सकते हैं। इस प्रकार <code>GObject</code> इंटरफेस को मिक्सिन के रूप में वर्णित किया जा सकता है।
Line 72: Line 71:
<code>GObject</code> मैसेजिंग सिस्टम में दो पूरक भाग क्लोजर और सिग्नल होते हैं।
<code>GObject</code> मैसेजिंग सिस्टम में दो पूरक भाग क्लोजर और सिग्नल होते हैं।
; क्लोजर: <code>GObject</code> क्लोजर कॉलबैक का एक सामान्यीकृत संस्करण है। C और C++ में लिखे गए क्लोजर के साथ-साथ मनमानी भाषाओं (जब बाइंडिंग प्रदान की जाती है) के लिए समर्थन मौजूद है। यह (उदाहरण के लिए) पायथन और जावा में लिखे गए कोड को <code>GObject</code> क्लोजर के माध्यम से लागू करने की स्वीकृति देता है।
; क्लोजर: <code>GObject</code> क्लोजर कॉलबैक का एक सामान्यीकृत संस्करण है। C और C++ में लिखे गए क्लोजर के साथ-साथ मनमानी भाषाओं (जब बाइंडिंग प्रदान की जाती है) के लिए समर्थन मौजूद है। यह (उदाहरण के लिए) पायथन और जावा में लिखे गए कोड को <code>GObject</code> क्लोजर के माध्यम से लागू करने की स्वीकृति देता है।
; सिग्नल: सिग्नल प्राथमिक तंत्र है जिसके द्वारा क्लोजर लागू किया जाता है। ऑब्जेक्ट सिग्नल श्रोताओं को टाइप सिस्टम के साथ पंजीकृत करते हैं, किसी दिए गए सिग्नल और दिए गए क्लोजर के बीच मैपिंग निर्दिष्ट करते हैं। एक पंजीकृत सिग्नल के उत्सर्जन पर, उस सिग्नल का बंद होना लागू हो जाता है। जीटीके में, सभी मूल जीयूआई घटनाएं (जैसे माउस गति और कीबोर्ड क्रियाएं) श्रोताओं के लिए संभावित रूप से कार्य करने के लिए जीओब्जेक्ट सिग्नल उत्पन्न कर सकती हैं।
; सिग्नल: सिग्नल प्राथमिक तंत्र है जिसके द्वारा क्लोजर लागू किया जाता है। ऑब्जेक्ट सिग्नल श्रोताओं को टाइप प्रणाली के साथ पंजीकृत करते हैं, किसी दिए गए सिग्नल और दिए गए क्लोजर के बीच मैपिंग निर्दिष्ट करते हैं। एक पंजीकृत सिग्नल के उत्सर्जन पर, उस सिग्नल का बंद होना लागू हो जाता है। जीटीके में, सभी मूल जीयूआई घटनाएं (जैसे माउस गति और कीबोर्ड क्रियाएं) श्रोताओं के लिए संभावित रूप से कार्य करने के लिए जीओब्जेक्ट सिग्नल उत्पन्न कर सकती हैं।


== वर्ग कार्यान्वयन ==
== वर्ग कार्यान्वयन ==
Line 87: Line 86:


== उपयोग ==
== उपयोग ==
सी और गोब्जेक्ट के संयोजन का उपयोग कई सफल मुफ्त सॉफ्टवेयर परियोजनाओं में किया जाता है, जैसे कि गनोम डेस्कटॉप, जीटीके टूलकिट और जीआईएमपी इमेज मैनीपुलेशन प्रोग्राम।
सी और गोब्जेक्ट के संयोजन का उपयोग कई सफल मुक्त सॉफ्टवेयर परियोजनाओं में किया जाता है, जैसे कि गनोम डेस्कटॉप, जीटीके टूलकिट और जीआईएमपी इमेज मैनीपुलेशन प्रोग्राम।


हालाँकि कई <code>GObject</code> एप्लिकेशन पूरी तरह से C में लिखे गए हैं, <code>GObject</code> सिस्टम कई अन्य भाषाओं, जैसे C++, Java, Ruby, Python, Common Lisp, और .NET/Mono के मूल ऑब्जेक्ट सिस्टम में अच्छी तरह से मैप करता है। परिणामस्वरूप, <code>GObject</code> फ्रेमवर्क का उपयोग करने वाले अच्छी तरह से लिखित पुस्तकालयों के लिए भाषा बाइंडिंग बनाना सामान्यतः अपेक्षाकृत दर्द रहित होता है।
हालाँकि कई <code>GObject</code> एप्लिकेशन पूरी तरह से C में लिखे गए हैं, <code>GObject</code> सिस्टम कई अन्य भाषाओं, जैसे C++, Java, Ruby, Python, Common Lisp, और .NET/Mono के मूल ऑब्जेक्ट सिस्टम में अच्छी तरह से मैप करता है। परिणामस्वरूप, <code>GObject</code> फ्रेमवर्क का उपयोग करने वाले अच्छी तरह से लिखित लाइब्रेरीों के लिए भाषा बाइंडिंग बनाना सामान्यतः अपेक्षाकृत दर्द रहित होता है।


हालाँकि, सबसे पहले C में <code>GObject</code> कोड लिखना अपेक्षाकृत क्रियात्मक है। लाइब्रेरी को सीखने में काफी समय लगता है, और उच्च-स्तरीय वस्तु-उन्मुख भाषाओं में अनुभव वाले प्रोग्रामर को अक्सर C में <code>GObject</code> के साथ काम करना थोड़ा कठिन लगता है। उदाहरण के लिए, एक उपवर्ग (यहां तक ​​कि <code>GObject</code> का एक उपवर्ग भी) बनाना संभव हो सकता है। बड़ी मात्रा में [[बॉयलरप्लेट कोड]] लिखने और/या कॉपी करने की आवश्यकता होती है।<ref>{{cite web|title=एक नया गोब्जेक्ट कैसे परिभाषित और कार्यान्वित करें|url=https://developer.gnome.org/gobject/stable/howto-gobject.html|work=gnome.org|access-date=27 July 2013}}</ref> हालाँकि, Vala का उपयोग करना, एक ऐसी भाषा जो मुख्य रूप से <code>GObject</code> के साथ काम करने के लिए डिज़ाइन की गई है और जो C में परिवर्तित होती है, <code>GObject</code> के साथ काम करने या <code>GObject</code> आधारित लाइब्रेरी लिखने को बेहतर बनाने की संभावना है।
हालाँकि, सबसे पहले C में <code>GObject</code> कोड लिखना अपेक्षाकृत क्रियात्मक है। लाइब्रेरी को सीखने में काफी समय लगता है, और उच्च-स्तरीय वस्तु-उन्मुख भाषाओं में अनुभव वाले प्रोग्रामर को अक्सर C में <code>GObject</code> के साथ काम करना थोड़ा कठिन लगता है। उदाहरण के लिए, एक उपवर्ग (यहां तक ​​कि <code>GObject</code> का एक उपवर्ग भी) बनाना संभव हो सकता है। बड़ी मात्रा में [[बॉयलरप्लेट कोड]] लिखने और/या कॉपी करने की आवश्यकता होती है।<ref>{{cite web|title=एक नया गोब्जेक्ट कैसे परिभाषित और कार्यान्वित करें|url=https://developer.gnome.org/gobject/stable/howto-gobject.html|work=gnome.org|access-date=27 July 2013}}</ref> हालाँकि, Vala का उपयोग करना, एक ऐसी भाषा जो मुख्य रूप से <code>GObject</code> के साथ काम करने के लिए डिज़ाइन की गई है और जो C में परिवर्तित होती है, <code>GObject</code> के साथ काम करने या <code>GObject</code> आधारित लाइब्रेरी लिखने को बेहतर बनाने की संभावना है।
Line 105: Line 104:
एक और महत्वपूर्ण अंतर यह है कि जबकि C++ और ऑब्जेक्टिव-सी अलग-अलग भाषाएं हैं, <code>GObject</code> पूरी तरह से एक लाइब्रेरी है और इस तरह कोई नया सिंटैक्स या कंपाइलर इंटेलिजेंस पेश नहीं करता है। उदाहरण के लिए, <code>GObject</code>-आधारित C ​​कोड लिखते समय, स्पष्ट अपकास्टिंग करना अक्सर आवश्यक होता है।{{citation needed|date=November 2018}} इसलिए, "<code>GObject</code> के साथ C", जिसे सादे C से अलग भाषा के रूप में माना जाता है, सादे C का एक सख्त सुपरसेट है - ऑब्जेक्टिव की तरह सी, लेकिन सी++ के विपरीत।
एक और महत्वपूर्ण अंतर यह है कि जबकि C++ और ऑब्जेक्टिव-सी अलग-अलग भाषाएं हैं, <code>GObject</code> पूरी तरह से एक लाइब्रेरी है और इस तरह कोई नया सिंटैक्स या कंपाइलर इंटेलिजेंस पेश नहीं करता है। उदाहरण के लिए, <code>GObject</code>-आधारित C ​​कोड लिखते समय, स्पष्ट अपकास्टिंग करना अक्सर आवश्यक होता है।{{citation needed|date=November 2018}} इसलिए, "<code>GObject</code> के साथ C", जिसे सादे C से अलग भाषा के रूप में माना जाता है, सादे C का एक सख्त सुपरसेट है - ऑब्जेक्टिव की तरह सी, लेकिन सी++ के विपरीत।


उन प्लेटफ़ॉर्म पर जहां कोई मानक ABI नहीं है जो सभी C++ कंपाइलरों पर काम करता है (जो सामान्यतः मामला नहीं है, क्योंकि सामान्यतः इटेनियम ABI या Microsoft ABI का पालन किया जाता है), एक C++ कंपाइलर के साथ संकलित लाइब्रेरी हमेशा कॉल करने में सक्षम नहीं होती है लाइब्रेरी को किसी भिन्न लाइब्रेरी के साथ संकलित किया गया है। सभी निर्यातित प्रतीकों की विशिष्टता सुनिश्चित करने के लिए संकलक विभिन्न प्रकार के नाम प्रबंधन का उपयोग करते हैं। (यह आवश्यक है क्योंकि, उदाहरण के लिए, दो अलग-अलग वर्गों में समान नाम वाले सदस्य फ़ंक्शन हो सकते हैं, एक फ़ंक्शन नाम कई बार ओवरलोड हो सकता है, या समान नाम वाले फ़ंक्शन अलग-अलग नामस्थानों में दिखाई दे सकते हैं, लेकिन ऑब्जेक्ट कोड में इन ओवरलैप्स की स्वीकृति नहीं है।) {{citation needed|date=November 2018}} इसके विपरीत, चूंकि सी किसी भी प्रकार के ओवरलोडिंग या नेमस्पेसिंग का समर्थन नहीं करता है, सी पुस्तकालयों के लेखक सामान्यतः अपने निर्यातित नामों की वैश्विक विशिष्टता सुनिश्चित करने के लिए स्पष्ट उपसर्गों का उपयोग करेंगे।{{citation needed|date=November 2018}} इसलिए, वस्तु-उन्मुख होने के बावजूद, ए C में लिखी गई <code>GObject</code>-आधारित लाइब्रेरी हमेशा समान बाहरी प्रतीक नामों का उपयोग करेगी, चाहे किसी भी कंपाइलर का उपयोग किया गया हो।
उन प्लेटफ़ॉर्म पर जहां कोई मानक ABI नहीं है जो सभी C++ कंपाइलरों पर काम करता है (जो सामान्यतः मामला नहीं है, क्योंकि सामान्यतः इटेनियम ABI या Microsoft ABI का पालन किया जाता है), एक C++ कंपाइलर के साथ संकलित लाइब्रेरी हमेशा कॉल करने में सक्षम नहीं होती है लाइब्रेरी को किसी भिन्न लाइब्रेरी के साथ संकलित किया गया है। सभी निर्यातित प्रतीकों की विशिष्टता सुनिश्चित करने के लिए संकलक विभिन्न प्रकार के नाम प्रबंधन का उपयोग करते हैं। (यह आवश्यक है क्योंकि, उदाहरण के लिए, दो अलग-अलग वर्गों में समान नाम वाले सदस्य फ़ंक्शन हो सकते हैं, एक फ़ंक्शन नाम कई बार ओवरलोड हो सकता है, या समान नाम वाले फ़ंक्शन अलग-अलग नामस्थानों में दिखाई दे सकते हैं, लेकिन ऑब्जेक्ट कोड में इन ओवरलैप्स की स्वीकृति नहीं है।) {{citation needed|date=November 2018}} इसके विपरीत, चूंकि सी किसी भी प्रकार के ओवरलोडिंग या नेमस्पेसिंग का समर्थन नहीं करता है, सी लाइब्रेरीों के लेखक सामान्यतः अपने निर्यातित नामों की वैश्विक विशिष्टता सुनिश्चित करने के लिए स्पष्ट उपसर्गों का उपयोग करेंगे।{{citation needed|date=November 2018}} इसलिए, वस्तु-उन्मुख होने के बावजूद, ए C में लिखी गई <code>GObject</code>-आधारित लाइब्रेरी हमेशा समान बाहरी प्रतीक नामों का उपयोग करेगी, चाहे किसी भी कंपाइलर का उपयोग किया गया हो।


शायद सबसे गहरा अंतर संकेतों पर <code>GObject</code> का जोर है (जिसे अन्य भाषाओं में घटनाएँ कहा जाता है)।{{citation needed|date=November 2018}} यह जोर इस तथ्य से लिया गया है कि <code>GObject</code> को विशेष रूप से जीयूआई टूलकिट की जरूरतों को पूरा करने के लिए डिज़ाइन किया गया था। जबकि अधिकांश वस्तु-उन्मुख भाषाओं के लिए सिग्नल लाइब्रेरी मौजूद हैं, <code>GObject</code> के मामले में इसे ऑब्जेक्ट सिस्टम में बनाया गया है। इस वजह से, एक सामान्य <code>GObject</code> एप्लिकेशन गैर-<code>GObject</code> एप्लिकेशन की तुलना में बहुत अधिक हद तक सिग्नल का उपयोग करेगा, जिससे <code>GObject</code> घटकों को सादे C++ या Java का उपयोग करने वाले घटकों की तुलना में बहुत अधिक इनकैप्सुलेटेड और पुन: प्रयोज्य बना दिया जाएगा।{{citation needed|date=November 2018}}{{According to whom|date=November 2018}} यदि [[glibmm]]/[[gtkmm]], Glib/GTK के लिए आधिकारिक C++ रैपर क्रमशः का उपयोग किया जाता है, तो सहोदर प्रोजेक्ट libsigc++ मानक C++ का उपयोग करके अंतर्निहित <code>GObject</code> संकेतों के आसान उपयोग की स्वीकृति देता है। बेशक, सिग्नल के अन्य कार्यान्वयन लगभग सभी प्लेटफार्मों पर उपलब्ध हैं, हालांकि कभी-कभी एक अतिरिक्त लाइब्रेरी की आवश्यकता होती है, जैसे C++ के लिए Boost.Signals2।
शायद सबसे गहरा अंतर संकेतों पर <code>GObject</code> का जोर है (जिसे अन्य भाषाओं में घटनाएँ कहा जाता है)।{{citation needed|date=November 2018}} यह जोर इस तथ्य से लिया गया है कि <code>GObject</code> को विशेष रूप से जीयूआई टूलकिट की जरूरतों को पूरा करने के लिए डिज़ाइन किया गया था। जबकि अधिकांश वस्तु-उन्मुख भाषाओं के लिए सिग्नल लाइब्रेरी मौजूद हैं, <code>GObject</code> के मामले में इसे ऑब्जेक्ट सिस्टम में बनाया गया है। इस वजह से, एक सामान्य <code>GObject</code> एप्लिकेशन गैर-<code>GObject</code> एप्लिकेशन की तुलना में बहुत अधिक हद तक सिग्नल का उपयोग करेगा, जिससे <code>GObject</code> घटकों को सादे C++ या Java का उपयोग करने वाले घटकों की तुलना में बहुत अधिक इनकैप्सुलेटेड और पुन: प्रयोज्य बना दिया जाएगा।{{citation needed|date=November 2018}}{{According to whom|date=November 2018}} यदि [[glibmm]]/[[gtkmm]], Glib/GTK के लिए आधिकारिक C++ रैपर क्रमशः का उपयोग किया जाता है, तो सहोदर प्रोजेक्ट libsigc++ मानक C++ का उपयोग करके अंतर्निहित <code>GObject</code> संकेतों के आसान उपयोग की स्वीकृति देता है। बेशक, सिग्नल के अन्य कार्यान्वयन लगभग सभी प्लेटफार्मों पर उपलब्ध हैं, हालांकि कभी-कभी एक अतिरिक्त लाइब्रेरी की आवश्यकता होती है, जैसे C++ के लिए Boost.Signals2।

Revision as of 11:14, 25 June 2023

जीऑब्जेक्ट
Developer(s)गनोम परियोजना
Initial release11 March 2002; 22 years ago (2002-03-11)
Written inसी
Operating systemक्रॉस-प्लेटफॉर्म
Available inबहुभाषी[which?]
Typeसॉफ्टवेयर लाइब्रेरी
Licenseजीएनयू एलजीपीएल
Websitedeveloper.gnome.org/gobject/stable/
चूंकि जीएनयू सी लाइब्रेरी लिनक्स कर्नेल सिस्टम कॉल के लिए एक रैपर के रूप में कार्य करती है, इसलिए जीएलआईबी (जीओब्जेक्ट, जीएलआईबी, जीमॉड्यूल, जीटीएचड और जीआईओ (सॉफ्टवेयर)) में बंडल किए गए लाइब्रेरी अपने विशिष्ट कार्यों के लिए आगे के रैपर के रूप में काम करते हैं।

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

इतिहास

GLibऔर libcपर निर्भर करते हुए, GObject GNOME का आधार है। इसका उपयोग जीटीके, पंगो, अभिगम्यता टूलकिट और अधिकांश उच्च-स्तरीय जीनोम लाइब्रेरी जैसे GStreamerऔर अनुप्रयोगों में किया जाता है। GTK+ 2.0 से पहले GObject के समान कोड जीटीके कोडबेस का एक भाग था। यह "GObject" नाम अभी तक उपयोग में नहीं था, सामान्य आधारित क्लास को GtkObject कहा जाता था।

GTK+ 2.0 के प्रारम्भ होने पर इसकी सामान्य उपयोगिता के कारण वस्तु प्रणाली को एक अलग लाइब्रेरी में निकाला गया था। इस प्रक्रिया में GtkObject वर्ग के अधिकांश गैर-जीयूआई विशिष्ट भागों को GObject के नए सामान्य आधारित क्लास में ले जाया गया था। 11 मार्च 2002 (GTK+ 2.0 की प्रकाशन तिथि) से एक अलग लाइब्रेरी के रूप में अस्तित्व में आने के बाद GObject लाइब्रेरी का उपयोग अब कई गैर-जीयूआई प्रोग्रामों जैसे कमांड लाइन और सर्वर (कंप्यूटिंग) अनुप्रयोगों द्वारा किया जाता है।

जीएलआईबी से संबंध

हालाँकि GObject के पास दस्तावेज़ीकरण का अपना अलग समूह है[1] और सामान्यतः इसे अपनी साझा लाइब्रेरी फ़ाइल में संकलित किया जाता है। GObject का स्रोत कोड GLib स्रोत ट्री में रहता है और GLib के साथ वितरित किया जाता है। इस कारण से GObject GLib संस्करण संख्याओं का उपयोग करता है और सामान्यतः GLib के साथ पैक किया जाता है। उदाहरण के लिए, डेबियन GObject को अपने libglib2.0 पैकेज समूह में रखता है।

टाइप प्रणाली

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

टाइप प्रणाली किसी भी पंजीकृत प्रकार से संबंधित मानों को आयोजित करना और नष्ट करना जानती है। यह पूर्णांक जैसे प्रकारों के लिए अपेक्षाकृत सामान्य है, लेकिन कई जटिल वस्तुओ की संदर्भ के लिए गणना की जाती हैं, जबकि कुछ वस्तुएँ जटिल हैं लेकिन उनकी संदर्भ-गणना नहीं की जाती हैं। जब टाइप प्रणाली किसी संदर्भ-गणित वस्तु का अनुकरण करता है तो यह सामान्यतः केवल इसकी संदर्भ संख्या को बढ़ाता है जबकि एक जटिल गैर संदर्भ गणना वाली वस्तु (जैसे कि एक स्ट्रिंग) की प्रतिलिपि बनाते समय यह सामान्यतः मेमोरी आवंटित करके एक वास्तविक प्रतिलिपि बनाता है।

इस आधारिक कार्यक्षमता का उपयोग GValue को प्रयुक्त करने के लिए किया जाता है। एक प्रकार की सामान्य गणना जो टाइप प्रणाली द्वारा ज्ञात किसी भी प्रकार के मान को धारण कर सकती है। ऐसी गणना विशेष रूप से उपयोगी होती हैं जब गतिशील रूप से टाइप किए गए भाषा वातावरण के साथ अनुमान करते हैं जिसमें सभी मूल मान टाइप-टैग की गई गणना में रहते हैं।

मौलिक प्रकार

वे प्रकार जिनमें कोई संबद्ध वर्ग नहीं होता है उन्हें गैर-वर्गीकृत कहा जाता है। ये प्रकार उन सभी प्रकारों के साथ जो मूल वर्ग के किसी न किसी रूप से अनुरूप हैं, मौलिक प्रकार के रूप में जाने जाते हैं। वे प्रकार जिनसे अन्य सभी प्रकार प्राप्त होते हैं। ये एक अपेक्षाकृत संवृत समुच्चय बनाते हैं। हालांकि औसत उपयोगकर्ता से अपने स्वयं के मौलिक प्रकार बनाने की संभावना नहीं की जाती है और कस्टम क्लास पदानुक्रम बनाने के लिए इसका लाभ प्राप्त किया गया है अर्थात क्लास पदानुक्रम GObject क्लास पर आधारित नहीं हैं।

जीएलआईबी 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 के लिए मेटाडेटा का वर्णन करने के लिए GObject में प्रयोग किया जाता है।

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

व्युत्पन्न प्रकार

अंतर्निहित GObject मौलिक प्रकारों से प्राप्त प्रकार सामान्यतः चार श्रेणियों में आते हैं:

सूचीबद्ध प्रकार और फ्लैग प्रकार
सामान्यतः प्रत्येक सूचीबद्ध प्रकार और प्रत्येक पूर्णांक-आधारित बिटफील्ड प्रकार (अर्थात, प्रत्येक enum प्रकार) जिसे कोई किसी प्रकार से उपयोग करना चाहता है जो वस्तु प्रणाली से संबंधित है उदाहरण के लिए वस्तु विशेषता के प्रकार के रूप में पंजीकृत होना चाहिए। प्रकार प्रणाली के साथ सामान्यतः प्रारम्भिक कोड जो इन प्रकारों को पंजीकृत करने का ध्यान रखता है, glib-mkenums नामक एक स्वचालित उपकरण द्वारा उत्पन्न किया जाता है और एक अलग फ़ाइल में संग्रहीत किया जाता है।[3]
बॉक्स्ड प्रकार
कुछ डेटा संरचनाएँ जो पूर्ण श्रेणी प्रकार (सभी ओवरहेड खर्च के साथ) बनाने के लिए बहुत सरल हैं, उन्हें अभी भी टाइप प्रणाली के साथ पंजीकृत करने की आवश्यकता हो सकती है। उदाहरण के लिए, हमारे पास एक वर्ग हो सकता है जिसमें हम background-color गुण जोड़ना चाहते हैं, जिसका मान एक संरचना का उदाहरण होना चाहिए जो struct color { int r, g, b; }. GObject को उपवर्गित करने से बचने के लिए, हम इस संरचना का प्रतिनिधित्व करने के लिए एक बॉक्स प्रकार बना सकते हैं, और प्रतिलिपि बनाने और मुक्त करने के लिए फ़ंक्शन प्रदान कर सकते हैं। GObject सरल GLib डेटा प्रकारों को लपेटने वाले मुट्ठी भर बॉक्स प्रकार के साथ जहाज करता है। बॉक्सिंग प्रकारों के लिए एक अन्य उपयोग विदेशी वस्तुओं को एक टैग किए गए कंटेनर में लपेटने के तरीके के रूप में है, जिसे टाइप प्रणाली पहचान सकता है और जानता है कि कैसे कॉपी और मुक्त किया जाए।
अपारदर्शी सूचक प्रकार
कभी-कभी, उन वस्तुओं के लिए जिन्हें न तो कॉपी करने, न ही संदर्भ-गणना करने और न ही मुक्त करने की आवश्यकता होती है, यहां तक ​​कि एक बॉक्स प्रकार भी अतिश्योक्तिपूर्ण होगा। जबकि ऐसी वस्तुओं को केवल अपारदर्शी पॉइंटर्स G_TYPE_POINTER के रूप में मानकर GObject में उपयोग किया जा सकता है, अक्सर एक व्युत्पन्न पॉइंटर प्रकार बनाना एक अच्छा विचार है, इस तथ्य का दस्तावेजीकरण करते हुए कि पॉइंटर्स को एक विशेष प्रकार की वस्तु का संदर्भ देना चाहिए, भले ही और कुछ नहीं इसके बारे में कहा जाता है.
वर्ग और इंटरफ़ेस प्रकार
GObject एप्लिकेशन में अधिकांश प्रकार क्लास होंगे - शब्द के सामान्य वस्तु-उन्मुख अर्थ में - प्रत्यक्ष या अप्रत्यक्ष रूप से रूट क्लास, GObject से प्राप्त होंगे। ऐसे इंटरफ़ेस भी हैं, जिनमें क्लासिक जावा-शैली इंटरफ़ेस के विपरीत, कार्यान्वित तरीके सम्मिलित हो सकते हैं। इस प्रकार GObject इंटरफेस को मिक्सिन के रूप में वर्णित किया जा सकता है।

मैसेजिंग सिस्टम

GObject मैसेजिंग सिस्टम में दो पूरक भाग क्लोजर और सिग्नल होते हैं।

क्लोजर
GObject क्लोजर कॉलबैक का एक सामान्यीकृत संस्करण है। C और C++ में लिखे गए क्लोजर के साथ-साथ मनमानी भाषाओं (जब बाइंडिंग प्रदान की जाती है) के लिए समर्थन मौजूद है। यह (उदाहरण के लिए) पायथन और जावा में लिखे गए कोड को GObject क्लोजर के माध्यम से लागू करने की स्वीकृति देता है।
सिग्नल
सिग्नल प्राथमिक तंत्र है जिसके द्वारा क्लोजर लागू किया जाता है। ऑब्जेक्ट सिग्नल श्रोताओं को टाइप प्रणाली के साथ पंजीकृत करते हैं, किसी दिए गए सिग्नल और दिए गए क्लोजर के बीच मैपिंग निर्दिष्ट करते हैं। एक पंजीकृत सिग्नल के उत्सर्जन पर, उस सिग्नल का बंद होना लागू हो जाता है। जीटीके में, सभी मूल जीयूआई घटनाएं (जैसे माउस गति और कीबोर्ड क्रियाएं) श्रोताओं के लिए संभावित रूप से कार्य करने के लिए जीओब्जेक्ट सिग्नल उत्पन्न कर सकती हैं।

वर्ग कार्यान्वयन

प्रत्येक GObject वर्ग को कम से कम दो संरचनाओं, वर्ग संरचना और उदाहरण संरचना द्वारा कार्यान्वित किया जाता है।

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

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

इनमें से कुछ जटिलताओं को संबोधित करने के लिए, कई उच्च-स्तरीय भाषाएँ मौजूद हैं जो स्रोत-से-स्रोत C में GObject को संकलित करती हैं। Vala प्रोग्रामिंग भाषा C#-शैली सिंटैक्स का उपयोग करती है और वेनिला (कंप्यूटिंग) C कोड में पूर्व-संसाधित होती है। GObject बिल्डर, या GOB2, जावा की याद दिलाने वाला एक टेम्पलेट सिंटैक्स प्रदान करता है।

गोब्जेक्ट आत्मनिरीक्षण

  • GObject आत्मनिरीक्षण (संक्षिप्त GIR[4]) C लाइब्रेरीज़ (GObject का उपयोग करके) और भाषा बाइंडिंग सीएफ जीटीके के लिए भाषा बाइंडिंग की सूची के बीच एक विदेशी फ़ंक्शन इंटरफ़ेस मिडलवेयर परत है।

उपयोग

सी और गोब्जेक्ट के संयोजन का उपयोग कई सफल मुक्त सॉफ्टवेयर परियोजनाओं में किया जाता है, जैसे कि गनोम डेस्कटॉप, जीटीके टूलकिट और जीआईएमपी इमेज मैनीपुलेशन प्रोग्राम।

हालाँकि कई GObject एप्लिकेशन पूरी तरह से C में लिखे गए हैं, GObject सिस्टम कई अन्य भाषाओं, जैसे C++, Java, Ruby, Python, Common Lisp, और .NET/Mono के मूल ऑब्जेक्ट सिस्टम में अच्छी तरह से मैप करता है। परिणामस्वरूप, GObject फ्रेमवर्क का उपयोग करने वाले अच्छी तरह से लिखित लाइब्रेरीों के लिए भाषा बाइंडिंग बनाना सामान्यतः अपेक्षाकृत दर्द रहित होता है।

हालाँकि, सबसे पहले C में GObject कोड लिखना अपेक्षाकृत क्रियात्मक है। लाइब्रेरी को सीखने में काफी समय लगता है, और उच्च-स्तरीय वस्तु-उन्मुख भाषाओं में अनुभव वाले प्रोग्रामर को अक्सर C में GObject के साथ काम करना थोड़ा कठिन लगता है। उदाहरण के लिए, एक उपवर्ग (यहां तक ​​कि GObject का एक उपवर्ग भी) बनाना संभव हो सकता है। बड़ी मात्रा में बॉयलरप्लेट कोड लिखने और/या कॉपी करने की आवश्यकता होती है।[5] हालाँकि, Vala का उपयोग करना, एक ऐसी भाषा जो मुख्य रूप से GObject के साथ काम करने के लिए डिज़ाइन की गई है और जो C में परिवर्तित होती है, GObject के साथ काम करने या GObject आधारित लाइब्रेरी लिखने को बेहतर बनाने की संभावना है।

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

अन्य ऑब्जेक्ट सिस्टम से तुलना

चूंकि GObject C[citation needed] के लिए अधिकतर पूर्ण ऑब्जेक्ट सिस्टम प्रदान करता है, इसे C-व्युत्पन्न भाषाओं जैसे C++ और ऑब्जेक्टिव-सी के विकल्प के रूप में देखा जा सकता है। (हालांकि दोनों अपने-अपने ऑब्जेक्ट सिस्टम के अलावा कई अन्य सुविधाएं भी प्रदान करते हैं।) C++ और GObject के बीच एक आसानी से देखा जाने वाला अंतर यह है कि GObject (जावा की तरह) मल्टीपल इनहेरिटेंस का समर्थन नहीं करता है।[6]

GObject द्वारा GLib के g_malloc () मेमोरी एलोकेशन फ़ंक्शन के उपयोग से प्रोग्राम मेमोरी ख़त्म होने पर बिना शर्त बाहर निकल जाएगा, C लाइब्रेरी के Malloc(), C++ के नए और अन्य सामान्य मेमोरी एलोकेटर के विपरीत, जो किसी प्रोग्राम को इससे निपटने या यहां तक ​​कि पूरी तरह से पुनर्प्राप्त करने की स्वीकृति देता है- बस दुर्घटनाग्रस्त हुए बिना स्मृति की स्थितियाँ।[7] यह सॉफ्टवेयर में GObject को सम्मिलित करने के खिलाफ काम करता है जहां सीमित मेमोरी के सामने लचीलापन महत्वपूर्ण है या जहां बहुत अधिक या बहुत बड़ी वस्तुओं को सामान्यतः नियंत्रित किया जाता है। G_try_new() का उपयोग तब किया जा सकता है जब मेमोरी आवंटन विफल होने की अधिक संभावना होती है (उदाहरण के लिए एक बड़ी वस्तु के लिए) लेकिन यह यह स्वीकृति नहीं दे सकता कि आवंटन कोड में कहीं और विफल नहीं होगा।[8]

एक और महत्वपूर्ण अंतर यह है कि जबकि C++ और ऑब्जेक्टिव-सी अलग-अलग भाषाएं हैं, GObject पूरी तरह से एक लाइब्रेरी है और इस तरह कोई नया सिंटैक्स या कंपाइलर इंटेलिजेंस पेश नहीं करता है। उदाहरण के लिए, GObject-आधारित C ​​कोड लिखते समय, स्पष्ट अपकास्टिंग करना अक्सर आवश्यक होता है।[citation needed] इसलिए, "GObject के साथ C", जिसे सादे C से अलग भाषा के रूप में माना जाता है, सादे C का एक सख्त सुपरसेट है - ऑब्जेक्टिव की तरह सी, लेकिन सी++ के विपरीत।

उन प्लेटफ़ॉर्म पर जहां कोई मानक ABI नहीं है जो सभी C++ कंपाइलरों पर काम करता है (जो सामान्यतः मामला नहीं है, क्योंकि सामान्यतः इटेनियम ABI या Microsoft ABI का पालन किया जाता है), एक C++ कंपाइलर के साथ संकलित लाइब्रेरी हमेशा कॉल करने में सक्षम नहीं होती है लाइब्रेरी को किसी भिन्न लाइब्रेरी के साथ संकलित किया गया है। सभी निर्यातित प्रतीकों की विशिष्टता सुनिश्चित करने के लिए संकलक विभिन्न प्रकार के नाम प्रबंधन का उपयोग करते हैं। (यह आवश्यक है क्योंकि, उदाहरण के लिए, दो अलग-अलग वर्गों में समान नाम वाले सदस्य फ़ंक्शन हो सकते हैं, एक फ़ंक्शन नाम कई बार ओवरलोड हो सकता है, या समान नाम वाले फ़ंक्शन अलग-अलग नामस्थानों में दिखाई दे सकते हैं, लेकिन ऑब्जेक्ट कोड में इन ओवरलैप्स की स्वीकृति नहीं है।)[citation needed] इसके विपरीत, चूंकि सी किसी भी प्रकार के ओवरलोडिंग या नेमस्पेसिंग का समर्थन नहीं करता है, सी लाइब्रेरीों के लेखक सामान्यतः अपने निर्यातित नामों की वैश्विक विशिष्टता सुनिश्चित करने के लिए स्पष्ट उपसर्गों का उपयोग करेंगे।[citation needed] इसलिए, वस्तु-उन्मुख होने के बावजूद, ए C में लिखी गई GObject-आधारित लाइब्रेरी हमेशा समान बाहरी प्रतीक नामों का उपयोग करेगी, चाहे किसी भी कंपाइलर का उपयोग किया गया हो।

शायद सबसे गहरा अंतर संकेतों पर GObject का जोर है (जिसे अन्य भाषाओं में घटनाएँ कहा जाता है)।[citation needed] यह जोर इस तथ्य से लिया गया है कि GObject को विशेष रूप से जीयूआई टूलकिट की जरूरतों को पूरा करने के लिए डिज़ाइन किया गया था। जबकि अधिकांश वस्तु-उन्मुख भाषाओं के लिए सिग्नल लाइब्रेरी मौजूद हैं, GObject के मामले में इसे ऑब्जेक्ट सिस्टम में बनाया गया है। इस वजह से, एक सामान्य GObject एप्लिकेशन गैर-GObject एप्लिकेशन की तुलना में बहुत अधिक हद तक सिग्नल का उपयोग करेगा, जिससे GObject घटकों को सादे C++ या Java का उपयोग करने वाले घटकों की तुलना में बहुत अधिक इनकैप्सुलेटेड और पुन: प्रयोज्य बना दिया जाएगा।[citation needed][according to whom?] यदि glibmm/gtkmm, Glib/GTK के लिए आधिकारिक C++ रैपर क्रमशः का उपयोग किया जाता है, तो सहोदर प्रोजेक्ट libsigc++ मानक C++ का उपयोग करके अंतर्निहित GObject संकेतों के आसान उपयोग की स्वीकृति देता है। बेशक, सिग्नल के अन्य कार्यान्वयन लगभग सभी प्लेटफार्मों पर उपलब्ध हैं, हालांकि कभी-कभी एक अतिरिक्त लाइब्रेरी की आवश्यकता होती है, जैसे C++ के लिए Boost.Signals2।

यह भी देखें

  • वैला - एक GObject-आधारित प्रोग्रामिंग भाषा जिसमें C# जैसा सिंटैक्स सोर्स टू सोर्स कंपाइलर टू सी है।
  • जिन्न (प्रोग्रामिंग भाषा) - पायथन-शैली वैला कंपाइलर के लिए वैकल्पिक सिंटैक्स पार्सर

संदर्भ

  1. "GObject Reference Manual".
  2. "GObject Reference Manual - Stable".
  3. "glib-mkenums, GObject Reference Manual".
  4. "आत्मनिरीक्षण, सारांश". Gnome Developer, Programming Guidelines - Specific How-Tos. Retrieved 9 August 2020.
  5. "एक नया गोब्जेक्ट कैसे परिभाषित और कार्यान्वित करें". gnome.org. Retrieved 27 July 2013.
  6. "c++ - Why Was the GObject System Created?". Stack Overflow. Retrieved 2019-11-16.
  7. "Memory Allocation: GLib Reference Manual". developer.gnome.org. Retrieved 2019-11-16.
  8. "Memory Allocation: GLib Reference Manual". developer.gnome.org. Retrieved 2019-11-17.


बाहरी संबंध