كائن G

نظام كائنات GLib ، أو GObject ، هو مكتبة برمجية مجانية توفر نظام كائنات قابل للنقل وتوافقًا شفافًا بين اللغات. صُمم GObject للاستخدام مباشرةً في برامج C لتوفير واجهات برمجة تطبيقات (APIs) كائنية التوجه قائمة على لغة C، ومن خلال روابط مع لغات أخرى لتوفير توافق شفاف بين اللغات، مثل PyGObject .

تاريخ

يعتمد GObject بشكل أساسي على مكتبتي GLib و libc ، وهو عنصرٌ محوري في بيئة جنوم ، ويُستخدم في جميع أنحاء مكتبات GTK و Pango و ATK ، ومعظم مكتبات جنوم عالية المستوى مثل GStreamer والتطبيقات. قبل إصدار GTK+ 2.0، كان جزءٌ من قاعدة بيانات GTK عبارة عن كود مشابه لـ GObject. (لم يكن اسم "GObject" مستخدمًا آنذاك ، بل كان يُطلق على الفئة الأساسية المشتركة اسمًا آخر GtkObject).

مع إصدار GTK+ 2.0، تم فصل نظام الكائنات إلى مكتبة مستقلة نظرًا لفائدته العامة. وخلال هذه العملية، نُقلت معظم أجزاء الفئة غير المخصصة لواجهة المستخدم الرسومية إلى الفئة الأساسية المشتركة الجديدة. ومنذ 11 مارس 2002 (تاريخ إصدار GTK+ 2.0)، تُستخدم مكتبة GObject كمكتبة مستقلة، وهي الآن تُستخدم في العديد من البرامج غير الرسومية، مثل تطبيقات سطر الأوامر وتطبيقات الخوادم .GtkObjectGObject

العلاقة بـ GLib

على الرغم من أن GObject يمتلك مجموعة وثائق منفصلة خاصة به [ 2 ] ويتم تجميعه عادةً في ملف مكتبة مشتركة خاص به ، إلا أن شفرة المصدر الخاصة به موجودة في شجرة مصدر GLib ويتم توزيعها مع GLib. لهذا السبب، يستخدم GObject أرقام إصدارات GLib ويتم تضمينه عادةً في حزمة GLib (على سبيل المثال، يضع Debianlibglib2.0 برنامج GObject ضمن عائلة حزمه).

نظام الكتابة

في أبسط مستويات إطار عمل GObject، يوجد نظام أنواع عام وديناميكي يُسمى GType. يحتوي نظام GType على وصف وقت التشغيل لجميع الكائنات، مما يسمح لرمز الربط بتسهيل ربط لغات برمجة متعددة. يستطيع نظام الأنواع التعامل مع أي بنية فئة موروثة بشكل فردي ، بالإضافة إلى الأنواع غير المصنفة مثل المؤشرات غير الشفافة ، والسلاسل النصية ، والأعداد الصحيحة والأعداد العشرية ذات الأحجام المختلفة .

يعرف نظام الأنواع كيفية نسخ القيم التابعة لأي نوع من الأنواع المسجلة، وتعيينها، وحذفها. هذا الأمر بسيط بالنسبة لأنواع مثل الأعداد الصحيحة، ولكن العديد من الكائنات المعقدة تُحسب مراجعها ، بينما بعضها معقد ولكنه لا يُحسب مراجعه. عندما "ينسخ" نظام الأنواع كائنًا يُحسب مراجعه، فإنه عادةً ما يزيد عدد مراجعه فقط، بينما عند نسخ كائن معقد لا يُحسب مراجعه (مثل سلسلة نصية)، فإنه عادةً ما يُنشئ نسخة فعلية عن طريق تخصيص الذاكرة .

تُستخدم هذه الوظيفة الأساسية لتنفيذ GValueنوع من الحاويات العامة التي يمكنها استيعاب قيم من أي نوع معروف في نظام الأنواع. وتُعد هذه الحاويات مفيدة بشكل خاص عند التفاعل مع بيئات اللغات ذات الأنواع الديناميكية، حيث توجد جميع القيم الأصلية في هذه الحاويات المُصنفة حسب النوع .

