البرمجة الثابتة
البرمجة الثابتة هي ممارسة تطوير البرمجيات المتمثلة في تضمين البيانات مباشرة في الكود المصدري لبرنامج أو كائن تنفيذي آخر، بدلاً من الحصول على البيانات من مصادر خارجية أو توليدها في وقت التشغيل .
لا يمكن تعديل البيانات المضمنة في الكود عادةً إلا عن طريق تحرير الكود المصدري وإعادة تجميع الملف التنفيذي، على الرغم من أنه يمكن تغييرها في الذاكرة أو على القرص باستخدام مصحح الأخطاء أو محرر سداسي عشري .
تُعد البيانات المضمنة في الكود هي الأنسب للمعلومات غير المتغيرة، مثل الثوابت الفيزيائية وأرقام الإصدارات وعناصر النصوص الثابتة.
أما البيانات المشفرة بشكل مرن، من ناحية أخرى، فتقوم بتشفير معلومات عشوائية من خلال مدخلات المستخدم ، وملفات النصوص ، وملفات INI ، واستجابات خادم HTTP، وملفات التكوين، ووحدات المعالجة المسبقة، والثوابت الخارجية، وقواعد البيانات، ووسائط سطر الأوامر ، ويتم تحديدها في وقت التشغيل.
ملخص
يتطلب التشفير الثابت تغيير شفرة المصدر للبرنامج في كل مرة تتغير فيها بيانات الإدخال أو التنسيق المطلوب، في حين قد يكون من الأنسب للمستخدم النهائي تغيير التفاصيل بطريقة ما خارج البرنامج. [ 1 ]
غالبًا ما يكون التشفير الثابت ضروريًا، ولكنه قد يُعتبر أيضًا نمطًا برمجيًا سيئًا . [ 2 ] قد لا يكون لدى المبرمجين حلٌّ لواجهة مستخدم ديناميكية للمستخدم النهائي، ولكن لا يزال يتعين عليهم تقديم الميزة أو إصدار البرنامج. عادةً ما يكون هذا حلاً مؤقتًا، ولكنه يُخفف، على المدى القصير، ضغط تسليم الكود. لاحقًا، يتم اللجوء إلى التشفير المرن للسماح للمستخدم بتمرير معلمات تُمكّنه من تعديل النتائج.
استُخدم مصطلح "مُبرمج مسبقًا" في البداية كتشبيهٍ بتوصيل الدوائر الكهربائية، وكان المقصود منه التعبير عن عدم المرونة الناتجة عن استخدامه في تصميم البرمجيات وتنفيذها. في سياق بيئات التطوير التعاوني القابلة للتوسيع أثناء التشغيل ، مثل ألعاب MUD ، يشير مصطلح "مُبرمج مسبقًا" أيضًا إلى تطوير المحرك الأساسي للنظام المسؤول عن المهام منخفضة المستوى وتنفيذ البرامج النصية ، وذلك على عكس "مُبرمج برمجيًا" الذي يُعنى بتطوير البرامج النصية عالية المستوى التي يُفسرها النظام أثناء التشغيل ، باستخدام قيم من مصادر خارجية، مثل ملفات النصوص ، وملفات INI ، ووحدات المعالجة المسبقة ، والثوابت الخارجية، وقواعد البيانات ، ومعاملات سطر الأوامر ، واستجابات خادم HTTP ، وملفات التكوين ، ومدخلات المستخدم . في هذه الحالة، لا يحمل المصطلح دلالة سلبية، بل يشير إلى التطوير بشكل عام، وليس إلى تضمين بيانات الإخراج تحديدًا.
الأبواب الخلفية
يُعدّ تضمين بيانات الاعتماد بشكل مباشر في التعليمات البرمجية طريقة شائعة لإنشاء ثغرة أمنية . عادةً ما تكون بيانات الاعتماد المُضمّنة غير مرئية في ملفات التكوين أو مخرجات أوامر تعداد الحسابات، ولا يمكن للمستخدمين تغييرها أو تجاوزها بسهولة. في حال اكتشافها، قد يتمكن المستخدم من تعطيل هذه الثغرة عن طريق تعديل البرنامج وإعادة بنائه من شفرته المصدرية ( إذا كانت متاحة للعموم )، أو فك تجميع البرنامج ، أو هندسته عكسيًا ، أو تعديل الشفرة الثنائية للبرنامج مباشرةً ، أو تطبيق آلية للتحقق من سلامة البرنامج (مثل التوقيعات الرقمية، ومكافحة التلاعب، ومكافحة الغش ) لمنع الوصول غير المتوقع، ولكن غالبًا ما تكون هذه الإجراءات محظورة بموجب اتفاقية ترخيص المستخدم النهائي .
إدارة الحقوق الرقمية
كإجراء لإدارة الحقوق الرقمية (DRM)، قد يقوم مطورو البرامج بتضمين رقم تسلسلي فريد مباشرةً في البرنامج. أو من الشائع تضمين مفتاح عام ، مما يُنشئ نظام إدارة حقوق رقمية يستحيل معه إنشاء مولد مفاتيح.
في الحالة المعاكسة، قد يقوم مخترق البرامج بتضمين رقم تسلسلي صالح في البرنامج أو حتى منع الملف التنفيذي من مطالبة المستخدم به، مما يسمح بإعادة توزيع النسخ غير المصرح بها دون الحاجة إلى إدخال رقم صالح، وبالتالي مشاركة نفس المفتاح لكل نسخة، إذا تم تضمين واحد بشكل ثابت.
مسار تثبيت ثابت
إذا تمت برمجة برنامج ويندوز بحيث يفترض تثبيته دائمًا في المسار C:\Program Files\Appname، وحاول أحدهم تثبيته على قرص مختلف لأسباب تتعلق بالمساحة أو التنظيم، فقد يفشل التثبيت أو التشغيل بعد التثبيت. قد لا تُكتشف هذه المشكلة أثناء عملية الاختبار، لأن المستخدم العادي يُثبّت البرنامج على القرص والمجلد الافتراضيين، وقد لا تتضمن الاختبارات خيار تغيير مجلد التثبيت. مع ذلك، يُنصح المبرمجون والمطورون بعدم تثبيت مسار تثبيت البرنامج، لأن مسار التثبيت الافتراضي يعتمد على نظام التشغيل وإصداره وقرارات مسؤول النظام . على سبيل المثال، تستخدم العديد من عمليات تثبيت مايكروسوفت ويندوز القرص C: كقرص صلب رئيسي ، ولكن هذا ليس مضمونًا.
كانت هناك مشكلة مماثلة مع المعالجات الدقيقة في أجهزة الكمبيوتر القديمة، والتي كانت تبدأ التنفيذ عند عنوان ثابت في الذاكرة.
قرص بدء التشغيل
تقوم بعض البرامج " المحمية ضد النسخ " بالبحث عن ملف معين على قرص مرن أو ذاكرة فلاش عند بدء التشغيل للتحقق من أنه ليس نسخة غير مصرح بها. إذا تم استبدال الكمبيوتر بجهاز أحدث لا يحتوي على محرك أقراص مرنة، فلن يتمكن البرنامج الذي يتطلبه من التشغيل الآن، لأن القرص المرن غير قابل للإدخال.
يُبيّن هذا المثال الأخير لماذا قد يكون التشفير الثابت غير عملي حتى وإن بدا في حينه أنه سينجح تمامًا. ففي ثمانينيات وتسعينيات القرن الماضي، زُوّدت غالبية أجهزة الكمبيوتر الشخصية بمحرك أقراص مرنة واحد على الأقل، لكن محركات الأقراص المرنة اختفت لاحقًا. وقد يواجه برنامج مُشفّر بهذه الطريقة قبل 15 عامًا مشاكل إذا لم يُحدّث.
مجلدات خاصة
تحتوي بعض أنظمة تشغيل ويندوز على ما يُسمى بالمجلدات الخاصة التي تُنظم الملفات منطقيًا على القرص الصلب. وهناك مشاكل قد تنشأ عند استخدام هذه المجلدات بشكل ثابت.
مسار الملف الشخصي
تقوم بعض برامج ويندوز بتضمين مسار ملف تعريف المستخدم في مواقع محددة من قِبل المطورين، مثل . هذا هو المسار المُستخدم في غالبية أنظمة ويندوز 2000 والإصدارات الأحدث ، ولكنه قد يُسبب خطأً إذا كان ملف التعريف مُخزنًا على شبكة أو تم نقله إلى موقع آخر. الطريقة الصحيحة للحصول عليه هي استدعاء الدالة أو تحديد متغير البيئة . من الافتراضات الشائعة الأخرى لدى المطورين أن ملف التعريف موجود على القرص الصلب المحلي.C:\Documents and Settings\UsernameGetUserProfileDirectory%userprofile%
مسار مجلد المستندات
تُضمّن بعض برامج ويندوز مسار المجلد بشكل ثابت My Documents. ProfilePath\My Documentsتعمل هذه البرامج على الأجهزة التي تعمل بنظام التشغيل الإنجليزي، ولكن في الإصدارات المحلية من ويندوز، يكون لهذا المجلد اسم مختلف عادةً. على سبيل المثال، في الإصدارات الإيطالية، يُسمى المجلد Documenti . قد يكون المجلد قد نُقل أيضًا باستخدام إعادة توجيه المجلد في نهج المجموعة في ويندوز 2000 أو الإصدارات الأحدث. الطريقة الصحيحة للحصول عليه هي استدعاء الدالة.My DocumentsMy DocumentsSHGetFolderPath
حل
يمكن توسيع مرجع غير مباشر، مثل متغير داخل البرنامج يسمى "FileName"، عن طريق الوصول إلى نافذة حوار "استعراض الملف"، ولن يكون من الضروري تغيير رمز البرنامج إذا تم نقل الملف.
يُعدّ التشفير الثابت مشكلة خاصة في إعداد البرنامج للترجمة إلى لغات أخرى.
في كثير من الحالات، قد تظهر قيمة ثابتة واحدة، مثل حجم مصفوفة، عدة مرات في شفرة البرنامج. يُعرف هذا بالرقم السحري . قد يتسبب هذا عادةً في حدوث خطأ برمجي إذا تم تعديل بعض مواضع هذه القيمة دون غيرها. يصعب اكتشاف هذا الخطأ وقد يبقى في البرنامج لفترة طويلة. قد تحدث مشكلة مماثلة إذا استُخدمت القيمة الثابتة نفسها لأكثر من قيمة مُعامل، مثلاً مصفوفة من 6 عناصر وحد أدنى لطول سلسلة الإدخال 6. قد يُغير المبرمج جميع مواضع القيمة عن طريق الخطأ (غالباً باستخدام خاصية البحث والاستبدال في المحرر) دون مراجعة الشفرة لمعرفة كيفية استخدام كل موضع. يُمكن تجنب كلا الحالتين بتعريف الثوابت ، التي تربط أسماءً بالقيم، واستخدام أسماء الثوابت لكل موضع في الشفرة.
من الأمثلة المهمة على التشفير الثابت وضع النصوص مباشرةً في الملف، مما يُجبر المترجمين على تعديل شفرة المصدر لترجمة البرنامج. (توجد أداة تسمح gettextبترك النصوص في الملفات، ولكنها تُمكّن المترجمين من ترجمتها دون تغيير شفرة المصدر؛ فهي تُزيل التشفير الثابت للنصوص فعليًا).
مسابقات الحوسبة
في مسابقات الحوسبة مثل الأولمبياد الدولي للمعلوماتية ، يُطلب من المتسابقين كتابة برنامج بنمط إدخال وإخراج محدد وفقًا لمتطلبات الأسئلة.
في حالات نادرة يكون فيها عدد المدخلات المحتملة صغيرًا بما يكفي، قد يلجأ المتسابق إلى استخدام أسلوب يربط جميع المدخلات المحتملة بمخرجاتها الصحيحة. يُعتبر هذا البرنامج حلاً مُبرمجًا مسبقًا، وليس حلاً خوارزميًا (مع أن البرنامج المُبرمج مسبقًا قد يكون ناتجًا لبرنامج خوارزمي).
البرمجة المرنة
البرمجة المرنة مصطلحٌ في مجال برمجة الحاسوب ، ويشير إلى الحصول على قيمة أو دالة من مصدر خارجي، مثل ملفات نصية ، أو ملفات INI ، أو وحدات ماكرو للمعالجة المسبقة ، أو ثوابت خارجية، أو ملفات تهيئة ، أو وسائط سطر الأوامر ، أو قواعد البيانات، أو مدخلات المستخدم، أو استجابات خادم HTTP. وهي عكس البرمجة الثابتة، التي تشير إلى تضمين القيم والدوال في شفرة المصدر.
ممارسة البرمجة
يُعدّ تجنّب تضمين القيم المُعدّلة بشكل متكرر في الكود ممارسة برمجية جيدة. ينبغي أن يكون بإمكان مستخدمي البرنامج تخصيصه وفقًا لاحتياجاتهم، ضمن حدود المعقول، دون الحاجة إلى تعديل شفرة المصدر. وبالمثل، يتجنّب المبرمجون الماهرون استخدام الأرقام الثابتة في شفرتهم البرمجية لتحسين سهولة قراءتها وتسهيل صيانتها. ولا تُعرف هذه الممارسات عادةً بالبرمجة المرنة .
يُستخدم هذا المصطلح عمومًا عندما يصبح الترميز المرن نمطًا برمجيًا سيئًا . إذ يُمكن أن يُؤدي تجريد الكثير من القيم والميزات إلى تعقيدات ومشاكل صيانة أكثر مما قد يُواجه عند تغيير الكود عند الحاجة. وقد تم التطرق إلى الترميز المرن، بهذا المعنى، في مقال على موقع The Daily WTF . [ 3 ]
المشاكل المحتملة
في أسوأ الأحوال، تقوم البرامج المبرمجة برمجياً بتطوير لغات برمجة نصية خاصة بها، مصممة ومنفذة بشكل سيئ، بالإضافة إلى ملفات تهيئة تتطلب مهارات برمجية متقدمة لتعديلها. وقد يؤدي ذلك إلى إنتاج أدوات مساعدة لضبط البرنامج الأصلي، وغالباً ما ينتهي الأمر بهذه الأدوات نفسها بأن تكون مبرمجة برمجياً.
يتغير الحد الفاصل بين قابلية التكوين السليمة والبرمجة البرمجية الإشكالية تبعًا لأسلوب البرنامج وطبيعته. يجب أن تتمتع البرامج مغلقة المصدر بقابلية تكوين عالية ، إذ لا يملك المستخدم النهائي صلاحية الوصول إلى المصدر لإجراء أي تعديلات. أما البرامج الداخلية والبرامج ذات التوزيع المحدود، فيمكن أن تكون أقل قابلية للتكوين، لأن توزيع نسخ معدلة منها أسهل. غالبًا ما تكون تطبيقات الويب المصممة خصيصًا هي الأنسب مع قابلية تكوين محدودة، لأن تعديل البرامج النصية نادرًا ما يكون أصعب من تعديل ملف التكوين.
لتجنب البرمجة المرنة، ضع في اعتبارك قيمة أي مرونة إضافية تقدمها للمستخدم النهائي، وقارنها بالتعقيد المتزايد وتكاليف الصيانة المستمرة المرتبطة بها والتي تنطوي عليها إمكانية التكوين الإضافية.
تحقيق المرونة
توجد عدة أنماط تصميم مشروعة لتحقيق المرونة التي تسعى البرمجة المرنة إلى توفيرها. قد يستفيد التطبيق الذي يتطلب مرونة أكبر مما هو مناسب لملف التكوين من دمج لغة برمجة نصية . في كثير من الحالات، يكون التصميم الأمثل هو لغة خاصة بالمجال مدمجة في لغة برمجة نصية راسخة. ثمة نهج آخر يتمثل في نقل معظم وظائف التطبيق إلى مكتبة، مما يوفر واجهة برمجة تطبيقات (API) لكتابة التطبيقات ذات الصلة بسرعة.
انظر أيضاً
مراجع
- ↑ إلفرايد داستن (2002). اختبار البرمجيات الفعال: 50 طريقة محددة لتحسين اختبارك . أديسون-ويسلي بروفيشنال. ص 188 وما بعدها. ISBN 978-0-201-79429-8.
- ↑ تانيا جانكا (14 أكتوبر 2020). أليس وبوب يتعلمان أمن التطبيقات . وايلي. ص 15 وما بعدها. ISBN 978-1-119-68740-5.
- ↑ البرمجة البرمجية من صحيفة The Daily WTF
- الأنماط المضادة
