فاكه له تى زانسته مروفايه تيه كان و وه ر زشى خانقين
 
الرئيسيةاليوميةس .و .جبحـثالأعضاءالمجموعاتالتسجيلدخول

شاطر | 
 

 دروس في سي بلس بلس ++C - الاقترانات السطرية Inline function

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل 
كاتب الموضوعرسالة
Admin
Admin


المساهمات : 191
تاريخ التسجيل : 21/02/2012

مُساهمةموضوع: دروس في سي بلس بلس ++C - الاقترانات السطرية Inline function   الخميس مارس 29, 2012 7:24 pm

دروس في سي بلس بلس ++C - الاقترانات السطرية Inline function
2007-09-26
تعتبر الإجراءات الفرعية من أهم الوسائل المستخدمة لتقسم البرنامج .حيث يتكفل كل إجراء منها بتنفيذ مهمة محددة, كما تستخدم الإجراءات الفرعية لتنظيم العمل المشترك بين مجموعة من المبرمجين.

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

لهذه الأسباب وغيرها , وفرت لنا لغة C++ أسلوب برمجي يعرف بالاقترانات السطرية Inline Function والتي تكون صيغتها العامة على النحو التالي :

inline Return_Data_Type Function_Name(Passig_Data);


قد لا تختلف الصيغة السابقة عن الصيغة العامة للتصريح عن الاقتران الفرعي , إلا في نقطة واحدة وهي إضافة الكلمة المحجوزة inline قبل نوع البيانات العائدة من الاقتران. ماذا تعني الكلمة المحجوزة inline لمترجم C++ ؟؟

بمجرد وصول المترجم إلى تعليمة التصريح Declaration عن الاقتران الفرعي , سيجدها مميزة بالكلمة المحجوزة inline لذا سعل بصورة تلقائية على إعادة كتابة نسخ من الاقتران الفرعي في مكان كل تعليمة استدعاء داخل البرنامج الرئيسي , شرط مراعاة حجم الاقتران الفرعي , وبذلك سنتجنب عملية الاستدعاء أثناء مرحلة التنفيذ مما سيوفر علينا الزمن الضائع. ولكن يشترط هنا مترجم C++ ان يكون حجم الاقتران الفرعي صغيرا ومحدود العدد من التعليمات البرمجية لإجراء عملية إعادة الكتابة ويعتبر هذا الشط من ناحية هندسة البرمجة من أسباب قوة لغة C++ .ولعل السبب في ذلك أصبح واضحا , إذ يتم آليا تفضيل الزمن الضائع على حجم البرنامج الذي سيصبح كبيرا جدا بسبب كثرة النسخ المتكررة من الاقتران ذاته المنسوخة في مكان تعليمات الاستدعاء .

ولتوضيح ذلك , لنفترض ان لدينا برنامجا بحجم 500KB يحتوي على الإجراء الفرعي X بحجم 50KB وان هذا الاقتران يستدعي عشر مرات داخل البرنامج الرئيسي , وان شرط التفضيل بين الزمن الضائع من الاستدعاء و حجم البرنامج الرئيسي غير موجود في مترجم C++ , عندها سيعمل المترجم على عمل عشر نسخ من الاقتران x وبذلك يصبح حجم البرنامج العام 100KB أي الضعف . ومن المعروف ان المساحة المحجوزة بذاكرة المعالج تتناسب طرديا مع حجم البرنامج . وبذلك سيفوق زمن تنفيذ البرنامج الزمن الطبيعي ( دون استخدام أسلوب inline ) بالإضافة لاستهلاك مساحة ذاكرة المعالج.

وبموجب ما سبق , فان المترجم سيتعامل مع أسلوب inline بحساسية فائقة , إذ سيقوم بفحص حجم الإجراء الفرعي المميز inline فإذا كان كبير الحجم عندها سيتجاهل تعليمة inline ليتعامل معه بالصورة التقليدية أي الاستدعاء أثناء التنفيذ . اما إذا كان الاقتران الفرعي صغيرا فسيعمل المترجم على إصدار وكتابة عدة نسخ منه لتوضع بصورة غير مرئية للمبرمج مكان كل تعليمة استدعاء .