الأنواع الأساسية

تُسمى الأنواع التي لا ترتبط بأي فئات بالأنواع غير المصنفة . تُعرف هذه الأنواع، بالإضافة إلى جميع الأنواع التي تُقابل نوعًا من الفئات الجذرية، بالأنواع الأساسية : وهي الأنواع التي تُشتق منها جميع الأنواع الأخرى. تُشكل هذه الأنواع مجموعة مغلقة نسبيًا، ولكن على الرغم من أنه لا يُتوقع من المستخدم العادي إنشاء أنواعه الأساسية الخاصة، إلا أن هذه الإمكانية موجودة وقد استُغلت لإنشاء تسلسلات هرمية مخصصة للفئات - أي تسلسلات هرمية للفئات لا تعتمد على GObjectالفئة.

اعتبارًا من GLib 2.9.2، [ 3 ] فإن الأنواع الأساسية المضمنة غير المصنفة هي:

  • نوع فارغ ، يتوافق مع void( G_TYPE_NONE) C؛
  • الأنواع المقابلة للأعداد الصحيحة الموقعة وغير الموقعة في لغة C ، والأعداد الصحيحة charذات 64 بت ( ،،،،،،، و ) ؛intlongG_TYPE_CHARG_TYPE_UCHARG_TYPE_INTG_TYPE_UINTG_TYPE_LONGG_TYPE_ULONGG_TYPE_INT64G_TYPE_UINT64
  • نوع منطقي ( G_TYPE_BOOLEAN);
  • نوع تعداد ونوع "علامات"، وكلاهما يتوافق مع enumنوع C، ولكنهما يختلفان في أن الأخير يستخدم فقط لحقول البت ( G_TYPE_ENUMو G_TYPE_FLAGS
  • أنواع الأعداد العشرية أحادية وثنائية الدقة IEEE ، المقابلة لـ C's floatو double( G_TYPE_FLOATو G_TYPE_DOUBLE
  • نوع سلسلة نصية ، يتوافق مع char *( G_TYPE_STRING) في لغة C؛
  • نوع مؤشر مبهم ، يتوافق مع void *( G_TYPE_POINTER) C.

الأنواع الأساسية المدمجة المصنفة هي:

  • نوع فئة أساسية لمثيلات GObject، جذر شجرة وراثة الفئات القياسية ( G_TYPE_OBJECT)
  • نوع واجهة أساسي ، مشابه لنوع الفئة الأساسية ولكنه يمثل جذر شجرة وراثة الواجهةG_TYPE_INTERFACE القياسية ( )
  • نوع للهياكل المعبأة ، والتي تُستخدم لتغليف كائنات القيمة البسيطة أو الكائنات الخارجية في "صناديق" يتم عد المراجع لها ( G_TYPE_BOXED)
  • نوع لـ "كائنات تحديد المعلمات"، والتي تستخدم في GObject لوصف البيانات الوصفية لخصائص الكائن ( G_TYPE_PARAM).

تُسمى الأنواع التي يمكن لنظام الأنواع إنشاء مثيل لها تلقائيًا بالأنواع القابلة للإنشاء . ومن أهم خصائص هذه الأنواع أن البايتات الأولى لأي مثيل تحتوي دائمًا على مؤشر إلى بنية الفئة (نوع من الجداول الافتراضية ) المرتبطة بنوع المثيل. ولهذا السبب، يجب تصنيف أي نوع قابل للإنشاء. وعلى النقيض من ذلك، يجب أن يكون أي نوع غير مصنف (مثل الأعداد الصحيحة أو السلاسل النصية ) غير قابل للإنشاء. من ناحية أخرى، فإن معظم الأنواع المصنفة قابلة للإنشاء، ولكن بعضها، مثل أنواع الواجهات، ليس كذلك.

النوع المشتق

تندرج الأنواع المشتقة من الأنواع الأساسية المضمنة في GObject تقريبًا ضمن أربع فئات:

أنواع مُعَدَّة وأنواع "علامات"
بشكل عام، يجب تسجيل كل نوع مُعدّد وكل نوع حقل بت قائم على الأعداد الصحيحة (أي كل enumنوع) يرغب المستخدم في استخدامه بطريقة ما مرتبطة بنظام الكائنات - على سبيل المثال، كنوع لخاصية كائن - في نظام الأنواع. عادةً، يتم إنشاء رمز التهيئة الذي يتولى تسجيل هذه الأنواع بواسطة أداة آلية تُسمى glib-mkenums[ 4 ] ويُخزّن في ملف منفصل.
أنواع معبأة في صناديق
قد تحتاج بعض هياكل البيانات البسيطة جدًا بحيث لا يمكن تحويلها إلى أنواع فئات كاملة (مع كل ما يترتب على ذلك من تكاليف إضافية) إلى التسجيل في نظام الأنواع. على سبيل المثال، قد يكون لدينا فئة نرغب في إضافة background-colorخاصية إليها، بحيث تكون قيمها نسخًا من بنية بيانات معينة . لتجنب الحاجة إلى إنشاء فئة فرعية ، يمكننا إنشاء نوع مُغلّف لتمثيل هذه البنية، وتوفير دوال للنسخ والتحرير. يأتي GObject مزودًا بمجموعة من الأنواع المُغلّفة التي تغلف أنواع بيانات GLib البسيطة. من الاستخدامات الأخرى للأنواع المُغلّفة تغليف الكائنات الخارجية في حاوية مُوسومة يمكن لنظام الأنواع التعرف عليها ومعرفة كيفية نسخها وتحريرها.structcolor{intr,g,b;}GObject
أنواع المؤشرات المعتمة
أحيانًا، بالنسبة للكائنات التي لا تحتاج إلى نسخ أو عدّ المراجع أو تحرير، قد يكون استخدام نوع مُغلّف مُبالغًا فيه. مع أنّه يُمكن استخدام هذه الكائنات في GObject ببساطة عن طريق التعامل معها كمؤشرات مُبهمة G_TYPE_POINTER، إلا أنّه من الأفضل غالبًا إنشاء نوع مؤشر مُشتق، مع توثيق حقيقة أن المؤشرات يجب أن تُشير إلى نوع مُحدد من الكائنات، حتى وإن لم يُذكر أي شيء آخر عنها.
أنواع الفئات والواجهات
معظم أنواع البيانات في تطبيق GObject هي فئات - بالمعنى المتعارف عليه في البرمجة الكائنية - مشتقة بشكل مباشر أو غير مباشر من الفئة الجذرية GObject. كما توجد واجهات، والتي، على عكس واجهات جافا التقليدية ، يمكن أن تحتوي على دوال مُنفذة. وبالتالي، يمكن وصف واجهات GObject بأنها مزيجات .

أنظمة المراسلة

يتكون نظام مراسلة GObject من جزأين متكاملين: الإغلاقات والإشارات .

عمليات الإغلاق
تُعدّ دالة الإغلاق GObject نسخةً مُعمّمةً من دالة الاستدعاء . يدعم هذا النوع من الدوال دوال الإغلاق المكتوبة بلغة C و C++، بالإضافة إلى لغات برمجة أخرى (عند توفير روابط). يسمح هذا باستدعاء التعليمات البرمجية المكتوبة بلغات مثل Python و Java عبر دالة إغلاق GObject.
الإشارات
تُعدّ الإشارات الآلية الأساسية لاستدعاء الدوال المغلقة. تُسجّل الكائنات مستمعي الإشارات في نظام الأنواع، مُحدّدةً بذلك ربطًا بين إشارة مُحدّدة ودالة مغلقة مُحدّدة. عند إصدار إشارة مُسجّلة، يتم استدعاء الدالة المغلقة لتلك الإشارة. في GTK، يُمكن لجميع أحداث واجهة المستخدم الرسومية الأصلية (مثل حركة الماوس وإجراءات لوحة المفاتيح) توليد إشارات GObject ليتفاعل معها المستمعون.

تنفيذ الفئة

يتم تنفيذ كل فئة من فئات GObject بواسطة بنيتين على الأقل: بنية الفئة وبنية المثيل .

بنية الفئة
يتوافق هيكل الصنف مع جدول الدوال الافتراضية (vtable) لصنف C++. يجب أن يبدأ بهيكل الصنف الأب. بعد ذلك، سيحتوي على مجموعة من مؤشرات الدوال - مؤشر لكل دالة افتراضية في الصنف. يمكن استخدام متغيرات خاصة بالصنف لمحاكاة أعضاء الصنف.
بنية المثال
يجب أن تبدأ بنية الكائن، التي ستوجد بنسخة واحدة لكل كائن، ببنية الكائن الأصلية (وهذا يضمن أن تبدأ جميع الكائنات بمؤشر إلى بنية الكائن الأصلية، لأن جميع الأنواع الأساسية القابلة للإنشاء تشترك في هذه الخاصية). بعد البيانات الخاصة بالكائن الأصلي، يمكن أن تحتوي البنية على أي متغيرات خاصة بالكائن، والتي تُقابل متغيرات أعضاء لغة C++.

يُعدّ تعريف فئة في إطار عمل GObject عملية معقدة، تتطلب كميات كبيرة من التعليمات البرمجية النمطية ، مثل التعريفات اليدوية لوحدات تحويل الأنواع وعبارات تسجيل الأنواع المعقدة. ونظرًا لأن بنية C لا تدعم مُعدِّلات الوصول مثل "public" أو "protected" أو "private"، فلا بد من استخدام حلول بديلة لتوفير التغليف . يتمثل أحد هذه الحلول في تضمين مؤشر إلى البيانات الخاصة - والتي تُسمى عادةً "private _priv" - في بنية الكائن. يمكن تعريف البنية الخاصة في ملف رأس "public"، ولكن تعريفها فقط في ملف التنفيذ، مما يجعل البيانات الخاصة غير مرئية للمستخدمين، ولكنها شفافة للمُنفِّذ. إذا تم تسجيل البنية الخاصة في GType، فسيتم تخصيصها تلقائيًا بواسطة نظام الكائنات. في الواقع، ليس من الضروري حتى تضمين المؤشر _priv، إذا كان المستخدم على استعداد لاستخدام عبارة التسجيل G_TYPE_INSTANCE_GET_PRIVATEفي كل مرة يحتاج فيها إلى البيانات الخاصة.

لمعالجة بعض هذه التعقيدات، توجد عدة لغات برمجة عالية المستوى تُترجم من المصدر إلى المصدر إلى GObject بلغة C. تستخدم لغة البرمجة Vala بنيةً شبيهة بلغة C# ، ويتم معالجتها مسبقًا إلى كود C عادي . يوفر GObject Builder، أو GOB2 ، بنيةً للقوالب تُشبه بنية Java .

استكشاف كائن G

الاستخدام

يتم استخدام مزيج C و GObject في العديد من مشاريع البرمجيات الحرة الناجحة ، مثل سطح مكتب GNOME ، ومجموعة أدوات GTK ، وبرنامج معالجة الصور GIMP .

على الرغم من أن العديد من تطبيقات GObject مكتوبة بالكامل بلغة C، إلا أن نظام GObject يتوافق بشكل جيد مع أنظمة الكائنات الأصلية للعديد من اللغات الأخرى، مثل C++ و Java و Ruby و Python و Common Lisp و . NET / Mono . ونتيجة لذلك، عادةً ما يكون إنشاء روابط لغوية للمكتبات المكتوبة جيدًا والتي تستخدم إطار عمل GObject أمرًا سهلاً نسبيًا.

على سبيل المثال، تستخدم العديد من برامج بايثون مكتبات مكتوبة بلغة C تستخدم إطار عمل GObject من خلال ربط لغة PyGObject . (بعضها مدرج في تصنيف: البرامج التي تستخدم PyGObject ).

كتابة كود GObject بلغة C في المقام الأول عملية مطولة نسبيًا. تتطلب المكتبة وقتًا طويلًا لتعلمها، وغالبًا ما يجد المبرمجون ذوو الخبرة في لغات البرمجة الكائنية عالية المستوى العمل مع GObject بلغة C أمرًا شاقًا نوعًا ما. على سبيل المثال، GObjectقد يتطلب إنشاء فئة فرعية (حتى لو كانت مجرد فئة فرعية من فئة أخرى) كتابة و/أو نسخ كميات كبيرة من التعليمات البرمجية النمطية . [ 6 ] مع ذلك، من المرجح أن يجعل استخدام Vala ، وهي لغة مصممة أساسًا للعمل مع GObject والتي تُحوّل إلى C، العمل مع GObject أو كتابة مكتبات تعتمد على GObject أكثر سهولة.

على الرغم من أنها ليست كائنات من الدرجة الأولى (لا توجد أنواع بيانات وصفية فعلية في GType)، إلا أن تطبيقات GObject تُنشئ كائنات وصفية مثل الفئات والواجهات أثناء التشغيل، وتوفر دعمًا جيدًا للاستبطان . تستخدم روابط اللغات وتطبيقات تصميم واجهات المستخدم مثل Glade إمكانيات الاستبطان للسماح بأمور مثل تحميل مكتبة مشتركة توفر فئة GObject - عادةً ما تكون نوعًا من الأدوات ، في حالة Glade - ثم الحصول على قائمة بجميع خصائص الفئة، بما في ذلك معلومات النوع وسلاسل التوثيق.

مقارنات مع أنظمة الكائنات الأخرى

بما أن GObject توفر نظام كائنات شبه كامل للغة C ، فيمكن اعتبارها بديلاً للغات المشتقة من C مثل C++ و Objective-C ، على الرغم من أن كلتيهما توفران العديد من الميزات الأخرى إلى جانب أنظمة الكائنات الخاصة بهما. ومن الفروق الواضحة بين C++ وGObject أن GObject (مثل Java) لا تدعم الوراثة المتعددة . [ 7 ]

يؤدي استخدام GObject لدالة تخصيص الذاكرة g_malloc() من مكتبة GLib إلى إنهاء البرنامج بشكل غير مشروط عند نفاد الذاكرة، على عكس دالة malloc () في مكتبة C، ودالة new في C++ ، وغيرها من دوال تخصيص الذاكرة الشائعة التي تسمح للبرنامج بالتعامل مع حالات نفاد الذاكرة أو حتى التعافي منها تمامًا دون توقف البرنامج. [ 8 ] وهذا ما يمنع تضمين GObject في البرامج التي تتطلب مرونة عالية في مواجهة محدودية الذاكرة، أو التي تتعامل مع عدد كبير جدًا من الكائنات أو كائنات ضخمة جدًا. يمكن استخدام g_try_new() عندما يكون احتمال فشل تخصيص الذاكرة أكبر (لكائن كبير الحجم على سبيل المثال)، ولكن هذا لا يضمن عدم فشل التخصيص في أي مكان آخر من الكود. [ 9 ]

ثمة فرق جوهري آخر يتمثل في أن لغتي C++ وObjective-C منفصلتان، بينما GObject مكتبة برمجية بحتة، وبالتالي لا تُضيف أي قواعد نحوية جديدة أو ميزات ذكية للمترجم. على سبيل المثال، عند كتابة كود C باستخدام GObject، غالبًا ما يكون من الضروري إجراء تحويل صريح للأنواع . لذا، فإن "C مع GObject"، والتي تُسمى أيضًا "C بنكهة glib"، تُعتبر لغة منفصلة عن لغة C العادية، وهي مجموعة شاملة لها تمامًا - مثل Objective-C، ولكن على عكس C++.

في المنصات التي لا يوجد فيها واجهة تطبيق ثنائية (ABI) قياسية تعمل مع جميع مُجمِّعات لغة C++ (وهو أمر نادر الحدوث، حيث يُعتمد عادةً إما على واجهة Itanium ABI أو واجهة Microsoft ABI)، لا تستطيع المكتبة المُجمَّعة باستخدام مُجمِّع C++ معين استدعاء مكتبة مُجمَّعة باستخدام مُجمِّع آخر. إذا كانت هذه التوافقية مطلوبة، فيجب تصدير دوال C++ كدوال C عادية، مما يُفقد نظام كائنات C++ جزءًا من جدواه. تكمن المشكلة جزئيًا في أن مُجمِّعات C++ المختلفة تستخدم أنواعًا مختلفة من معالجة الأسماء لضمان تفرد جميع الرموز المُصدَّرة. (هذا ضروري لأنه، على سبيل المثال، قد تحتوي فئتان مختلفتان على دوال أعضاء تحمل نفس الاسم، أو قد يتم تحميل اسم دالة واحدة عدة مرات، أو قد تظهر دوال تحمل نفس الاسم في مساحات أسماء مختلفة ، ولكن في كود الكائن، لا يُسمح بهذه التداخلات). في المقابل، نظرًا لأن لغة C لا تدعم أي شكل من أشكال التحميل الزائد أو مساحات الأسماء، فإن مطوري مكتبات C يستخدمون عادةً بادئات صريحة لضمان التفرد العالمي لأسمائهم المُصدَّرة. وبالتالي، على الرغم من كونها كائنية التوجه، فإن المكتبة القائمة على GObject والمكتوبة بلغة C ستستخدم دائمًا نفس أسماء الرموز الخارجية بغض النظر عن المترجم المستخدم.

لعلّ أبرز اختلاف يكمن في تركيز GObject على الإشارات (التي تُسمى أحداثًا في لغات أخرى). ينبع هذا التركيز من تصميم GObject خصيصًا لتلبية احتياجات أدوات واجهة المستخدم الرسومية. مع وجود مكتبات إشارات لمعظم لغات البرمجة كائنية التوجه، إلا أن الإشارات في GObject مُدمجة في نظام الكائنات. لهذا السبب، يميل تطبيق GObject النموذجي إلى استخدام الإشارات على نطاق أوسع بكثير من التطبيقات الأخرى، مما يجعل مكونات GObject أكثر تغليفًا وقابلية لإعادة الاستخدام من تلك التي تستخدم لغة C++ أو Java. عند استخدام glibmm / gtkmm ، وهما غلافا C++ الرسميان لمكتبتي Glib وGTK على التوالي، يُتيح مشروع libsigc++ الشقيق سهولة استخدام إشارات GObject الأساسية باستخدام C++ القياسية. بالطبع، تتوفر تطبيقات أخرى للإشارات على جميع المنصات تقريبًا، مع أن الأمر قد يتطلب أحيانًا مكتبة إضافية، مثل Boost.Signals2 للغة C++.

انظر أيضاً

مراجع

  1. "2.87.0 · GNOME / GLib · GitLab" . تم الاطلاع عليه بتاريخ 25 نوفمبر 2025 .
  2. "دليل مرجعي لـ GObject" .
  3. "دليل مرجع GObject - الإصدار المستقر" .
  4. "glib-mkenums، دليل مرجعي لـ GObject" .
  5. "التأمل، ملخص" . مطور جنوم، إرشادات البرمجة - إرشادات محددة . تم الاطلاع عليه بتاريخ 9 أغسطس 2020 .
  6. "كيفية تعريف وتنفيذ كائن GObject جديد" . gnome.org . تم الاطلاع عليه بتاريخ 27 يوليو 2013 .
  7. "لغة سي++ - لماذا تم إنشاء نظام GObject؟" . موقع ستاك أوفرفلو . تم الاطلاع عليه بتاريخ 16 نوفمبر 2019 .
  8. "تخصيص الذاكرة: دليل مرجعي لمكتبة GLib" . developer.gnome.org . تم الاطلاع عليه بتاريخ 16-11-2019 .
  9. "تخصيص الذاكرة: دليل مرجعي لمكتبة GLib" . developer.gnome.org . تم الاطلاع عليه بتاريخ 17-11-2019 .