السبت، 19 نوفمبر، 2011

المفاضلة بين لغات البرمجة 4

الشمول:
حينما تريد برمجة تطبيق نظامى يحتاج إلى الأداء الأفضل فعليك بالبرمجة بلغة الـ(C)، و حينما تريد برنامجاً يتعامل مع النوافذ و الواجهات المرئية فعليك بالـjava أو الـ(visual basic) أو الـ(C#)، أما التعامل مع قواعد البيانات فأمر هو أسهل مع الـjava و الـ(C#).. أما الدلفى فسلتجأ إليها حينما تريد أن... حيث أن لغة.... ليست قوية فى هذا المجال و كذا فإن لغتى ....و.... معقدتان بما يكفى لتحيلا حياتك إلى جحيم فى هذه المنطقة من المجال البرمجى. و.... حيث أن....
ما فات هو كلام أثق أن الكثيرين (إن لم يكن الأغلبية) قد سمعوه مراراً و تكراراً فى المنتديات المختلفة و الكتب المتنوعة التى تناقش موضوع الترجيح و المفاضلة بين لغات البرمجة المختلفة، و لا تكون الفائدة التى يخرج بها القارئ بعد ذلك إلا الإحساس أن كل تلك اللغات لا يغنى أحدها عن الآخر و لا يمثل واحداً منها دور الخادم الجيد فى كل مجال، و هو الإحساس الذى لا يسعد أحداً بحال من الأحوال.
و أنا أجد أنه من حقى كمبرمج بائس أن أقف لأتساءل عن السبب فى هذا، فهل السبب أن كل مجال من مجالات الحاسوب البرمجية يختلف عن المجالات الأخرى بدرجة تجعل اللغة التى تناسبه برمجياً لا تناسب الآخرين بنفس القدر؟، أم أن السبب أن كل لغة كان لها مجتمعها التقنى الذى ركز على جانب من الجوانب البرمجية و تراخى عن تغطية المناطق الأخرى فلم يغطها بذات القوة، و من ثم اشتهرت اللغة بمجال التركيز الأكبر و أهملت فى الجوانب الأخرى؟، أم قد يكون السبب أن كل مجال من المجالات كان له أهله ممن قام على أكتافهم معظم بنائه و كانوا قدراً يستخدمون لغة موحدة أو لغات قليلة العدد فى ذلك البناء و بالتالى كانت تلك اللغة أو تلك اللغات هى الوحيدة أو الأكثر ظهوراً عند أى حديث برمجى عن ذلك الجانب و رويداً رويداً أصبحت كأنها اللغة أو اللغات الممثلة له فعلياً؟ً. أم قد يكون السبب الرئيس هو كل تلك الأسباب مجتمعة؟.
الحق الذى أراه أن كل تلك الأسباب لها واقع يحققها و تنطبق عليه فى تاريخ لغات البرمجة بدرجات قوة تختلف من سبب لآخر، فالسبب الأول الذى يقول أن هناك مجالات برمجية تختلف كثيراً عن باقى المجالات و بالتالى فإن لغات البرمجة ذات النوعيات التى تناسب تلك المجالات لا تناسب المجالات البرمجية الأخرى يتحقق فى أحوال عديدة منها ما يلى:
  1. أنظمة الذكاء الاصطناعى التى تحتاج إلى استخدام القواعد المنطقية فى عملها، فمثل هذه الأنظمة لها مستوى عال للغاية من التجريد و البعد عن الآلات و طرق عملها، و بالتالى فإن لغة البرمجة التى تستخدم فيها لابد أن تكون بعيدة كل البعد عن التعقيد بل يجب أن تكون سهلة متدفقة غزيرة الإنتاجية و تستخدم المنطق، مثل لغات الـ(prolog) و الـ(logo) و غيرها من نوعية تلك اللغات المنطقية العالية للغاية فى المستوى. و لا يمكن مع مجالات كهذه أن نستخدم لغات منخفضة المستوى مثل الـ(C)، فكل ما سنجنيه حينها هو الإحباط و اليأس فى يقظة و الكوابيس و بلل الفراش مناماً.
  2. أنظمة قواعد البيانات و التعامل معها، حيث نجد أنه يتم استخدام نوع خاص من اللغات البرمجية مهما اختلف شكله فهو متشابه و يسمى لغات (الاستعلام) للتعامل معها، مثل لغات الـ(SQL) التى من بينها الـ(SQL) القياسى و (oracle SQL) و (MS SQL)و غيرها، و التقنية الجديدة التى ابتكروها فى (microsoft) و هى تقنية الـ(LINQ) التى يستهدف أن تستخدم للتعامل مع كل أنواع مصادر البيانات و ليس مجرد قواعد البيانات فقط، أى أنه لم يتم استخدام لغات البرمجة العام العادية مثل الـ(java) و الـ(C#) على الرغم من أنه يمكننا صنع مكتبات لتلك اللغات تقوم بعمل الصياغات المختلفة للغات الاستعلام و إن كان ذلك صعباً بعض الشئ، لكن الأمر ليس فى إمكانية فعل ذلك من عدمه إنما يكمن سر الموضوع فى طبيعة التعامل مع قواعد البيانات عام. و لذلك نجد أنهم لم يقوموا بدمج إمكانيات تلك اللغات فى اللغات البرمجية العام مباشرة بل قاموا بإعطائها القدرة على استخدام أوامر لغات الاستعلام الصريحة و إن كان هناك بعض التغليف اللازم لقبول تلك العبارات فى بيئة لغة البرمجة العادية، و المثال التالى بلغة الـ(C#) يرينا مثل ذلك التغليف عملياً:

    على الرغم من أنه كان من الممكن الاستغناء عن كل ذلك بصنع إجراء تأخذ كمعاملات لها اسماء الحقول التى سيتم اختيارها للتعامل معها و اسم الجدول الذى يحويها و الشرط الذى يجب أن ينطبق على القيم المختارة، و هذا كما قلنا صعب للغاية و لكن الأمر ليس فى الصعوبة فقط إنما فى الاختلاف الشديد عن البرمجة العادية و هو الأمر الذى تعزى إليه هذه الصعوبة نفسها و تعد جانباً من جوانب تجلياته.
  1. تطبيقات الواجهات المرئية التى هى من أسهل ما يمكن عند التعامل معها باستخدام لغات البرمجة الكائنية و ألعن ما يمكن لو تم التعامل معها بلغات البرمجة الوظائفية، حيث فى اللغات الكائنية يمكننى ببساطة أن أقول (بمفردات اللغة البرمجية طبعاً) أننى أريد كائناً من نوع النافذة، و هذا الكائن يحوى زر له القيم الفلانية و صندوق نص له القيم العلانية و...و... إلى آخره، أى أن الأمر يسير جداً و منطق للغاية، فماذا عن اللغات الوظائفية أو الإجرائية و تعاملها (بطريقة وظائفية أو إجرائية صرفة) مع هذا الأمر؟، أنا شخصياً قد تعاملت مع مكتبة الـ(openCV) من خلال عملى فى مجال معالجة الصور أى الـ(image processing) و بالطبع كنت أتعامل معها باستخدام لغة الـ(C++) للحصول على أفضل أداء ممكن (و لأسباب أخرى ليس هذا محلها) و يسعدنى أن أقول أن الأمر كان مسخرة بالنسبة لى أنا المبرمج المغلوب على أمره، حيث كان على أن أستدعى إجراء (cvNamedWindow) لها الشكل التالى:

    لكى تقوم بإنشاء نافذة مرئية ثم كان على أن أستدعى إجراء أخرى لكى أقوم مثلاً بضم عمود تعقب (track bar) إلى تلك النافذة التى صنعتها تواً و هى إجراء (cvCreateTrackbar) التى لها الشكل التالى:

    و لكى أقوم بتكرار الأمر أى إنشاء أكثر من نافذة و ضم عمود تعقب لكل نافذة يكون على أن أقوم بتكرار الأوامر ذاتها مراراً، لأن خاصية كتابة صنف يفعل ذلك ثم الاشتقاق منه فى كل مرة غير موجودة بالطبع فى البرمجة الوظائفية بل هى (و ياللعجب) الفكرة الرئيسة فى البرمجة الكائنية.
  1. بناء أنظمة البنية التحتية البرمجية للحاسوب مثل أنظمة التشغيل و أدوات البرمجة المختلفة من مترجمات و مفسرات و مجمعات و غيرها، ففى هذا المجال نجد أن لغة الـ(C) هى اللغة الأشهر و الأكثر تغلغلاً و لا ينافسها إلا نسختها الكائنية الـ(C++) بسبب أنها حينما صنعت منذ البداية على يد دينس ريتشي و بريان كيرنيجان كانت قد صممت لتكون لغة بناء بنى تحتية فى الأصل، وبذلك وضعوا فيها كل المواصفات اللازمة لذلك فأصبحت انعكاساً قوياً للغاية للفكر البرمجى فى الناحية البنيوية التحتية (و الانعكاس هنا كان بالطبع حسب طريقة تفكير مصممى اللغة و ليس هو بالانعكاس الوحيد الممكن).
    و قد استسلم كل المبرمجين لتلك الحقيقة و لم يحاول أحد منهم بحال من الأحوال تغييرها بالاستغناء عن لغة الـ(C) التى كرهها الكثيرون، و بالتالى كان من الطبعى أن اللغات الجديدة التى يتم تصميمها سوف يتم إهمال تحقيق المواصفات اللازمة للتعامل مع البنى التحتية للحاسب فيها، لأنه لا حاجة لهذا مع الرضا باحتلال الـ(C) لعرش ذلك المجال و الأكثر طبعية هو الاهتمام بإعطاء اللغة الجديدة الميزات التى تؤهلها للتخصص فى مجال آخر يمكنها أن تنافس فيه بقوة.
الأمثلة السابقة كلها كانت لتوضيح أن هناك بالفعل مجالات برمجية تختلف عن المجالات الأخرى بصورة تجعل اللغة البرمجية التى تناسب التعامل معها بقوة لا تناسب العمل فى المجالات الأخرى إلا بتعسف لا يؤدى إلا إلى بطء العمل و عدم كفاءته هذا إن نجح من الأصل.
لكن هناك مجالات أخرى ظن أنها تختلف عن المجالات الأخرى فى طريقة التعامل معها برمجياً و بالتالى صارت لها لغاتها البرمجية الخاصة، بل صار للغاتها نفسها سمتاً خاصاً لا تخرج عنه، و هذا هو مجال برمجة مواقع الشبكة الذى يكاد يكون من المعلوم من العقل بالضرورة عند كل المبرمجين أنه مجال له صفته الخاصة التى لا تشبه بحال من الأحوال صفات المجالات الأخرى، و مع الزمن و توطن هذه الفكرة فى عقول المبرمجين منذ تعلمهم البرمجة أصبح الأمر تابوه من التابوهات المحرمة فى المجتمع البرمجى و لم يتعرض له أحد بالتغيير الجرئ إلا مؤخراً.
و أنا أريد فى هذه النقطة أن أؤكد أن التفرقة بين برمجة البرامج العادية و برمجة مواقع الشبكة و القول بأن للغات التى تؤدى كل عمل من الأعمال أشكال تصميم مختلفة أمر خاطئة و التفرقة هنا هى تفرقة زور لا تجوز فى شرع العقل، فالاختلاف الوحيد فى برمجة البرامج العادية و لنسمها (برامج سطح المكتب) و برمجة مواقع الشبكة يقع فى الصيغة النهائية التى سيخرج بها البرنامج من حيث:
  1. كونها صيغة تستهدف المعالج مباشرة أم تستهدف مفسراً:
    فمواقع الشبكة بالطبع تعتمد على برامج متصفحات الشبكة فى عملها مثل (Firefox)
    و (internet explorer) و غيرها من المتصفحات دائماً، و لا تعمل بأى حال من الأحوال بصورة منفردة مستقلة، فى حين أن برامج سطح المكتب لها الخيار فى أن تكون معتمدة على مفسر معين مثل برمجيات الجافا التى تعمل على منصة الـ(JVM) و برامج الـ(C#) و الـ(visual basic.NET) التى تعمل على منصة الـ(.NET)، و لها كذلك الخيار فى أن تكون مستقلة تعمل مباشرة على المعالج و تتحاور مع نظام التشغيل لتطلب منه ما تريد من مهام بنفسها لا من خلال وسيط.
  1. شكل الصيغة التى تعتمد على المفسر لبرامج سطح المكتب و شكل صيغة برمجيات مواقع النت:
    حيث أنه مادامت طبيعة البرامج الخاصة بسطح المكتب لها عالمها المنفصل عن عالم متصفحات الشبكة بالكلية فربما يكون هذا الأمر قد أثر على الصيغ النهائية التى تخزن بها التعليمات العليا التى كتبها المبرمج (
    و أنا عن نفسى لا أعلم جيداً لأنى لم أدرس هذا الأمر قبلاً لذا أقول ربما).
أما عن تصميم لغات البرمجة فكما قلت من قبل فإنى لا أجد أى فارق حقيقى من وجهة نظر المبرمج عالى المستوى، و دليل على ذلك لغات كالـ(java script) التى لا تشبه لغة الـ(HTML) من قريب أو بعيد. و تستخدم فى برمجة مواقع النت ضمن أكواد الـ(HTML). بل و لماذا أضرب المثال بالـ(java script) فى حين أن الحبيبة الغالية الـ(java) موجودة فى مجال تصميم مواقع النت بكل عنفوانها و هى اللغة التى تستخدم فى الأصل لبرمجة برامج سطح المكتب، و أنا هنا آخذ الجافا كدليل أقوى و حاسم فى هذه النقطة لأنها تقول كلامى عن الافتعال فى التفرقة بين نوعى لغات البرمجة (لسطح المكتب و للشبكة) بصورة عملية لا جدال فيها.
هذا عن السبب الأول، أما عن السبب الثانى و هو (أن أن كل مجال من المجالات كان له أهله ممن قام على أكتافهم معظم بنائه و كانوا قدراً يستخدمون لغة موحدة أو لغات قليلة العدد فى ذلك البناء و بالتالى كانت تلك اللغة أو تلك اللغات هى الوحيدة أو الأكثر ظهوراً عند أى حديث برمجى عن ذلك الجانب و رويداً رويداً أصبحت كأنها اللغة أو اللغات الممثلة له فعلياً) فهو بدوره له من الحقيقة نصيبه و الواقع يدل على ذلك.
حيث لو أخذنا على سبيل المثال بناء بيئات سطح المكتب فى أنظمة التشغيل المختلفة مثل (KDE) و (GNOME) و (LXDE) فى الأنظمة شبيهة اليونيكس و غيرها من البيئات المشهورة الأخرى لوجدنا أنها قد بنيت باستخدام لغة الـ(C++) التى يتحقق فيها شرط اللغات التى تصلح لهذا المجال، و لكن على الرغم من ذلك فقد كان من الممكن أن يتم بناؤها بلغات أخرى غير الـ(C++) مثل الـ(java) مثلاُ التى تم باستخدامها فعلاً بناء سطح مكتب الـ(java) أو الـ(java descktop) لنظام التشغيل الجميل (open solaris)، إلا أن ذلك لم يتم لأن المبرمجين الذين قاموا بذلك العمل كانوا ممن يستخدمون لغة الـ(C++) بحكم كونهم من المهتمين بتطوير و بناء النظم الأساسية أو البنية التحتية فى عالم الحاسوب، و بالتالى أصبح استخدام الـ(C++) فى هذا المجال أمراً طبعياً بل و أصبح مع الزمن من التابوهات المحرمة فى عالم البرمجة، مثله كمثل عدم صنع لغة أخرى تحل محل لغة الـ(C) فى بناء البنى التحتية بدون تعقيد تلك الأخيرة الذى يعرفه الكل.
و على الرغم من كون استخدام لغات أخرى فى هذه المجالات قد يكون أكثر نفعاً من حيث السهولة فى البناء و الكبر فى الإنتاجية و البساطة فى المتابعة و التطوير (و هى الأمور التى تسعى خلفها كل دراسات هندسة البرمجيات) إلا أن الأمر قد صار تابو بالفعل عند المبرمجين القدامى و المحدثين و صار المساس به و لو من بعيد مثيراً لعواصف من النقد الهدام لصاحب التعليق و لأفكاره، و لو كان مجتمع المبرمجين النظاميين وثنياً لعبدوا إلهاً تخصصونه للـ(C) و لقدموا له قرابين بشرية ممن يكفرون بها.
و هذه هى خطورة كون المهتمين بمجال معين من المجالات الحاسوبية من مستخدمى لغة برمجة مفردة، فرويداً رويداً سوف تسيطر تلك اللغة على ذلك المجال حتى و إن لم تكن خصائصها الذاتية مناسبة له تماماً، و سيكون أمراً منطقياً أن تصير تلك اللغة البرمجية هى الممثل الرسمى الوحيد لذلك المجال و أن تصير باقى اللغات كالأيتام على موائد اللئام عند ولوج مطوريها إلى عالمه، فلا كرامة لها على الرغم من كون بعضها أنسب للمجال من تلك اللغة التى تقرن به.
و السبب الأخير و هو أن (كل لغة كان لها مجتمعها التقنى الذى ركز على جانب من الجوانب البرمجية و تراخى عن تغطية المناطق الأخرى فلم يغطها بذات القوة، و من ثم اشتهرت اللغة بمجال التركيز الأكبر و أهملت فى الجوانب الأخرى) هو بدوره له نصيبه من الصحة.
و على سبيل المثال لا الحصر يمكننا أن نرى أن حال لغة الـ(visual basic) فى مجال التكامل مع نظام الويندوز (windows) و حزمة برامج مكتب (microsoft) (Microsoft office) جعلها هى اللغة الأشهر فى هذا على الرغم من ضعف اللغة النحوى و عدم تعاملها مع المشاريع الكبيرة بكفاءة مناسبة، و لكن لأن (microsoft) ركزت على هذا الموضوع بقوة فقد كان من المعتاد أن نسمع فى فترة عنفوان الـ(visual basic) عبارات على شاكلة (الإنتاجية العالية = visual basic) و (تطبيق به نوافذ مرئية = تطبيق مكتوب بـ visual basic) على الرغم من أن هناك مجالات أخرى تصلح لها الـ(visual basic) برمجياً مثل كل اللغات عالية المستوى العام الاستخدام إلا أنها اشتهرت بهذا و اشتهرت أكثر بأنها خلاف سهولتها فى ذلك المجال فأنها متعبة جداً فى باقى المجالات.
و لعل هناك سبب آخر يندرج تحت القول بالتركيز على مجال معين هو الإهمال المتعمد، ففى بعض الأحيان يكون هناك إهمال متعمد من منتج اللغة البرمجية لمجال من المجالات لغرض ما هو فى الغالب تجارى أو يصب فى خانة هدف تجارى، و لغة الـ(visual basic) و لغات الـ(.NET) عموماً دليل على ذلك كل الدلالة، فالمبرمج الذى يستخدم اللغات السابقة حكم على نفسه بالبقاء تحت مظلة أنظمة تشغيل (microsoft) للأبد، لأن المحمولية لم تكن أبداً فى أى يوم من الأيام هدف من أهدافها و هو الأمر الذى يعيه الجميع من المبرمجين.
و لعل الشئ الذى يخفف ذلك على مبرمجى الـ(.NET) هو وجود المشاريع مفتوحة المصدر التى تغنى عن بديلها المنتج من قبل (microsoft) و هو مشروع الـ(mono) من شركة (novell) الذى يتكون من بيئة برمجية متكاملة للغة الـ(C#) و بيئة عمل تحل محل بيئة الـ(.NET) الخاصة بزمن التشغيل على نظام الويندوز و تعمل على باقة أنظمى التشغيل المشهورة مثل اللينوكس و السولاريز و ماك و التى تم إهمالها بالطبع فى بيئة الـ(.NET) الخاصة بـ(microsoft).
و لكن حتى فى هذه الحالة فإن هناك عوائق ستظهر فى طريق من يرغب فى الاستفادة القصوى من اللغة نظراً لأنه سيضطر إلى الحصول على التطويرات الجديدة فى بيئة العمل و اللغة متأخراً عن المبرمجين الذين يتعاملون مع (microsoft) نفسها، لأن اعتماد التغييرات الجديدة فى (mono) لن يحدث بين يوم و ليلة بل سيأخذ وقتاً بعد التصريح عن تلك التغييرات رسمياً (و بالطبع سيكون قد تم اعتمادها فى برمجيات microsoft لتحصل على السبق فى التسويق كما هى العادة).
و قد أدى مثل هذا الأمر (و أمور أخرى ليس هذا محلها) إلى تحذير السيد ريتشارد ماثيو ستولمان من استخدام بيئة الـ(mono) فى عمل البرمجيات مقتوحة المصدر، و أنا عن نفسى أقبل اعتراضه هذا تماماً رغم أننى من محترفى البرمجة بالـ(C#) إلا أن الحق أحق أن يتبع، و إسناد الظهر إلى (microsoft) سيكون أكثر قرارات عمرى حماقة إن اتخذته، لذا فأنا أسأل الله تعالى ألا أضطر إليه فى يوم من الأيام.
كل ما فات كان توضيحاً لأسباب عدم شمولية لغات البرمجة و تخصصها فى مناطق معينة من مجالات الإبداع البرمجى و ضعف أو غياب وجودها فى باقى المجالات، إلا أننى لم أوضح حتى الآن موقفى من كل ذلك الذى ذكرناه، و موقفى واضح و بسيط للغاية و يمكن تلخيصه بدون أى إخلال فى جملة واحدة هى (لغة البرمجة أداة المبرمج، و الأداة لا تكون أداة جيدة إلا إذا أغنت عن مثيلاتها فى معظم العمل إن لم يكن كله، فإن لم تكن كذلك فإنها لا تستحق الاستعمال و ينبغى طرحها جانباً).
أى أن اللغات التى تشترط على المبرمج التضحية بكثير من المجالات ليمكنه التركيز على مجال معين هى أداة سيئة يجب على المبرمج نبذها حتى لا تكبله و تحدد من قدراته و أنشطته، أما لغة البرمجة الحقيقية التى تستحق الإهتمام فهى التى تعطى المبرمج القدرة على الإبحار باستخدامها فى أى مجال برمجى يعن له أن يضع قدمه فيه أو على الأقل معظم المجالات البرمجية.
و بالتطبيق على اللغات البرمجية الحالية فسنرى أن اللغات التى تحقق هذا الشرط قليلة للغاية مقارنة بما هو مستخدم منها بالفعل، و أشهر الأمثلة التى ستضرب لهذا النوع من اللغات هى لغات الـ(java, C++, visual basic .NET, C#) لذا ففى قابل كلماتى سوف أناقش موقفى من كل لغة موضحاً حقيقة هذا الزعم من كذبه.
و أول تلك اللغات هى الـjava و هى أحب اللغات البرمجية الحالية إلى قلبى لكونها يتحقق فيها من ميزات لغات البرمجة الجيدة عندى ما هو أكثر من غيرها، و على الرغم من هذا فإن عندى انتقادات حادة للـjava فى بعض المسائل التصميمية ربما أصرح بها فى أماكن أخرى من هذه المناقشة، لكن الأكثر أهمية من هذا هو كون الـjava قد حققت ميزة الشمولية هذه إلى حدود كبيرة للغاية بما يجعلها بحق أشمل اللغات البرمجية التى أعرفها فى حياتى كلها.
فالـjava تعطى المبرمج بها القدرة على البرمجة لمجالات واسعة المدى مثل:
  1. برامج سطح المكتب ذات الواجهات المرئية.
  2. برامج سطح المكتب النصية.
  3. برامج العملاء على الشبكة.
  4. برامج الخادمات.
  5. مواقع الشبكة.
  6. برمجة الأجهزة الذكية مثل الهواتف المحمولة و الثلاجات المعدلة و غيرها من تلك النوعية من الأجهزة.
  7. برمجة الألعاب.
  8. التعامل مع قواعد البيانات.
و بالتالى فليس هناك مجال يمكن أن يفكر فيه المبرمج إلا و وجد الـjava واقفة فى انتظاره مادة إليه يد المساعدة، و أهم من ذلك كون الـjava تعمل على أنظمة التشغيل المختلفة بمنتهى المساواة و بنفس الكود البرمجى، و كما يعبر صناع الـjava عن هذا المبدأ بقولهم (أكتب مرة واحدة و شغل فى أى مكان) و يستحق هذا المبدأ بحق كل ما بذل من جهد للوصول إلى تحقيقه بالصورة الرائعة التى نراها و التى أعطت الـjava لقب ملكة المحمولية بلا جدال.
أما الـ(C#) فهى لغة قوية بالفعل، و دليل اقتناعى بذلك أنها أكثر اللغات التى أنا ملم بها (أكثر حتى من الـjava) على الرغم من أننى أعز الـjava أكثر منها بكثير، و لكن و رغم كل هذا فإن الـ(C#) لا تصمد أمام الـjava إذا ما قارناهما من منطلق الشمولية، و ذلك على الرغم من أنها تصلح لنفس المجالات التى ذكرناها للـjava و هى:
  1. برامج سطح المكتب ذات الواجهات المرئية.
  2. برامج سطح المكتب النصية.
  3. برامج العملاء على الشبكة.
  4. برامج الخادمات.
  5. مواقع الشبكة.
  6. برمجة الأجهزة الذكية مثل الهواتف المحمولة و الثلاجات المعدلة و غيرها من تلك النوعية من الأجهزة.
  7. برمجة الألعاب.
  8. التعامل مع قواعد البيانات.
و لكن بالطبع مع وضع جملة (مع أنظمة تشغيل microsoft فقط) أمام اسم كل مجال مما ذكر بالقائمة فى الأعلى، و هذا الأمر ليس بالهين أبداً إذا ما علمنا أن نسبة الخوادم التى تستخدم نظام تشغيل اللينوكس تبلغ ما يزيد على السبعين فى المائة من مجموع الخوادم العاملة فعلاً و أن أشهر المواقع العالمية تستخدمه بدلاً من الـwindows الذى أذاقهم الأمرين بضعفه الشديد و تكلفته الأشد.
و كذا حينما نعلم أن هناك الكثيرين و الكثيرين ممن يتحولون سنوياً إلى أنظمة التشغيل الأخرى (و على الأخص اللينوكس) بسبب ضعف الـwindows الأمنى الشديد و تكلفته و تكلفة برامجه المبالغ فيها، بالتالى فإن القول بأن كل البرامج التى سيكتبها المبرمج لن تعمل إلا على أنظمة microsoft فقط هو ضربة فى الصميم لكل ما حازته الـ(C#) من شمولية بل و ضربة قاضية تماماً لأن المحمولية هى واحدة من أهم أركان الشمولية إن لم تكن بالفعل هى الركن الأهم و الأشد خطراً.
فشمولية محصورة فى ركن معين من عالم الحوسبة مقارنة بالشمولية المنفتحة على العالم الحوسبى كله تشبه بالضبط موقف الجارية من الزوجة رغم الغرابة فى التشبيه، فالزوجة و الجارية متساويتان فى الحق فى المعاملة الحسنة من الزوج أو المالك، و للزوج عليهما حقوق مشترك كثيرة، و لكن هل هناك أى مجال للمقارنة بين وضع الزوجة و وضع الجارية؟ أى صاحب عقل سيرفض المقارنة من الأصل، و بالمثل المقارنة بين شمولية الـjava و شمولية الـ(C#) فهما اسمياً تكادان تتساويان تماماً من ناحية أنواع التطبيقات و المجالات التى يمكن أن تستخدم فيها، و لكن ذلك لا يكفى أبداً للمساواة بين الزوجة (الـjava) و الجارية الـ(#C).
و ما قيل عن الـ(C#) يقال بالضبط عن الـ(visual basic .NET) نظراً للتوءمة التى صنعتها Microsoft بين اللغتين حينما ضمتهما إلى إطار عمل الـ(.NET)، و بالتالى هى تأخذ نفس حكم الـ(C#) بلا زيادة أو نقصان.
و نعود إلى اللغة الثالثة الشهيرة فى عالم الشمولية و هى الـ(C++)، و التى حازت على مكانتها فى عالم الشمولية بلى الذراع إن كان لى أن أستخدم هذا التعبير، فعلى الرغم من أن الـ(C++) بالفعل لغة تتميز بالشمولية و يمكن لمبرمجها الاعتماد عليها فى كل المجالات البرمجية التى تخطر على باله أو لا تخطر لأى نظام تشغيل حى، إلا أن تلك الشمولية فى رأيى شمولية خداعة لا يمكن الاطمئنان إليها بحال من الأحوال على الأقل بالنسبة لى، نظراً لتعقيد اللغة الذى يضيع أى ميزة أخرى تمتلكها و على الأخص فى المجالات التى تتعقد فيها الخوارزمات و الأفكار فلا ينقص الطين بلة تعقيد اللغة البرمجية نفسها. و لكن لأننا فى هذا المقام نناقش الشمولية فقط فيمكننى أن أقول أن الـ(C++) تتربع على عرش الشمولية بجانب الـjava تماماً (و شتان ما بينهما فى التعقيد).

هناك تعليقان (2):

  1. مقال مافي جدددددددددا..... انا ارجو ان تكون مدوننا في كل المدونات خاصتنا الينكسسية ان جازة التسمية عملاق ...بحق ششششششششكررررراااااا

    ردحذف