ConstructiCat Logo
CodeBust.
Browse section ▾

الترميز الثابت.

تضمين البيانات في الشيفرة المصدرية للبرنامج

الترميز الثابت (Hard coding) هو ممارسة تطوير البرمجيات المتمثلة في تضمين البيانات مباشرةً في الشيفرة المصدرية لـبرنامج أو كائن قابل للتنفيذ آخر، بدلاً من الحصول على البيانات من مصادر خارجية أو توليدها في وقت التشغيل.

يمكن تعديل البيانات المُرمَّزة ثابتاً في العادة فقط عن طريق تحرير الشيفرة المصدرية وإعادة تصريفها للملف القابل للتنفيذ، وإن كان بالإمكان تغييرها في الذاكرة أو على القرص باستخدام المُنقِّح أو محرر HEX.

تُعدّ البيانات المُرمَّزة ثابتاً أنسب لقطع المعلومات التي لا تتغير، مثل الثوابت الفيزيائية وأرقام الإصدار وعناصر النص الثابت.

أما البيانات المُرمَّزة مرنةً (Soft-coded)، فتُشفِّر معلومات تعسفية عبر مدخلات المستخدم وملفات النص وملفات INI واستجابات خادم HTTP وملفات الضبط وماكرو المعالج المسبق والثوابت الخارجية وقواعد البيانات ووسيطات سطر الأوامر، ويُحدَّد مضمونها في وقت التشغيل.

نظرة عامة

يستلزم الترميز الثابت تغيير الشيفرة المصدرية للبرنامج في كل مرة تتغير فيها بيانات الإدخال أو الصيغة المطلوبة، في حين قد يكون أكثر ملاءمةً للمستخدم النهائي تغيير التفاصيل بطريقة ما خارج البرنامج.

كثيراً ما يكون الترميز الثابت ضرورياً، غير أنه يمكن أن يُعدَّ نمطاً مضاداً. فقد لا يكون لدى المبرمجين حلٌّ لواجهة مستخدم ديناميكية جاهزة للمستخدم النهائي، ولكنهم مع ذلك يجب أن يُسلِّموا الميزة أو يُصدِروا البرنامج. يكون هذا في العادة مؤقتاً، ولكنه يحلّ على المدى القريب ضغطَ تسليم الشيفرة. يُجرى لاحقاً الترميز المرن للسماح للمستخدم بتمرير معاملات تُتيح له تعديل النتائج أو المخرجات.

استُخدم مصطلح "الترميز الثابت" في الأصل استعارةً من توصيل الدوائر الكهربائية بصلابة، وكان يُعبِّر عن الجمود الناتج عن استخدامه في تصميم البرمجيات وتنفيذها. وفي سياق بيئات التطوير التعاوني القابلة للتمديد في وقت التشغيل مثل MUDs، يُشير الترميز الثابت أيضاً إلى تطوير المحرك الأساسي للنظام المسؤول عن المهام منخفضة المستوى وتنفيذ السكريبتات، في مقابل الترميز المرن الذي يعني تطوير السكريبتات عالية المستوى التي يُفسِّرها النظام في وقت التشغيل، بقيم من مصادر خارجية كـملفات النص وملفات INI وماكرو المعالج المسبق والثوابت الخارجية وقواعد البيانات ووسيطات سطر الأوامر واستجابات HTTP الخادم وملفات الضبط ومدخلات المستخدم. في هذا السياق، لا يُعدّ المصطلح تحقيرياً، بل يُشير إلى التطوير العام لا إلى تضمين بيانات الإخراج تحديداً.

الأبواب الخلفية

يُعدّ ترميز بيانات الاعتماد ثابتاً طريقةً شائعة لإنشاء باب خلفي. لا تظهر بيانات الاعتماد المُرمَّزة ثابتاً في العادة في ملفات الضبط أو مخرجات أوامر تعداد الحسابات، ولا يمكن للمستخدمين تغييرها أو تجاوزها بسهولة. وإن اكتُشفت، قد يتمكن المستخدم من تعطيل هذا الباب الخلفي عن طريق تعديل البرنامج وإعادة بنائه من شيفرته المصدرية (إن كان المصدر متاحاً للعموم)، أو فكّ التصريف، أو الهندسة العكسية لـالبرنامج، أو التحرير المباشر لـالشيفرة الثنائية للبرنامج، أو إقامة فحص تكامل (كالتوقيعات الرقمية وآليات مكافحة التلاعب ومكافحة الغش) لمنع الوصول غير المتوقع؛ غير أن مثل هذه الإجراءات كثيراً ما تكون محظورة بموجب اتفاقية ترخيص المستخدم النهائي.

إدارة الحقوق الرقمية

كإجراء من إجراءات إدارة الحقوق الرقمية (DRM)، قد يُرمِّز مطورو البرمجيات رقماً تسلسلياً فريداً مباشرةً في البرنامج. أو يشيع ترميز مفتاح عام ثابتاً، مما يُنشئ آلية DRM يتعذّر إنشاء مُولِّد مفاتيح (keygen) لها.

في المقابل، قد يُرمِّز كاسر البرمجيات رقماً تسلسلياً صالحاً مباشرةً في البرنامج أو يمنع الملف القابل للتنفيذ من طلبه من المستخدم، مما يُتيح إعادة توزيع النسخ غير المرخصة دون الحاجة إلى إدخال رقم صالح، فتتشارك كل النسخ المفتاح ذاته إن كان مُرمَّزاً ثابتاً.

مسار التثبيت الثابت

إذا كان برنامج Windows مبرمجاً للافتراض بأنه دائماً مُثبَّت في C:\Program Files\Appname وحاول شخص ما تثبيته على محرك أقراص مختلف لأسباب تتعلق بالمساحة أو التنظيم، فقد يفشل في التثبيت أو التشغيل بعد التثبيت. قد لا تُكتشف هذه المشكلة في عملية الاختبار، إذ يُثبِّت المستخدم العادي على محرك الأقراص والدليل الافتراضيين ولا يشمل الاختبار عادةً خيار تغيير دليل التثبيت. غير أنه يُنصح المبرمجون والمطورون بعدم تثبيت مسار تثبيت البرنامج، إذ يعتمد المسار الافتراضي على نظام التشغيل وإصداره وقرارات مسؤول النظام. فمثلاً، تستخدم كثير من تثبيتات Microsoft Windows المحرك C: باعتباره القرص الصلب الرئيسي، لكن هذا غير مضمون.

كانت ثمة مشكلة مماثلة مع المعالجات الدقيقة في الحواسيب المبكرة، التي كانت تبدأ التنفيذ عند عنوان ثابت في الذاكرة.

قرص الإقلاع

تبحث بعض البرامج "المحمية من النسخ" عن ملف معين على قرص مرن أو محرك أقراص فلاش عند بدء التشغيل للتحقق من أنها ليست نسخاً غير مرخصة. إذا استُبدل الحاسوب بجهاز أحدث لا يحتوي على مشغّل للأقراص المرنة، فلن يمكن تشغيل البرنامج الذي يتطلبه لأنه لا يمكن إدراج القرص المرن.

يُبيِّن هذا المثال الأخير سبب إمكانية أن يتبيَّن عدم جدوى الترميز الثابت حتى حين يبدو في وقته أنه سيعمل تماماً. في الثمانينيات والتسعينيات، كانت الغالبية العظمى من أجهزة PC مزودة بمشغّل قرص مرن واحد على الأقل، غير أن مشغّلات الأقراص المرنة خرجت لاحقاً من الاستخدام. قد يواجه برنامج مُرمَّز بهذه الطريقة منذ 15 عاماً مشكلات إن لم يُحدَّث.

المجلدات الخاصة

تحتوي بعض أنظمة تشغيل Windows على ما يُسمى المجلدات الخاصة التي تُنظِّم الملفات منطقياً على القرص الصلب. ثمة مشكلات يمكن أن تنشأ جراء الترميز الثابت:

مسار الملف الشخصي

تُرمِّز بعض برامج Windows مسار الملف الشخصي ثابتاً إلى مواقع يُحددها المطور مثل C:\Documents and Settings\Username. هذا هو المسار المعتمَد في الغالبية العظمى من أنظمة Windows 2000 وما فوق، لكنه سيُسبِّب خطأ إذا كان الملف الشخصي مخزَّناً على شبكة أو منقولاً بطريقة أخرى. الطريقة الصحيحة للحصول عليه هي استدعاء الدالة GetUserProfileDirectory أو حلّ متغير البيئة %userprofile%. افتراض آخر يشيع لدى المطورين وهو أن الملف الشخصي موجود على قرص صلب محلي.

مسار مجلد المستندات

تُرمِّز بعض برامج Windows مسار My Documents ثابتاً على هيئة ProfilePath\My Documents. ستعمل هذه البرامج على الأجهزة التي تشغّل الإصدار الإنجليزي، لكن في الإصدارات المحلية من Windows يحمل هذا المجلد في العادة اسماً مختلفاً. فمثلاً، في الإصدارات الإيطالية يُسمَّى مجلد My Documents باسم Documenti. وقد يكون مجلد My Documents أيضاً قد أُعيد توجيهه باستخدام ميزة Folder Redirection في Group Policy في Windows 2000 وما فوق. الطريقة الصحيحة للحصول عليه هي استدعاء الدالة SHGetFolderPath.

الحل

يمكن توسيع مرجع غير مباشر، كمتغير داخل البرنامج يُسمى "FileName"، عبر الوصول إلى نافذة حوار "استعراض ملف"، ولا يلزم عندئذٍ تغيير شيفرة البرنامج إن تحرَّك الملف.

يُعدّ الترميز الثابت مشكلةً بالغة الأثر تحديداً عند إعداد البرنامج للترجمة إلى لغات أخرى.

