4 - متابعة للمشاركة #3

https://arabia.io/go/6418

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

وبالتالي لا شك أنه عندما نبرمج بلغة السي بلس بلس هو أفضل بكثير من البرمجة بلغة البيزيك ولا شك أن السبب معروف وهو قوة المترجم Compiler الذي ينتج شيفرة مصدرية أي بلغة الآلة أصغر بكثير مما تنتجه مترجمات أو مفسرات اللغات الأخرى

وأقوى التطبيقات على الإطلاق هي تلك التي يتم برمجتها بلغة الأسمبلي المتوافق مع المعالج للحاسب الذي سيعمل عليه التطبيق على الإطلاق

ولكن أنى لمبرمج أن يبني تطبيقات كبيرة ومعقدة وذات واجهات بلغة الآلة

لحسن الحظ أن بعض اللغات مثل السي بلس بلس تسمح بكتابة أجزاء من الكود بلغة الأسمبلي مباشرة وهذا جيد جدا في كثير من الحالات

ويأتي السؤال هنا هل كل ما فكر مطور ما بكتابة برنامج يتطلب سرعة عالية في التنفيذ أن يضطر التخلي عن لغته لتعلم لغة قوية

هو أكيد أن الجواب نعم ولكن في الغالب صعب ، ولهذا فلا مانع من أن ينتهج المبرمج نهج وسطي يعني على مبدأ لا يموت الذئب ولا يفنى الغنم

البشرى الجميلة هي أنه أصبحت الكثير من اللغات توفر هذا النهج ، كيف ؟

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

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

إذا طالما أن التطبيقات ستكون موجهة لنظام ويندوز فلما لا تكون اللغات المستخدمة هي من نفس العائلة

طبعا لو كانت التطبيقات لغير الويندوز فالكلام السابق سيتغير

من هنا نجد أن مايكروسوفت أتاحت لكل لغاتها أن تستخدم الوظائف المضمنة في مكتباتها ذات المستوى الأقرب للعتاد والهارد وير

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

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

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

ولكن اصطدمت بزمن ضائع من هنا بدأت رحلة البحث عن الطرق البديلة التي تؤدي نفس الغرض ولكن بزمن أقل بكثير

حتى توصلت إلى تعليمة CopyMemory التابعة للمكتبة Kernal.dll فكانت سريعة للغاية وبعد المزيد من البحث توصلت لتعليمة أسرع منها وهي تعليمة memcpy التابعة للمكتبة msvcrt.dll وكانت النتيجة أن السرعة كانت بعشرة أضعاف وأكثر من الخيار الأول

أي أنه لو كانت عمليات نقل البيانات تستغرق 10 ملي ثانية أصحبت الآن تستغرق 1 ملي ثانية أي أنه أصبح لديك مجال لتضع عمليات مشابهة ولو كنت لست بحاجة إليها فلاشك أنها ستلزمك في باقي العمليات.

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

يتبع .. 5