فــُـصّـِــلـــَــــت

إستدعاء مكتبات خارجية من داخل نجم

المستوى: مبتدئ

يصعب على أية لغة برمجةٍ أن تعيش إذا لم تدعم النداءات الخارجية، وإمكانية استعمالها لأكواد مكتوبة بغيرها، ذلك لأنه إن لم تفعل، يجب حينها أن تعاد كتابة كلّ الخدمات والإمكانيات المتاحة حتّى الآن، وتوفير مكتبات لكلّ شيء بهذه اللغة، والأكثر من هذا، وجب الحرص على إعادة كتابة أية تقنية جديدة فور ظهورها، ذلك حتى تدعمها هذه اللغة، وإلا فإنّها تعجز وتشيخ وتصير مُتجاوَزة. وعليه فقد تمّ دعم النداءات الخارجية في لغة نجم وذلك حتى تحافظ لنا على شبابها وحيويتها ومواكبتها للتطورات، فنستمتع بها لوقت أطول.

المكتبات الخارجية


المكتبة هي مجموعة من الأكواد الخام الجاهزة للاستعمال، وهي جاهزة لأنه سبق أن تمت ترجمتها، إلا أنّها لا تحتوي على نقطة دخول من أجل تنفيذها، إذن فهي أكواد آلة لكنها غير قابلة للتنفيذ المباشر، وإنّما فقط إستعمالها من طرف برامج أخرى. لكن من أجل استعمالها يجب معرفة صيغة الملف الذي يحتويها، إذ أنّه لكل لغة برمجة صيغة تستهدفها، فإذا كانت المكتبة مكتوبة بلغة سي أو سي++ فصيغتها تكون مختلفة جدا عن مكتبة مكتوبة بالجافا مثلا، ولهذا فإنّه من أجل دعم المكتبات الخارجية، يجب أوّلا تحديد صيغ المكتبات التي سندعمها.

إلى جانب إختلافها من حيث الصيغة، تختلف المكتبات أيضا من حيث النوع، إذ أنّه يوجد نوعان أساسيان للمكتبات: مكتبات ساكنة، ومكتبات حركية.

المكتبات الساكنة ضد المكتبات الحركية


المكتبة الساكنة هي ملفات يتمّ دمجها وقت الترجمة مع البرنامج الذي يستدعيها لتكوّن بذلك ملفا تنفيذيا واحدًا يضم كلّ شيء، فتصير بذلك كما لو أنّه تمّت كتابتها مع البرنامج، أما المكتبات الحركية فهي ملفات يتم تحميلها وقت التنفيذ إلى حيّز مشترك من الذاكرة، فيمكن بذلك الوصول إليها من خلال أيّ برنامج يحتاجها. تُعرَف المكتبات الساكنة في نظام الويندوز بالامتداد (.lib)، وتُعرَف في نظام اللينكس بالامتداد (.a)، فيما تُعرف المكتبات الحركية في نظام الويندوز بالامتداد (.dll)، وتُعرف في نظام اللينكس بالامتداد (.so).

تتميّز المكتبات الساكنة بأنّها أكثر سرعة وثباتًا، كما أنّها لا تطرح مشاكل تعدد النسخ والتوافق، فيما تتميّز المكتبات الحركية بأنّها لا تزيد في حجم التنفيذ لأنّها لا تندمج معه، إضافة إلى أنّه يمكن مشاركتها بين جميع البرامج التي تحتاجها فقط بوضعها في مكان واحد، في حين أنّ المكتبة الساكنة تحتاج إلى أن يتمّ نسخها داخل كلّ برنامج يحتاجها.

فيما يخصّ نجم


يدعم نجم الآن المكتبات الخارجية الساكنة، والمكتوبة بأية لغة برمجة مُترجَمة، مثل سي وسي++ وغيرها، ذلك بخلاف لغات البرمجة المُفسّرة التي تستهدف آلات وهمية، مثل الجافا، لأنها تُنتِج مكتبات تتطلب توفّر آلتها الوهمية لتنفيذها، مما يُصعّب عملية دعمها.

إذا كانت في حوزتك مكتبة ساكنة (ملفات ".a" أو ملفات ".lib") تريد استخدامها من داخل نجم، فعليك بما يلي:
  1. نسخ الملفات داخل مشروعك.
  2. إضمام هذه الملفات داخل ملفك المصدر.
  3. استدعاء الدوال وكأنها جزء من مصدرك.

مثال حي


ولتوضيح الأمور، لنفترض أنّه لديك مكتبة بلغة سي والتي هي مجموعة من الملفات ".a"، وأنت تريد استخدام الملفّين "libio.a" و "libc.a". فإنّك تقوم أوّلا بنسخهما داخل مشروعك مثلا في "مشروعي\مكتبة\سي\"، ثم تقوم بإضمامهما كما يلي:

ربط "مشروعي\مكتبة\سي\libio.a"
ربط "مشروعي\مكتبة\سي\libc.a"
'... أكواد نجم'
لاحظ أنّه لإضمام مصادر مكتوبة بنجم فنحن نستخدم المفرد ضم، لكن لإضمام مكتبات خارجية فنحن نستخدم المفرد ربط.

إذا أردت مثلا إستدعاء الدالة "sum(int x, int y)" فإنّك تكتب ما يلي:

عدد ع1 = 4
عدد ع2 = 5
استدع "sum"، ع1، ع2   'استدعاء الدالة الخارجية: جمع العددين ع1 و ع2'
عدد ناتج = {عدد}.       'يُمثل المفرد . قيمة آخر عملية تمّت في نجم، وفي هذا السياق هي ردّ الدالة الخارجية'
هذا بشرط أن تكون الدالة sum موجودة فعلا في أحد الملفّين اللذين ثم ربطهما. وفي حال أعطيتَ الدالة الخارجية معطيات أقل مما تتطلّب، فإنّ نجم يعطيها قيمة إفتراضية 0، أما إذا أعطيتها أكثر مما تتطلب، فإن نجم يتجاهل المعطيات الزائدة ببساطة.

تَسهُل ملاحظة الفرق بين دوال نجم، والدوال الخارجية، حيث أنّه لمناداة دالة نجم فنحن نستخدم الصيغة الإعتيادية: اسم_دالة(معطى1، معطى2)، أما لاستدعاء دالة خارجية فنحن نستخدم المفرد استدع.

يمكن إذاً للمبرمج كتابة برنامجه باستخدام مكتباته المفضّلة، ومع ذلك تجب الإشارة إلى أنّ نجم يمتلك مكتبة أساسية في تطوّر جد سريع، ونحن نحاول من خلالها توفير قدر الإمكان من الخدمات التي قد يحتاجها المبرمج، ولذلك فإنّ استخدام المكتبات الخارجية هو فقط خيار وليس اضطرار.

ليست هناك تعليقات:

إرسال تعليق