طراز كائن المكون

طراز كائن المكون (بالإنجليزية: Component Object Model واختصارًا COM) هو واجهة ثنائية مستقلة عن اللغة، طورتها شركة مايكروسوفت، تسمح بالتفاعل بين المكونات البرمجية في بيئة شبكية موزعة. تتيح هذه التقنية للمطورين إنشاء كائنات يمكن استخدامها في بيئات مختلفة، وبين لغات برمجة متعددة، وحتى بين عمليات مختلفة على نفس الجهاز أو عبر أجهزة مختلفة.

يُعد الطراز الأساس للعديد من التقنيات والأطر الأخرى من مايكروسوفت، بما في ذلك ربط وتضمين الكائنات (OLE)، وأتمتة OLE، وأكتيف إكس، و+COM، وDCOM. كما أنه جزء لا يتجزأ من تطبيقات ومكونات أساسية في نظام ويندوز مثل دايركت إكس، وواجهة ويندوز، وUMDF.

 التاريخ 
ظهر نموذج كائن المكون (COM) لأول مرة في عام 1993 كخليفة لتقنية ربط وتضمين الكائنات (OLE 1.0) التي كانت مبنية على تبادل البيانات الديناميكي (DDE). قدمت النسخة الجديدة OLE 2.0 بنية تحتية قائمة على COM، مما وفر أساسًا أكثر قوة ومرونة لتطوير البرمجيات القائمة على المكونات. في عام 1996، قامت مايكروسوفت بتعميم استخدام COM وتوسيعه ليشمل الإنترنت تحت اسم أكتيف إكس. ومع إطلاق ويندوز NT 4.0، تم تقديم نموذج كائن المكون الموزع (DCOM) للسماح للكائنات بالتواصل عبر الشبكات. لاحقًا، تم تطوير +COM في عام 1997 كتحسين للنموذج الأصلي.Chappell, David. Understanding ActiveX and OLE. Microsoft Press, 1996. ISBN 978-1-57231-216-6.

 التفاصيل التقنية 
يعتمد COM على عدة مبادئ أساسية تضمن عمل المكونات بشكل مستقل وقابل لإعادة الاستخدام.

 الواجهات (Interfaces) 
المبدأ الأساسي في COM هو فصل الواجهة عن التنفيذ. فالبرامج العميلة لا تتفاعل مع الكائن مباشرة، بل عبر واجهاته. الواجهة هي عقد مُعرَّف بصرامة، يتكون من مجموعة من الدوال ذات الصلة. يجب على كل مكون COM أن يطبق على الأقل الواجهة القياسية `IUnknown`، والتي توفر الآليات الأساسية لإدارة دورة حياة الكائن والوصول إلى واجهاته الأخرى.

 عد المراجع (Reference Counting) 
يدير COM دورة حياة الكائنات (متى يتم إنشاؤها ومتى يتم تدميرها) باستخدام تقنية عد المراجع. كل كائن COM مسؤول عن تتبع عدد العملاء الذين يستخدمونه حاليًا. عندما يبدأ عميل جديد في استخدام الكائن، فإنه يستدعي دالة `AddRef` لزيادة العداد. وعندما ينتهي من استخدامه، يستدعي دالة `Release` لإنقاص العداد. عندما يصل العداد إلى الصفر، يقوم الكائن بتدمير نفسه وتحرير الذاكرة التي يشغلها.

 المعرفات الفريدة عالميًا 
لتجنب التعارض في الأسماء بين المكونات التي يطورها آلاف المبرمجين، يستخدم COM معرفات فريدة عالميًا (GUIDs). كل واجهة وكل صنف مكون (class) في COM يُعطى معرفًا فريدًا خاصًا به يُعرف باسم `IID` للواجهات و `CLSID` للأصناف. هذه المعرفات هي أرقام مكونة من 128 بت، مما يضمن عدم وجود مكونين أو واجهتين لهما نفس المعرف عن طريق الخطأ.

 التعامل مع الخيوط 

