اليوم يوم جميل وقد أزمعت على أن أترجم لكم شيئاً
وكان أول موضوع وقع بين يدي موضوع يتكلم عن المعالجة القبلية preprocessor
طبعاً الموضوع غني عن التعريف بالنسبة للأخوة الذين يعرفون شيئاً عن لغة C أو C++
طبعاً المتحولون منهم إلى لغة الجافا سيهيمون حباً بي لأني أذكرهم بالماضي الأثير
هناك من سيعتبر الموضوع مجرد هرطقة لا تقدم ولا تأخر وسيعتبروني … كبير على أساس أن لغة الجافا لغة متخلفة عقلياً
لكل رأيه ولو كان الناس جميعهم على رأيي لوجدتوني حاكماً للعالم في مدة عشرة أيام
في البداية سنتحدث عن المعالجة القبلية كنبذة مختصرة من لديه تعديل على هذا الجزء فليراسلني فلست خبيراً بـ C
هي عبارة عن مجموعة من الأوامر يتم تنفيذها يتم أثناء عملية الترجمة Compile
يتم في هذه المرحلة إزالة كل الأوامر التابعة للمعالجة القبلية و استبدالها بما تشير اليه
بمعنى إذا كنت تبدأ الكود ب
و يحل محلها النص المكتوب داخل الملف stdio.h
ومن أهم أنواع المعالجة القبلية الأوامر التالية
1- Include
2- define
3- if else elseif endif
بالنسبة للنوع الأول يظهر للجميع من الشرح الأولي أن الجافا تقوم بذلك بطريقة أفضل عن طريق import
نأتي إلى النوعين الثاني والثالث وهما بيت القصيد
في الـ C عندما تقوم بتعريف ثابت عن طريق define فإنه يقوم باستبدال كل مكان
استخدمت فيه الثابت بقيمته ولا يقوم بحجز مكان له في الذاكرة من الأصل
بالنسبة للجافا تقوم بتعريف الثابت من خلال كلمة final في الواقع الآلة الافتراضية تقوم بحجز مكان له في الذاكرة
ولكي نحصل على ثابت بدون أن نحجز له مكان في الذاكرة فعلينا أن نقوم بالتالي
1- نقوم ببناء واجهة جديدة
2- نعرف فيها ثابت بالطريقة التالية
public static final boolean SillyPlatform = true;
3- نقوم بعمل import للواجهة
4- نستخدم الثابت في البرنامج بالطريقة التالية
ConstantStuff.SillyPlatform
5- أو قوم بعمل بناء للواجهة implements واستخدم المتغير بشكل مباشر
بالنسبة للنوع الثالث
فالفائدة المرجوة منه التنقل بين البيئات المختلفة
مثال ذلك أنك تريد أن تقوم بتصميم برنامجك لشبكة مثلاً ولكنها غير متوفرة دائماً
فهل ستقوم كل مرة تريد فيها تجريب الشيفرة بتعديل الشيفرة لكي تتناسب مع الشبكة أو بدونها
الأمر مكلف بشكل كبير
لذلك نستعيض عنها بالأمر الثالث
فنكتب البرنامج مرة بدون شبكة وننسخه مرة أخرى ونعدل عليه ليلائم الشبكة
ثم نستخدم ثابت من الثوابت قبلية المعالجة
تغيره على حسب البيئة التي تريدها
وهذه هي الشيفرة المستخدمة للـ C
#if defined(SILLY_PLATFORM) /* الشيفرة بدون شبكة */ #else /* الشيفرة في وجود الشبكة */ #endif
في الجافا سنقوم بذلك بعد أن قمنا بعمل الخطوات للثابت قبلي المعالجة
سنقوم باستخدام الشيفرة التالية
if (ConstantStuff.SillyPlatform) { // الشيفرة بدون شبكة } else { // الشيفرة في وجود الشبكة }
في النهاية أريد أن أؤكد على أن كل هذا يتم في وقت الترجمة ولا دخل له في وقت التشغيل
المراجع:
1-Create constants that have the benefits of using the C preprocessor’s facilities
http://www.javaworld.com/javaworld/javatips/jw-javatip5.html
2- ويكابيديا الإنجليزي C preprocessor
http://en.wikipedia.org/wiki/C_preprocessor
3- رد للأخ البشمهندس في موضوع بعنوان ماهـو الـ struct … والـ #define … وفائدتهما .؟ ,منتدى الفريق العربي للبرمجة
http://www.arabteam2000-forum.com/index.php?showtopic=75188&st=0&p=383075&#