برمجة
المحتويات
بدايةً، البرمجة هي عملية كتابة تعليمات وتوجيه أوامر لجهاز الحاسوب أو أي جهاز آخر مثل قارئات أقراص الدي في دي أو أجهزة استقبال الصوت والصورة في نظم الاتصالات الحديثة، لتوجيه هذا الجهاز وإعلامه بكيفية التعامل مع البيانات أو كيفية تنفيذ سلسلة من الأعمال المطلوبة تسمى خوارزمية. ونتناول فيما يلي مزيدًا من التفاصيل.
كذلك، وتتبع عملية البرمجة قواعد خاصة باللغة التي اختارها المبرمج. وكل لغة برمجة لها خصائصها التي تميزها عن الأخرى وتجعلها مناسبة بدرجات متفاوتة لكل نوع من أنواع البرامج وحسب المهمة المطلوبة من هذا البرنامج. كما أن اللغات البرمجية كذلك لها خصائص مشتركة وحدود مشتركة بحكم أن كل هذه اللغات صممت للتعامل مع الحاسوب. وتتطور لغات البرمجة (السوفتوير Software) بتطور عتاد الحاسوب المرئي (الهاردوير Hardware). فعندما ابتكر الحاسوب في الأربعينيات والخمسينيات من القرن الماضي (بعد أجهزة الحساب الكهربائية في العشرينات) - وكان الكمبيوتر يعمل بأعداد كبيرة من الصمامات الإلكترونية - كانت لغة البرمجة معقدة هي الأخرى، حتى أنها كانت عبارة عن سلسلة من الأعداد لا يدخلها إلا الصفر (0) والواحد (1) وذلك لأن الحاسب يفهم حالتين فقط وجود التيار (1) أو عدم وجوده (0)، وكان ذلك صعبا على المبرمجين. ولكن بابتكار الترانزيستور صغر حجم الحاسوب كثيرا وزادت إمكانياته، واستطاع المختصون في نفس الوقت أن يبتكروا لغات أسهل للاستخدام، وأصبحت لغات البرمجة مفهومة إلى حد بعيد للمختصين. ولا يزال التطوير والتسهيل جاريا وتسمى هذه اللغات سهلة التعامل بالنسبة للمبرمجين باللغات عالية المستوى.
من جهة ثانية، برمجة الحاسوب: هي عملية كتابة، اختبار، تصحيح للأخطاء وتطوير للشيفرة المصدرية لبرنامج حاسوبي يقوم بها الإنسان، تهدف البرمجة إلى إنشاء برامج تقوم بتطبيق وتنفيذ خوارزميات لها سلوك معين بمعنى أن لها وظيفة محددة مسبقا ومتوقعة النتائج. تتم هذه العملية باستخدام إحدى لغات البرمجة. الهدف من البرمجة هو إنشاء برنامج حيث ينفذ عمليات محددة أو يظهر سلوك مطلوب محدد.
المنهجيات
علاوةً على ذلك، تتضمن تقنيات النمذجة الشائعة التحاليل والتصاميم الخاصة بالتحليل والتصميم الموجه للكائنات (OOAD) أو الهندسة القائمة على النماذج (MDA).
علاوةً على ذلك، لغة النمذجة الموحدة (UML) هي ترميز يستعمل لكل من OOAD و MDA.
ومن جهة أخرى، الخطوة الأولى في أغلب عمليات تطوير البرمجيات الرسمية هي تحليل المتطلبات، ويليها اختبار لتحديد نمذجة القيمة والتنفيذ وإزالة الأعطال (تصحيح الأخطاء (Debugging)). هناك الكثير من الأساليب المختلفة لكل مهمة من هذه المهام. أحد الأساليب الشائعة لتحليل المتطلبات هو استخدام تحليل الحالة. يستعمل الكثير من المبرمجين أشكالًا لتطوير برامج Agile حيث يتم دمج المراحل المختلفة لتطوير البرامج الرسمية معًا في دورات قصيرة تستغرق عدة أسابيع بدلاً من سنوات. هناك الكثير من الطرق لعملية تطوير البرمجيات.
التنقيح
في هذا الإطار، غالبًا ما يتم تصحيح الأخطاء باستخدام بيئة تطوير متكاملة مثل إكليبس وVisual Studio وإكس كود وKdevelop وNetBeans وCode :: Blocks. يتم استخدام مصححات الأخطاء المستقلة مثل GDB كذلك وغالبًا ما توفر هذه الأجهزة بيئة بصرية أقل وعادة ما تستعمل سطر أوامر. تسمح بعض برامج تحرير النصوص مثل Emacs باستدعاء GDB من خلالهم لتوفير بيئة بصرية.
قائمة ببعض لغات البرمجة
كذلك، تعد عملية تصحيح الأخطاء مهمة للغاية في عملية تطوير البرامج حيث أن وجود عيوب في أحد البرامج قد يكون له عواقب وخيمة على مستعمليه. تكون بعض اللغات أكثر عرضة لبعض أنواع الأخطاء لأن مواصفاتها لا تتطلب من المترجمين (compilers) أن يقوموا بالتحقق على قدر اللغات الأخرى. يمكن أن يساعد استخدام أداة تحليل الشفرة الثابتة في اكتشاف بعض المشكلات المحتملة. عادةً ما تكون الخطوة الأولى في تصحيح الأخطاء هي محاولة إعادة إنشاء المشكلة. قد تكون هذه مهمة غير تافهة مثلًا مع العمليات المتوازية أو بعض الأخطاء البرمجية غير المعتادة. كذلك يمكن أن تجعل بيئة المستعمل ومحفوظات الاستخدام من الصعب إعادة إنتاج المشكلة.
وفي هذا الصدد، بعد إعادة إنتاج الخلل قد يحتاج الأمر إلى تبسيط إدخال البرنامج لتسهيل تصحيحه. مثلًا يمكن أن يؤدي وجود خطأ في برنامج التحويل البرمجي إلى تعطله عند تحليل بعض ملفات المصدر الكبيرة. ومع ذلك بعد تبسيط حالة الاختبار يمكن أن تكون الأسطر القليلة فقط من الملف المصدر الأصلي كافية لإعادة إنتاج نفس التعطل. يمكن إجراء هذا التبسيط يدويًا باستخدام نهج الفجوة والقهر. سيحاول المبرمج إزالة بعض أجزاء حالة الاختبار الأصلية والتحقق من استمرار المشكلة. عند تصحيح المشكلة في واجهة المستعمل الرسومية يمكن للمبرمج محاولة تخطي بعض تفاعلات المستعمل من وصف المشكلة الأصلي ومعرفة ما إذا كانت الإجراءات المتبقية كافية لظهور الأخطاء.
قياس استخدام اللغة
من جانب آخر، تحظى بعض اللغات بشعبية كبيرة لأنواع معينة من التطبيقات بينما تستعمل بعض اللغات بانتظام لكتابة الكثير من أنواع التطبيقات المختلفة. مثلًا لا يزال COBOL قويًا في مراكز بيانات الشركات غالبًا على أجهزة الكمبيوتر الكبيرة وFortran في التطبيقات الهندسية ولغات البرمجة النصية في تطوير الويب وC في . تستعمل الكثير من التطبيقات مزيجًا من عدة لغات في بنائها واستخدامها. يتم تصميم اللغات الجديدة عمومًا حول لغة سابقة مع إضافة وظيفة جديدة (مثلًا يضيف C ++ اتجاه الكائناتي (OPP) إلى C ويضيف Java إدارة الذاكرة والرمز الثانوي إلى C ++ ونتيجة لذلك يفقد الكفاءة والقدرة على التلاعب بالبيانات على مستوى منخفض)
من جهة ثانية، من الصعب جدًا تحديد أكثر لغات البرمجة الحديثة شيوعًا. تتضمن طرق قياس شعبية لغة البرمجة ما يلي: حساب عدد إعلانات الوظائف التي تذكر اللغة Survey of Job advertisements mentioning a given language عدد الكتب المباعة والدورات التعليمية التي تدرس اللغة (هذا يبالغ في تقدير أهمية اللغات الأحدث) وتقديرات عدد الخطوط الحالية من الشفرة المكتوبة باللغة (هذا يقلل من عدد مستعملي لغات العمل مثل COBOL).
القدرة على قراءة الشيفرة المصدرية
- بعض هذه العوامل تشمل:
- من العوامل التي تؤثر على القدرة على القراءة:
- أسلوب المسافة بادئة
- كتابة التعليقات
- اتفاقيات التسمية
من جانب آخر، اتباع أسلوب برمجة ثابت يساعد غالبًا على القراءة. ومع ذلك فإن القراءة أكثر من مجرد أسلوب البرمجة. هناك الكثير من العوامل التي لها علاقة قليلة أو لا علاقة لها بقدرة الكمبيوتر على ترجمة التعليمات البرمجية وتنفيذها بكفاءة تساهم في سهولة القراءة.
في هذا الإطار، في علم الحاسوب، القدرة على القراءة تشير إلى مدى السهولة التي يحتاجها قارئ بشري لفهم هدف، التحكم في تدفق، وعملية الشيفرة المصدرية. تؤثر على جوانب الجودة المذكورة في الأعلى، بما في ذلك القابلية للنقل، الصلاحية، والأهم القابلية للصيانة.
إضافةً إلى ذلك، تعتبر سهولة القراءة مهمة لأن المبرمجين يقضون أغلب وقتهم في القراءة في محاولة لفهم وتعديل التعليمات البرمجية المصدر الموجودة بدلاً من كتابة شفرة مصدر جديدة. غالبًا ما تؤدي الشفرة غير القابلة للقراءة إلى الأخطاء وعدم الكفاءة والرموز المكررة. وجدت دراسة أن بعض التحولات البسيطة في قابلية القراءة جعلت الشفرة أقصر وقللت بدرجة كبيرة من الوقت لفهمها.
المبرمجون
- مبرمجو الحاسوب هم الذين يكتبون برامج الحاسوب. وظائفهم تشمل عمومًا:
- كتابة الشفرة
- التصريف
- التنقيح
- التوثيق
- الصيانة
- فحص البرمجيات
- هندسة البنى البرمجية الضخمة
التاريخ
من جهة ثانية، جعلت لغات البرمجة عاليات المستوى عملية تطوير البرنامج أكثر بساطة وقابلية للفهم. وتعتبر لغة فورتران للبرمجة أول لغة عالية المستوى تستعمل على نطاق واسع للتنفيذ العملي عام 1957. تم تطوير الكثير من اللغات بعدها - على وجه الخصوص لغة كوبول التي تهدف إلى معالجة البيانات التجارية ولغة ليسب لأبحاث الحاسوب.
وفي السياق ذاته، قديما كانت البرامج لا تزال تدخل باستخدام شريط ورقي مثقب. ثم بحلول أواخر الستينيات أصبحت أجهزة تخزين البيانات وأجهزة الكمبيوتر غير مكلفة بما يكفي بحيث يمكن إنشاء البرامج عن طريق الكتابة مباشرة على أجهزة الحاسوب. تم تطوير برامج تحرير النصوص التي تتيح إجراء تغييرات وتصحيحات بسهولة أكبر من البطاقات المثقوبة.
من جانب آخر، ومع ذلك يرجع تاريخ أول برنامج كمبيوتر إلى عام 1843 عندما قامت عالمة الرياضيات أدا لوفليس بنشر خوارزمية لحساب سلسلة من أرقام برنولي يهدف إلى تنفيذها بواسطة تشارلز باباج عن طريق محرك تحليلي.
ومن جهة أخرى، كانت الأجهزة القابلة للبرمجة موجودة على الأقل منذ عام 1206 ميلادي عندما كانت أوتوماتيكي الجزاري قابلة للبرمجة عبر الأوتاد والكامينات للعب مختلف الإيقاعات وأنماط الطبل؛ ويمكن لجهاز jacquard loom سنة 1801 موجات مختلفة عن طريق تغير برمجته - سلسلة من بطاقات اللوح مع ثقوب مثقوبة فيها.
من جانب آخر، في الثمانينات من القرن التاسع عشر اخترع هيرمان هوليريث مفهوم تخزين البيانات في شكل قابل للقراءة آليا. في وقت لاحق سمحت ( التوصيل) التي تمت إضافتها إلى Type I Tabulator 1906 الخاصة به ببرمجة وظائف مختلفة وبحلول أواخر الأربعينيات من القرن الماضي تمت برمجة مثل IBM 602 وIBM 604 بواسطة لوحات التحكم بطريقة مماثلة. كما كانت هي أول أجهزة الكمبيوتر الإلكترونية. وكذلك مع مفهوم أجهزة الكمبيوتر المخزنة في البرنامج التي أدخلت في عام 1949 تم تخزين كل من البرامج والبيانات ومعالجتها بنفس الطريقة في ذاكرة الكمبيوتر.
وفي هذا السياق، كانت شفرة الآلة هي لغة البرامج المبكرة وهي مكتوبة في مجموعة التعليمات الخاصة بالجهاز المحدد وغالبًا ما تكون بترميز ثنائي. سرعان ما تم تطوير لغات التجميع والتي تتيح للمبرمج تحديد التعليمات بتنسيق نصي (مثلًا ADD X TOTAL) مع اختصارات لكل رمز تشغيل وأسماء ذات معنى لتحديد العناوين. ومع ذلك نظرًا لأن لغة التجميع ليست أكثر من مجرد ترميز مختلف للغة الآلة فإن أي جهازين لهما مختلفة لهما كذلك لغات تجميع مختلفة.
لغات البرمجة
البرمجة الحديثة
وفي السياق ذاته، لذلك يجب على المبرمج أن يكون ملما ببعض لغات البرمجة وأن يعرف ما هي اللغة المناسبة لتطبيق هذا البرنامج.
ومن جهة أخرى، تجدر الإشارة هنا إلى التذكير بمعنى كلمة لغة وهي طريقة الاتصال والتفاهم بين الأشخاص أو لنقل في حالة الحاسوب الطريقة التي يفهم بها الحاسوب طلب الإنسان. لذلك نجد في حياتنا مجموعة مصطلحات وكلمات يختلف استخدامها حسب الحاجة. لغات البرمجة المختلفة تتمتع بهذه الخاصية كذلك. فهناك الكثير من اللغات البرمجية الموجودة وهذه اللغات تختلف من ناحية عملها وهدفها ولكن في النهاية كل هذه اللغات تترجم إلى لغة الآلة 0 و1.
من جهة ثانية، لغة البرمجة الوحيدة التي يفهمها الحاسوب ويستطيع أن يتعامل معها هي لغة الآلة -machine language-. في البداية عمل المبرمجون على تحليل شيفرة الحاسوب –machine code- والتعامل معها بشكلها الجامد وغير المفهوم وهو (0,1). ولكن هذه العملية معقدة جدا ويصعب التعامل معها لعدم فهمها الواضح للبشر ولغموضها لذلك تم ابتكار لغات راقية تعمل كوسيط بين لغة الإنسان ولغة الآلة وهي لغة التجميع أسمبلي Assembly ثم تطورت للغات عالية المستوى مثل لغة السي ولغة البيسيك. ثم يتم تشغيل البرامج المكتوبة بهذه اللغات عن طريق أحد البرامج المتخصصة مثل المترجم والمصرف. هذه البرامج تعمل على ترجمة أسطر لغة البرمجة إلى لغة الحاسوب مما يسهل على الحاسوب تنفيذ هذه الأوامر وإخراج نتائج التنفيذ الواضحة.
خوارزميات الشطرنج كمثال
من جهة ثانية، دورة "IBM Deep Blue" (شطرنج الحواسيب) هي جزء من البرنامج التعليمي لشعبة علوم الحاسوب بجامعة ستانفورد.
في هذا الإطار، كانت «برمجة كمبيوتر للعب الشطرنج» في سنة 1950 عبارة عن ورقة تحمل خوارزمية "minimax" والتي هي جزء من تاريخ الخوارزميات المعقدة.
متطلبات الجودة
علاوةً على ذلك، المتانة: مدى توقع البرنامج للمشاكل بسبب الأخطاء (errors) (وليس الأخطاء (bugs)). يتضمن ذلك مواقف مثل البيانات غير الصحيحة أو غير المناسبة أو التالفة وعدم توفر الموارد اللازمة مثل الذاكرة وخدمات نظام التشغيل واتصالات الشبكة وخطأ المستعمل وانقطاع الطاقة غير المتوقع.
وعلى صعيد آخر، الفعالية/الأداء: قياس موارد النظام التي يستهلكها البرنامج (وقت المعالج مساحة الذاكرة الأجهزة البطيئة مثل الأقراص عرض النطاق الترددي للشبكة وحتى تفاعل المستعمل إلى حد ما): كلما كان ذلك أقل كان ذلك أفضل. يتضمن ذلك كذلك إدارة الموارد بعناية مثلًا تنظيف الملفات المؤقتة والتخلص من تسرب الذاكرة.
إضافةً إلى ذلك، لكل نهج في عملية تطوير البرامج، يجب على البرنامج النهائي أن يحقق خصائص جوهرية، مثل:
وفي هذا الصدد، الاعتمادية: وهي كم عدد المرات التي تكون فيها نتائج البرنامج صحيحة. يعتمد هذا على الدقة النظرية للخوارزميات، وتقليل أخطاء البرمجة إلى الحد الأدنى مثل الأخطاء في إدارة الموارد (مثلًا تجاوزات في مساحات التخزين المؤقتة) والأخطاء المنطقية (مثل القسمة على الصفر).
من جهة ثانية، القابلية للصيانة: سهولة تعديل البرنامج بواسطة مطوريه الحاليين أو المستقبليين من أجل إجراء تحسينات أو تخصيصات أو إصلاح الأخطاء وثغرات الأمان أو تكييفها مع بيئات جديدة. الممارسات الجيدة أثناء التطوير الأولي تحدث فرقًا في هذا الصدد. قد لا تكون هذه الجودة واضحة بشكل مباشر للمستعمل النهائي ولكنها قد تؤثر إلى حدّ كبير على مصير البرنامج على المدى الطويل.
ومن ناحية أخرى، الصلاحية: بيئة العمل الخاصة بالبرنامج: السهولة التي يمكن بها استخدام البرنامج للغرض المقصود منه أو حتى في بعض الحالات لأغراض غير متوقعة. يتضمن ذلك مجموعة واسعة من العناصر النصية والرسوماتية وفي بعض الأحيان للأجهزة التي تعمل على تحسين وضوح حدس التماسك واكتمال واجهة مستعمل البرنامج.
ومن ناحية أخرى، القابلية للنقل: مجموعة أجهزة الكمبيوتر وأنظمة التشغيل الأساسية التي يمكنها تجميع / تفسير الشفرة المصدرية للبرنامج وتشغيلها. يعتمد هذا على الاختلافات في تسهيلات البرمجة التي توفرها الأنظمة الأساسية المختلفة بما في ذلك موارد الأجهزة ونظام التشغيل والسلوك المتوقع للجهاز ونظام التشغيل وتوافر مترجمين خاصين بالمنصة (وأحيانًا المكتبات) للغة الكود المصدري.
التعقيد الخوارزمي
ومن ناحية أخرى، لهذا الغرض يتم تصنيف الخوارزميات في أوامر باستخدام ما يسمى Big O notation والذي يعبر عن استخدام الموارد مثل وقت التنفيذ أو استهلاك الذاكرة من حيث حجم المدخلات. المبرمجين الخبراء على دراية بمجموعة متنوعة من الخوارزميات الراسخة والتعقيدات الخاصة بكل منها ويستعملون هذه المعرفة لاختيار الخوارزميات الأكثر ملاءمة للظروف.
إضافةً إلى ذلك، يهتم المجال الأكاديمي والممارسة الهندسية لبرمجة الكمبيوتر إلى حد كبير باكتشاف وتنفيذ الخوارزميات الأكثر كفاءة لفئة معينة من المشكلات.
التقسيم
إضافةً إلى ذلك، كما تم تطوير لغات البرمجة المرئية المختلفة بهدف حل مخاوف قابلية القراءة من خلال تبني طرق غير تقليدية لهيكلة الشفرة وعرضها. تهدف بيئات التطوير المتكاملة (IDEs) إلى دمج كل هذه المساعدات. تقنيات مثل refactoring Code يمكن أن تعزز قابلية القراءة بدرجة كبيرة.
وفي السياق ذاته، غالبًا ما تتم معالجة جوانب الخاصة بهذا (مثل المسافات البادئة وفواصل الأسطر وتمييز اللون وما إلى ذلك) بواسطة محرر التعليمات البرمجية المصدر لكن جانب المحتوى يعكس موهبة ومهارات المبرمج.
📝 هل في هذه المقالة خطأ؟
إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.
ما رأيك في هذه المقالة؟