في حالات كثيرة، قد تظهر قيمة واحدة مُرمَّزة ثابتاً، كحجم مصفوفة، عدة مرات في الشيفرة المصدرية للبرنامج. سيكون هذا ما يُعرف بـالرقم السحري. وقد يُسبِّب هذا خطأً في البرنامج إذا عُدِّل بعض مواضع ظهور القيمة دون بعضها الآخر. مثل هذا الخطأ يصعب اكتشافه وقد يبقى في البرنامج فترةً طويلة. قد تنشأ مشكلة مماثلة إذا استُخدمت القيمة المُرمَّزة ثابتاً ذاتها لأكثر من قيمة معامل واحدة، مثل مصفوفة مؤلفة من 6 عناصر وطول حد أدنى لسلسلة الإدخال يبلغ 6 أحرف. قد يُغيِّر المبرمج خطأً جميع نسخ القيمة (باستخدام ميزة بحث واستبدال في المحرر) دون فحص الشيفرة لمعرفة كيفية استخدام كل نسخة. يُتجنَّب كلا الأمرين بتعريف الثوابت، التي تربط الأسماء بالقيم، واستخدام أسماء الثوابت لكل ظهور في الشيفرة.

حالة مهمة من حالات الترميز الثابت هي عندما تُوضَع السلاسل النصية مباشرةً في الملف، مما يُجبر المترجمين على تحرير الشيفرة المصدرية لترجمة البرنامج. (ثمة أداة تُسمى gettext تُتيح ترك السلاسل في الملفات بينما تُمكِّن المترجمين من ترجمتها دون تغيير الشيفرة المصدرية؛ إذ تُلغي في الفعل ترميزها الثابت.)

مسابقات الحوسبة

في مسابقات الحوسبة كـأولمبياد المعلوماتية الدولي، يُطلب من المتسابقين كتابة برنامج وفق نمط إدخال وإخراج محدد بحسب متطلبات الأسئلة.

في حالات نادرة يكون فيها عدد المدخلات المحتملة صغيراً بما يكفي، قد يفكر المتسابق في اعتماد نهج يُعيِّن فيه جميع المدخلات المحتملة إلى مخرجاتها الصحيحة. سيُعدّ هذا البرنامج حلاً مُرمَّزاً ثابتاً لا خوارزمياً (حتى وإن كان ناتج برنامج خوارزمي).

الترميز المرن

الترميز المرن (Soft coding) مصطلحٌ في برمجة الحاسوب يُشير إلى الحصول على قيمة أو دالة من مورد خارجي، مثل ملفات النص وملفات INI وماكرو المعالج المسبق والثوابت الخارجية وملفات الضبط ووسيطات سطر الأوامر وقواعد البيانات ومدخلات المستخدم واستجابات خادم HTTP. وهو نقيض الترميز الثابت الذي يُشير إلى ترميز القيم والدوال في الشيفرة المصدرية.

ممارسة البرمجة

تجنُّب الترميز الثابت للقيم التي تُعدَّل عادةً ممارسةٌ برمجية جيدة. ينبغي لمستخدمي البرنامج أن يتمكنوا من تخصيصه وفق احتياجاتهم، في حدود المعقول، دون الحاجة إلى تحرير الشيفرة المصدرية. وبالمثل، يتجنب المبرمجون المتأنون الأرقام السحرية في شيفرتهم لتحسين قابليتها للقراءة والمساعدة في صيانتها. لا يُشار عادةً إلى هذه الممارسات بمصطلح الترميز المرن.

يُستخدم المصطلح عادةً حين يصبح الترميز المرن نمطاً مضاداً. قد يُفضي تجريد قيم وميزات كثيرة جداً إلى تعقيد أكبر ومشكلات صيانة أكثر مما كان يُعانى منه عند تغيير الشيفرة عند الحاجة. عُرض الترميز المرن بهذا المعنى في مقال على The Daily WTF.

مشكلات محتملة

في أقصى الحالات، تطور البرامج المُرمَّزة مرنةً لغاتها النصية الخاصة المُصمَّمة والمُنفَّذة بشكل سيئ، وملفات ضبط تستلزم مهارات برمجية متقدمة لتحريرها. قد يؤدي هذا إلى إنتاج أدوات مساعدة في ضبط البرنامج الأصلي، وغالباً ما تنتهي هذه الأدوات بأن تكون هي أيضاً مُرمَّزة مرنةً.

يتغير الحد الفاصل بين قابلية الضبط السليمة والترميز المرن الإشكالي وفق أسلوب البرنامج وطبيعته. يجب أن تكون البرامج مغلقة المصدر قابلة للضبط إلى حد كبير، إذ لا يمتلك المستخدم النهائي وصولاً إلى المصدر لإجراء أي تغييرات. يمكن أن تكون البرامج الداخلية وذات التوزيع المحدود أقل قابلية للضبط، إذ يُعدّ توزيع النسخ المعدَّلة أبسط. غالباً ما تكون تطبيقات الويب المخصصة أفضل مع قابلية ضبط محدودة، إذ نادراً ما يكون تعديل السكريبتات أصعب من تعديل ملف الضبط.

لتجنب الترميز المرن، فكِّر في قيمة أي مرونة إضافية تقدمها للمستخدم النهائي، وقارنها بزيادة التعقيد وتكاليف الصيانة المستمرة المرتبطة بقابلية الضبط المضافة.

تحقيق المرونة

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