في نموذج كائن المكون (COM)، يتم التعامل مع الخيوط من خلال مفهوم يُعرف باسم «الشقق» (بالإنجليزية: Apartments).Microsoft MSDN: Processes, Threads, and Apartments  يعيش كل كائن COM فردي في شقة واحدة فقط، والتي قد تكون إما أحادية الخيط أو متعددة الخيوط. هناك ثلاثة أنواع من الشقق في COM: «شقة أحادية الخيط» (STA)، و«شقة متعددة الخيوط» (MTA)، و«شقة محايدة الخيوط» (NA). تمثل كل شقة آلية واحدة يمكن من خلالها مزامنة الحالة الداخلية للكائن عبر خيوط متعددة. يمكن أن تتكون العملية الواحدة من عدة كائنات COM، قد يستخدم بعضها STA بينما يستخدم البعض الآخر MTA. وبالمثل، تعيش جميع الخيوط التي تصل إلى كائنات COM في شقة واحدة. يتم تحديد اختيار الشقة لكائنات وخيوط COM في وقت التشغيل، ولا يمكن تغييره.

 نوع الشقة  نموذج الخيوط  الوصف شقة أحادية الخيط(Single-Threaded Apartment - STA) شقة (Apartment)يتم تخصيص خيط واحد فقط لتنفيذ دوال الكائن. أما استدعاءات الدوال من خيوط خارج الشقة فيتم تنظيمها (مارشالينغ) ووضعها في قائمة انتظار تلقائيًا بواسطة النظام (عبر رسائل ويندوز). وبالتالي، يوفر وقت تشغيل COM المزامنة لضمان تنفيذ كل استدعاء لدالة في الكائن حتى اكتماله قبل استدعاء دالة أخرى. شقة متعددة الخيوط(Multi-Threaded Apartment - MTA)Microsoft MSDN: Multithreaded Apartments  Freeلا يوفر وقت تشغيل COM أي مزامنة، ويُسمح لعدة خيوط باستدعاء دوال الكائن في وقت واحد. يجب على الكائن نفسه معالجة المزامنة لمنع المشاكل الناتجة عن الوصول المتزامن من خيوط متعددة. يتم أيضًا تنظيم الاستدعاءات إلى كائن MTA من خيط موجود في شقة STA. شقة محددة ديناميكيًا كلاهما (Both)يختار الخادم تلقائيًا بين STA أو MTA عند إنشاء الكائن ليتناسب مع نوع شقة الخيط المستدعي.Microsoft MSDN: Understanding and Using COM Threading Models  يمكن أن يكون هذا مفيدًا لتجنب الحمل الزائد لعملية التنظيم عندما يتم الوصول إلى خوادم MTA بواسطة خيط STA. شقة محايدة الخيوط(Thread Neutral Apartment - NA) طبيعي شقة خاصة لا تحتوي على أي خيوط مخصصة لها. عندما يستدعي خيط STA أو MTA كائنًا من نوع NA في نفس العملية، فإن الخيط المستدعي يترك شقته مؤقتًا وينفذ الكود مباشرة في الشقة المحايدة دون أي تبديل بين الخيوط.Codeguru: Understanding COM Apartments  لذلك، يمكن اعتبار الشقة المحايدة كتحسين لاستدعاءات الدوال بين الشقق بكفاءة.

تتبع الخيوط والكائنات التي تنتمي إلى نفس الشقة نفس قواعد الوصول إلى الخيوط. وبالتالي، يتم تنفيذ استدعاءات الدوال التي تتم داخل نفس الشقة مباشرة دون أي مساعدة من COM. أما استدعاءات الدوال التي تتم عبر الشقق المختلفة فتتحقق من خلال عملية التنظيم، يتطلب هذا استخدام الوكلاء (proxies) والجذول (stubs).

 تخزين البيانات الوصفية للنوع 

في الأصل، كان يُشترط تخزين البيانات الوصفية لمكتبة الأنواع (type library) في سجل ويندوز. وكان عميل COM يستخدم معلومات السجل هذه لإنشاء الكائنات.

تم تقديم تقنية نموذج كائن المكون دون تسجيل (RegFree COM) مع نظام التشغيل ويندوز إكس بي للسماح بتخزين البيانات الوصفية لمكتبة الأنواع كـبيان تجميع (assembly manifest)، إما كمورد داخل الملف التنفيذي أو في ملف منفصل يتم تثبيته مع المكون. يسمح هذا بتثبيت إصدارات متعددة من نفس المكون على نفس الحاسوب في مجلدات مختلفة، كما يسمح بما يُعرف بـنشر XCOPY. تتمتع هذه التقنية بدعم محدود لخوادم COM التنفيذية (EXE COM servers) ولا يمكن استخدامها مع المكونات على مستوى النظام مثل MDAC، أو MSXML، أو دايركت إكس، أو إنترنت إكسبلورر.

أثناء تحميل التطبيق، يبحث محمل ويندوز عن ملف البيان. إذا كان موجودًا، يضيف المحمل المعلومات منه إلى «سياق التنشيط» (activation context). عندما يحاول «مصنع الأصناف» (class factory) في COM إنشاء نسخة من صنف ما، يتم فحص سياق التنشيط أولاً لمعرفة ما إذا كان يمكن العثور على تنفيذ لمعرف الصنف (CLSID). وفقط في حال فشل البحث، يتم فحص سجل ويندوز.

يمكن إنشاء كائن COM دون معلومات مكتبة الأنواع؛ فقط بوجود مسار ملف DLL ومعرف الصنف (CLSID). يمكن للعميل استخدام دالة `DllGetClassObject` الموجودة في مكتبة COM DLL مع معرف الصنف ومعرف الواجهة `IID_IClassFactory` لإنشاء نسخة من كائن المصنع (factory object). يمكن للعميل بعد ذلك استخدام دالة `CreateInstance` الخاصة بكائن المصنع لإنشاء نسخة من الكائن المطلوب. هذه هي نفس العملية التي يستخدمها النظام الفرعي لـ COM. إذا قام كائن تم إنشاؤه بهذه الطريقة بإنشاء كائن آخر، فإنه سيفعل ذلك بالطريقة المعتادة (باستخدام السجل أو البيان). لكن يمكنه إنشاء كائنات داخلية (قد لا تكون مسجلة على الإطلاق)، وتمرير مراجع لواجهاتها، باستخدام معرفته الخاصة.

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

يمكن للمطورين الذين يعملون بلغات .NET (مثل سي # أو Visual Basic .NET) استخدام مكونات COM القديمة من خلال تقنية تُعرف باسم "COM Interop"، والتي تعمل كجسر بين بيئة .NET وبيئة COM.

 انظر أيضًا 
 دايركت إكس
 إطار عمل دوت نت
 كوربا

 المراجع 

تصنيف:مايكروسوفت
تصنيف:هندسة البرمجيات
تصنيف:واجهات برمجة التطبيقات
تصنيف:برمجيات 1993
تصنيف:واجهات برمجة تطبيقات مايكروسوفت