السلام عليكــم ورحمـة الله وبركاتــه
في هذا المقال حاولت الحديث عن بعض النقاط الهامة في البرمجة و التي تزيد من براعة المطور في كتابة البرمجيات.
في إنتظار أي تعليق أو تصويب
السلام عليكــم ورحمـة الله وبركاتــه
في هذا المقال حاولت الحديث عن بعض النقاط الهامة في البرمجة و التي تزيد من براعة المطور في كتابة البرمجيات.
في إنتظار أي تعليق أو تصويب
السلام عليكم أخي بن العيد :)
الحقيقة رائع و 10/10 :wink:
أجدك من القلائل الذين يثرون المكتبة الحاسوبية العربية بمقالات رائعة كهذا,
في الفقرة الثالثة من المقال "اجعل البرنامج يعمل بسرعة" :
اقتباسهذا العامل يبرز و بشكل جلي في البرامج الضخمة و المتعلقة بمعالجة الصور و الشبكات. حل هذا الإشكال يسير إلى حد ما و يتمثل في تقليص المساحات المحجوزة من الذاكرة إلى اقصى حد ممكن و التي لم يتم إفراغها ما إن يتم الفراغ منها. هذا الإشكال تم حله في بيئة الـ DotNet عبر توفير ململم النفايات و لكن معالجة هذه المسألة عند البرمجة بالـ C أو ++C يصعب, حيث يجبر المطور على تتبع مساحات الذاكرة المحجوزة حتى نهاية وظيفة البرنامج و التي يمكن أن تتراكم حتى تشل عمله.
حسب معلوماتي فإن ململم النفايات يتصرف بطريقة غير معرفة للمبرمج indeterminant behavior, و بالتالي فإن التخلص من المساحات المحجوزة من الذاكرة و التي أصبحت "نفايات" يمكن أن يتم على الفور و يمكن أن يؤجل و لا يمكن للمبرمج التدخل في ذلك. بينما في ++C يمكنني كتابة شي مثل التالي للتحكم في الذاكرة المحجوزة و التخلص منها وقت انتهاء الحاجة :
std::vector<int> *numList = new std::vector<int>; numList->resize( 99999 ); . . . delete numList;
عند استدعاء هادم numList فإن المساحة المحجوزة يتم تحريرها, و ذلك يحصل بالضبط عند السطر التالي :
delete numList;
لعلك تعلق على الموضوع بإسهاب, لأنك تعرف كلا الطريقتين بتفصيل أفضل مني.
تحياتي ,,
تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 19 يناير 2009 في 20:26
السلام عليكم
جزاك الله خيراً أستاذنا على هذا المقال الجميل، وفعلاً بعض النقاط، مثل الشرح، ووصف البرنامج وغير ذلك ، أعاني منها حين أحاول دراسة طريقة عمل برنامج معين.
وقد لاحظت هذا بفرق شديد بين برنامجين، أولهما فقط كود، لا شرح ولا تعليق، وإلى الآن لم أفهم طريقة عمل البرنامج، بينما الآخر، يعطيك Header لكل دالة وما وظيفتها بتنسيق وترتيب ، وهو أيضاً أكثر من رائع.
وأرجو أن تسمح لي بمداخلة صغيرة بالنسبة لسرعة البرنامج كمبرمج Visual Basic :
فمن المعلوم الفرق الهائل في السرعة بين الـVisual Basic و الـC ، ولهذا يكون من الضروري في بعض الأحيان، استعمال دوال API المكتوبة باستخدام C ، وخصوصاً كما ذكرت في معالجة الصور.
فلنأخذ مثالاً عن كودين يقومان بتحويل صورة ملونة إلى صورة بالأبيض والأسود، الأول يستعمل دالتي Point وPSet الموجودتين في Visual Basic ، والثاني يستعمل دوال API والتي هي GetPixel و SetPixel ، يمكنك تجريب الكود لتلاحظ فرقاً هائلاً بالسرعة بينهما:
أما الثاني فهو:
يمكنك ملاحظة فرق هائل في السرعة بين الكودين إذا جربت على صورة ما، والكثير يهملون هذه الناحية للأسف.
جزاك الله خيراً أستاذنا على هذا المقال، واعذرني على مداخلتي
هذه الجملة خاطئة :wacko:
الا تعتقد أنه من غير المنصف مقارنة سرعة لغة عامة المهام مثل ++C مع لغة محددة المهمة مثل فيجوال بيسك و من خلال اختبار واحد فقط؟
نعم ستكون بطيئة جداً في معالجة الصور لأنها لم تصمم أصلاً لهذه المهمة. لكن لو قمت بإنتاج تطبيق أعمال (و هو الهدف الرئيسي من فيجوال بيسك) فستجد أن السرعة متقاربة جداً و تتفوق الفيجوال بيسك في قصر فترة التطوير.
المهارة تكمن أيضاً في استخدام الأداة المناسبة في المكان المناسب.
اقتباسالا تعتقد أنه من غير المنصف مقارنة سرعة لغة عامة المهام مثل ++C مع لغة محددة المهمة مثل فيجوال بيسك و من خلال اختبار واحد فقط؟نعم ستكون بطيئة جداً في معالجة الصور لأنها لم تصمم أصلاً لهذه المهمة. لكن لو قمت بإنتاج تطبيق أعمال (و هو الهدف الرئيسي من فيجوال بيسك) فستجد أن السرعة متقاربة جداً و تتفوق الفيجوال بيسك في قصر فترة التطوير.
المهارة تكمن أيضاً في استخدام الأداة المناسبة في المكان المناسب.
ربما، لكنه ليس اختباراً واحداً، وإنما العديد من الاختبارات، لكن هذا كان أوضحها.
بالنسبة لمعالجة الصور، فلعل الهدف الأساسي في فيجوال بيسك ليس معالجة الصور، ولكن هذا لا يعني أنها لا تستطيع القيام بذلك، بالنسبة لإدارة الأعمال، فعلاً تتفوق فيجوال بيسك على c++ ، من حيث السهولة والمرونة، وفعلاً هذا يستدعي اختيار الأداة المناسبة لكل عمل تريد القيام به، فأنا لا أتخيل نفسي أصنع برنامجاً لإدارة مكتب هندسي مثلاً بالـC++ .
لكن بشكل عام، لو قمت بالوظيفة ذاتها في كلتا اللغتين، ستجد أن c++ ستقوم به بسرعة أكبر من Visual Basic (وقد يكون الفرق جزءاً من الثانية)، لكنه موجود.
ففيجوال بيسك ثقيلة نوعاً ما في الحركة.
على كل حال، لا نريد تحويل هذا الموضوع إلى نقاش حول لغات البرمجة.
جزاك الله خيراً أخي :)
هذه الجملة خاطئة :wacko:
السلام عليكــم ورحمـة الله وبركاتــه
يسرني كثيرا رؤية هذا التجاوب الإيجابي مع المقال و هو أمر مشجع للمزيد ...
اقتباسحسب معلوماتي فإن ململم النفايات يتصرف بطريقة غير معرفة للمبرمج indeterminant behavior, و بالتالي فإن التخلص من المساحات المحجوزة من الذاكرة و التي أصبحت "نفايات" يمكن أن يتم على الفور و يمكن أن يؤجل و لا يمكن للمبرمج التدخل في ذلك. بينما في ++C يمكنني كتابة شي مثل التالي للتحكم في الذاكرة المحجوزة و التخلص منها وقت انتهاء الحاجة :
ما أعنيه هو عملية الإفراغ أثناء عمل البرنامج و ليس بعد الإنتهاء.
وقد ذكرت حالتين:
الأولى تتعلق بحسن إختيار مكان تعليمات الإفراغ كي لا يحدث ذلك مشاكل مثل إستخدام قيمة مؤشر و قد تم إفراغه مسبقا, أو محاولة إفراغ مؤشر فارغ.
واجهت مثل هذه المشاكل عندما كنت أبرمج في نظام التشغيل اليونيكس Fedora
و ربما الإختلاف بين المترجمات قد يتجاوز عن بعض الحالات كإفراغ مؤشر سبق إفراغه.
الثانية تتمثل في صحة عملية الإفراغ كما ذكرة في مثالstruct و char*
من الأفضل إفراغ المؤشرات حال الفروغ منها و عدم تركها لنهاية البرنامج.
ماذا لو أن البرنامج لا يتوقف !!!
كبرنامج يعمل في حلقة غير متناهية و يستقبل بإستمرار بيانات, يعالجها ثم يرجها للمستخدم !!! ستتراكم المساحات المحجوزة و قد تؤثر القيمة المحجوزة مسبقا في الحلقة التي تليها.
يمكن مراجعة هذا المقال للإطلاع على حالات مماثلة ذكرها هيثم HGBفي مقاله المؤشرات مالها وماعليها, نظرة تحليلية مفصلة...
اقتباسفمن المعلوم الفرق الهائل في السرعة بين الـVisual Basic و الـC ، ولهذا يكون من الضروري في بعض الأحيان، استعمال دوال API المكتوبة باستخدام C ، وخصوصاً كما ذكرت في معالجة الصور.
طريقة جيدة و لكن لن تكون الفائدة 100% إنما قرابة 90% حسب عدد المكتبات التي ستخدمها, لأن إستخدام مكتبات الربط الديناميكي مكلف من ناحية إستهلاك موارد الحاسوب (الذاكرة) و سرعة التنفيذ. ففي كل مرة ينبغي تحميل المكتبة البحث عن الدالة المطلوبة و تنفيذ تعليماتها. هذا بالإضافة إلى أن عدم تواجد المكتبة لسسب من الأسباب يشل كليا عمل البرنامج.
اقتباسواعذرني على مداخلتي
المقال للنقاش و محتواه قابل للتعديل, فربما نسيت شيئا أو ورد خطأ...
اقتباسالمهارة تكمن أيضاً في استخدام الأداة المناسبة في المكان المناسب.
:S لقد نسيت ذكر حسن إختيار لغة البرمجة المناسبة للتطبيق. شكرا للتذكير
مقال رائع ....
الملاحظات و التعليقات في الكود المصدري بمثابة اشارات المرور في شوراع الكود .
شكراً لك.
توجد جوانب أخرى للاتقان لم يذكرها المقال مثل سهولة الاستخدام من قبل المستخدم النهائي (End User) والذي أعتبره من أهم العوامل لنجاح البرنامج.
محمد حمود
ماجستير تقنية المعلومات
بكالوريوس هندسة مدنية
محترف إدارة مشاريع (PMP)
مهندس جودة البرمجيات (CSQE)
مبرمج معتمد من مايكروسوفت (MCP)
متخصص في نظم المعلومات الجغرافية GIS
mohamed.hammod(at)gmail.com
أحب أن أقول أن المقال جيد بشكل عام
لكن يعيبه تخصيص بعض الأدوات والشيفرات مما يجعل بعض أجزاء المقال مستعصية على من لا يعرف هذه الأدوات
مع أنه يفترض به أن يستوعب الجميع
على العموم أنا أعجبت به أتمننى لك التوفيق
تحياتي
انني سأنتقل الي البرمجة باللغات القديمة مثل لغة السي لكي احترف البرمجة فقد عملت علي بيئه الدوت نت واتقنتها فعلا الاتقان في البرمجة لابد ان نبدأ من الاول .........
رب اتني من الملك والحكمة والعلم فاطر السماوات والارض انت وليي في الدنيا والاخرة توفني مسلما والحقني بالصالحين
عندي نفس تعليق "خالد" تقريبا....
بشكل عام... مقال جيد :D
السلام عليكم ورحمة الله وبركاته
في الحقيقة نقاط مهمة جدا
وملاحظات دقيقة وقيمة يجب مراعتها في تطوير البرمجيات
بارك الله فيك
وقل ربي زدني علماً