مثال على أسلوب inline :لدينا البرنامج التالي -برنامج 1- الذي يحتوي الإجراء الفرعي Sum الذي يتكفل بحساب مجموع العلامة الأولى ممثلة بالمتغير A مع العلامة الثانية ممثلة بالمتغير B

#include<iostream.h>

int A=0;

int B=0;

inline int Sum(int m1,int m2);

void main()
{

cin>>A;

cin>>B;

cout<<Sum(A,B);

}

int Sum(int m1,int m2);

{

return m1+m2;

}




فعند ترجمة البرنامج , سيعمل المترجم على كتابة نسخة مطابقة من الإجراء الفرعي Sum داخل تعليمة الطباعة cout التي تستدعي الإجراء الفرعي Sum , بالطبع نحن لن نرى تلك النسخة داخل البرنامج المصدري المفتوحة على واجهة محرر الكود لكنها ستكون مسجلة بالفعل داخل النسخة الناتجة عن عملية الترجمة ( البرنامج الهدف التنفيذي) .

ملاحظة: في حال تم تميز اقتران بكلمة inline ,فانه يتعين علينا إعادة ترجمة البرنامج من جديد لكي يستطيع المترجم تطبيق الاقتران السطري و ان أمكن ذلك (بحسب حجم الاقتران الفرعي _الإجراء)

المفهوم الخاطئ للاقترانات السطرية
قد يعتقد البعض ان أسلوب الاقتران السطري هو كتابة الإجراء الفرعي بكامل عناصره الأساسية بسطر برمجي واحد .ز وهذا اعتقاد خاطئ حيث تسمح لغة C++ للمبرمج بكتابة أي تعليمة برمجية منفردة داخل سطر برمجي كما تعلمنا أثناء دراسة حلقة التكرار for وكذلك جملة الشرط if .

فإذا كان الإجراء الفرعي لا يحتوي ألا تعليمة برمجية واحدة فعندها يمكننا كتابة داخل سطر برمجي واحد فقط بشرط ان يكون هذا السطر مكان تعليمة التصريح Declaration عن الإجراء الفرعي , بذلك تكون تعليمة التصريح شاملة لجسم الاقتران كما في الصيغة التالية:

int X(int C,int B)
{

return C*B;

}





وهنا نجد ان الاقتران X يحتوي تعليمة برمجية واحدة فقط ممثلة بتعليمة ضرب المتغير C بالمتغير B لذلك يمكننا كتابة الاقتران X داخل سطر واحد إلا وهو سطر التصريح. مثال: لنعيد كتابة البرنامج 1 السابق مستخدمين طريقة كتابة الإجراء Sum داخل سطر واحد دون تميزه بكلمة inline ؟

#include<iostream.h>

int A=0;

int B=0;

int Sum(int m1,int m2)

{

return m1+m2;

}

cin>>A;

cin>>B;

cout<<Sum(A,B);

}




لاحظ أثناء عملية التصريح عن الإجراء الفرعي Sum , إننا قمنا بكتابة جسم الاقتران بصورة مباشرة مبتدئين بعلامة قوس البداية واتبعناها بتعليمة إرجاع return ناتج عملية الجمع منتهية بالفاصلة المنقوطة وأخيرا علامة قوس النهاية. لنحصل بذلك على اقتران فرعي متكامل العناصر (التصريح وجسم الاقتران). وقد يتساءل البعض عن إمكانية استخدام الأسلوب Inline Function مع الاقتران المكتوب داخل سطر واحد؟

الجواب نعم, يمكننا إجراء ذلك, إذ انه لا يوجد فرق برمجي بين الاقتران المكتوب داخل سطر واحد وبين الاقتران المكتوب على شقين منفصلين الشق الأول يكون عملية التصريح التي تسبق الاقتران الرئيسي main() والشق الثاني يكون جسم الاقتران الذي يكتب في نهاية البرنامج أسفل الاقتران الرئيسي. لنحصل في النهاية على البرنامج بالشكل التالي:

#include<iostream.h>

int A=0;

int B=0;

inline int Sum(int m1,int m2)
{

return m1+m2;

}

void main()

{

cin>>A;

cin>B;

cout<<Sum(A,B);

}

الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://elkh.yoo7.com
 
دروس في سي بلس بلس ++C - الاقترانات السطرية Inline function
استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
elkh :: وحدة الحاسبة والانترنيت-
انتقل الى: