قيمة غير محددة
في مجال الحوسبة (وخاصةً البرمجة )، تُعرف القيمة غير المُعرَّفة بأنها حالة لا يكون فيها للتعبير في لغة البرمجة قيمة صحيحة دلاليًا في تلك اللغة، على الرغم من صحته النحوية . يجب عدم الخلط بين القيمة غير المُعرَّفة والسلسلة الفارغة ، أو القيمة المنطقية "خطأ"، أو غيرها من القيم "الفارغة" (وإن كانت مُعرَّفة). قد يؤدي تقييم قيمة غير مُعرَّفة، بحسب الظروف، إلى استثناء أو سلوك غير مُعرَّف ، ولكن في بعض لغات البرمجة، قد تحدث القيم غير المُعرَّفة أثناء سير تنفيذ البرنامج بشكل طبيعي ومتوقع .
عادةً ما تتعامل اللغات ذات الكتابة الديناميكية مع القيم غير المعرّفة بشكل صريح كلما أمكن ذلك. على سبيل المثال، تحتوي لغة بيرلundef على المعامل [ 1 ] الذي يُمكنه "إسناد" هذه القيمة إلى متغير. في أنظمة الكتابة الأخرى، قد تعني القيمة غير المعرّفة قيمةً غير معروفة أو غير متوقعة، أو مجرد فشل البرنامج عند محاولة تقييمها. توفر الأنواع القابلة للتصفير نهجًا وسيطًا؛ انظر أدناه .
التعامل
تكون قيمة الدالة الجزئية غير مُعرَّفة عندما يكون وسيطها خارج نطاق تعريفها . يشمل ذلك العديد من الحالات الحسابية مثل القسمة على صفر ، أو الجذر التربيعي ، أو لوغاريتم عدد سالب، وما إلى ذلك. ومن الأمثلة الشائعة الأخرى الوصول إلى مصفوفة باستخدام فهرس خارج نطاقها، وكذلك قيمة مفتاح في مصفوفة ترابطية لا تحتويه. توجد طرق مختلفة للتعامل مع هذه الحالات عمليًا:
القيمة المحجوزة
في التطبيقات التي تتطلب معالجة القيم غير المُعرَّفة بسلاسة، من الشائع حجز قيمة فارغة خاصة يمكن تمييزها عن القيم العادية. يحل هذا الأمر المشكلة بإنشاء قيمة مُعرَّفة لتمثيل الحالة التي كانت غير مُعرَّفة سابقًا. وهناك أمثلة عديدة على ذلك:
- تحتفظ مكتبة الإدخال/الإخراج القياسية للغة C بالقيمة الخاصة
EOFللإشارة إلى عدم توفر المزيد من المدخلات.getchar()تُعيد الدالة الحرف التالي المتاح، أو قيمة فارغةEOFفي حال عدم توفر المزيد. ( يُعرّف رمز ASCII حرفًا فارغًا لهذا الغرض، ولكن مكتبة الإدخال/الإخراج القياسية ترغب في إمكانية إرسال واستقبال الأحرف الفارغة، لذا فهي تُعرّفEOFقيمة منفصلة). - يُعرّف معيار IEEE 754 للحسابات ذات الفاصلة العائمة قيمة خاصة تُسمى " ليس رقمًا "، تُعاد عندما لا يكون للعملية الحسابية قيمة مُحددة. ومن الأمثلة على ذلك القسمة على صفر ، أو الجذر التربيعي أو اللوغاريتم لعدد سالب .
- تحتوي لغة الاستعلامات المهيكلة على قيمة خاصة
NULLللإشارة إلى البيانات المفقودة. - تتيح لغة بيرل التحقق من تعريف التعبير عبر
defined()المسند. [ 2 ] - تدعم العديد من لغات البرمجة مفهوم المؤشر الفارغ الذي يختلف عن أي مؤشر صالح، وغالبًا ما يستخدم كقيمة إرجاع للخطأ.
- تسمح بعض اللغات بأن تكون معظم الأنواع قابلة للتصفير، على سبيل المثال C# . [ 3 ]
- معظم استدعاءات نظام يونكس تُرجع القيمة الخاصة -1 للإشارة إلى الفشل.
بينما تضمن اللغات ذات الكتابة الديناميكية غالبًا أن تكون القيمة الافتراضية للمتغيرات غير المُهيأة هي قيمة فارغة (null)، فإن القيم ذات الكتابة الثابتة غالبًا لا تفعل ذلك، وتميز بين القيم الفارغة (التي تكون محددة جيدًا) والقيم غير المُهيأة (التي لا تكون كذلك). [ 3 ]
معالجة الاستثناءات
تتضمن بعض لغات البرمجة مفهوم معالجة الاستثناءات للتعامل مع حالات عدم إرجاع قيمة. تُرجع الدالة قيمةً بطريقة محددة، ولكنها لا تُرجع قيمةً، لذا لا حاجة لابتكار قيمة خاصة للإرجاع.
يُعدّ التعامل مع الإشارات أحد أشكال هذا النهج ، حيث يتم على مستوى نظام التشغيل وليس ضمن لغة البرمجة. يمكن لمعالجات الإشارات محاولة بعض أشكال الاستعادة، مثل إنهاء جزء من عملية حسابية، ولكن دون المرونة الكافية التي يوفرها التعامل مع الاستثناءات المتكاملة تمامًا.
الدوال التي لا تُرجع قيمة
الدالة التي لا تُرجع قيمةً أبدًا يكون لها قيمة غير مُعرَّفة، لأن هذه القيمة لا يُمكن رصدها. تُصنَّف هذه الدوال رسميًا ضمن النوع الأدنى ، الذي لا يحتوي على أي قيم. تندرج الأمثلة ضمن فئتين:
- الدوال التي تتكرر بلا نهاية . قد يحدث هذا عمدًا، أو نتيجةً للبحث عن شيء لن يُعثر عليه أبدًا. (على سبيل المثال، في حالة فشل عامل μ في دالة تكرارية جزئية ).
- الوظائف التي تُنهي الحساب، مثل
exitاستدعاء النظام . من داخل البرنامج، لا يمكن تمييز هذا عن الحالة السابقة، ولكنه يُحدث فرقًا بالنسبة لمُستدعي البرنامج.
سلوك غير محدد
تتطلب جميع الطرق السابقة للتعامل مع القيم غير المُعرَّفة اكتشاف عدم التعريف. أي أن الدالة المُستدعاة تُحدد أنها لا تستطيع إرجاع نتيجة طبيعية، فتتخذ إجراءً ما لإخطار المُستدعي. وعلى النقيض، يُلقي السلوك غير المُعرَّف مسؤولية تجنب استدعاء دالة بمعاملات خارج نطاقها على عاتق المُستدعي. ولا حدود لما قد يحدث. في أفضل الأحوال، عطلٌ يُمكن اكتشافه بسهولة ؛ وفي أسوأ الأحوال، خطأٌ دقيق في عملية حسابية تبدو غير ذات صلة.
(يشمل التعريف الرسمي لـ "السلوك غير المحدد" احتمالات أكثر تطرفاً، بما في ذلك أشياء مثل " التوقف والاشتعال " و"إخراج الشياطين من أنفك". [ 4 ] )
المثال الكلاسيكي هو مرجع المؤشر المعلق . من السهل جدًا الوصول إلى مرجع مؤشر صالح ، لكن تحديد صلاحيته قد يكون معقدًا للغاية. لذلك، لا تحاول أجهزة الحاسوب ولغات البرمجة منخفضة المستوى مثل لغة C التحقق من صحة المؤشرات قبل الوصول إليها، بل تُلقي بالمسؤولية على عاتق المبرمج. يوفر هذا الأسلوب سرعةً على حساب الأمان.
قيمة غير محددة بالمعنى الدقيق للكلمة
التعريف الدقيق للقيمة غير المُعرَّفة هو ناتج يبدو ظاهريًا صحيحًا (غير فارغ) ولكنه عديم المعنى ولا يُؤدي إلى سلوك غير مُعرَّف. على سبيل المثال، تمرير عدد سالب إلى دالة الجذر التربيعي العكسي السريع سيُنتج عددًا. ليس عددًا مفيدًا جدًا، لكن العملية الحسابية ستكتمل وتُعيد قيمة ما .
تكثر القيم غير المُعرَّفة في الأجهزة الإلكترونية. فإذا لم يحمل سلكٌ ما معلوماتٍ مفيدة، فإنه يبقى موجودًا وله مستوى جهدٍ معين. يجب ألا يكون الجهد غير طبيعي (كأن لا يكون جهدًا زائدًا مُضرًّا)، ولكن مستوى المنطق المُحدد غير مهم.
يحدث الموقف نفسه في البرمجيات عندما يتم توفير مخزن بياناتstrftime مؤقت ولكنه غير ممتلئ تمامًا. على سبيل المثال، تقوم دالة مكتبة C بتحويل الطابع الزمني إلى صيغة قابلة للقراءة في مخزن إخراج مُحدد. إذا لم يكن مخزن الإخراج كبيرًا بما يكفي لاستيعاب النتيجة، فسيتم إرجاع خطأ وستكون محتويات المخزن غير مُحددة.
في المقابل، يأخذ openاستدعاء النظام في نظام POSIX ثلاثة وسائط: اسم الملف، وبعض العلامات، ووضع الملف. يُستخدم وضع الملف فقط إذا تضمنت العلامات خيارًا معينًا O_CREAT. من الشائع استخدام صيغة ذات وسيطين من هذا الاستدعاء open، والتي تُعطي قيمة غير مُعرَّفة لوضع الملف عند O_CREATحذف هذا الخيار.
أحيانًا يكون من المفيد التعامل مع هذه القيم غير المحددة بشكل محدود. يمكن أن تظل العملية الحسابية الإجمالية محددة جيدًا إذا تم تجاهل القيمة غير المحددة لاحقًا.
على سبيل المثال، تسمح لغة C بتحويل مؤشر إلى عدد صحيح، على الرغم من أن القيمة العددية لهذا العدد غير مُعرَّفة. قد يكون ذلك مفيدًا لتصحيح الأخطاء، أو لمقارنة مؤشرين للتأكد من تساويهما، أو لإنشاء قائمة مرتبطة باستخدام عملية XOR .
يُعدّ التعامل الآمن مع القيم غير المُعرّفة أمرًا بالغ الأهمية في أنظمة التحكم التزامني التفاؤلي ، التي تكتشف حالات التزامن المتنافس بعد وقوعها. على سبيل المثال، ستؤدي قراءة متغير مشترك محمي بواسطة seqlock إلى إنتاج قيمة غير مُعرّفة قبل تحديد حدوث حالة تزامن متنافس. عندئذٍ، سيتم تجاهل البيانات غير المُعرّفة وإعادة محاولة العملية. ينتج عن ذلك نتيجة مُعرّفة طالما أن العمليات التي تُجرى على القيم غير المُعرّفة لا تُنتج سلوكًا غير مُعرّف بشكل كامل.
من الأمثلة الأخرى على فائدة القيم غير المُعرَّفة مولدات الأرقام العشوائية ودوال التجزئة . فالقيم المُعادة غير مُعرَّفة، لكنها تتمتع بخصائص مُحدَّدة ويمكن استخدامها دون أخطاء.
الترميز
في نظرية الحوسبة ، يُشار إلى عدم تعريف التعبير بـ expr ↑، وإلى التعريف بـ expr ↓.
انظر أيضاً
مراجع
- ↑ "undef" . وثائق بيرل 5. 25-09-2009 . تم الاطلاع عليه بتاريخ 26-03-2010 .
- ↑ "مُعرَّف" . وثائق بيرل 5. 25-09-2009 . تم الاسترجاع في 26-03-2010 .
- 1 2 كار، ريتشارد (2006-10-01). "أنواع البيانات الرقمية القابلة للتصفير في لغة C#" . برنامج تعليمي أساسيات لغة C# . مؤرشف من الأصل في 2007-01-21 . تم الاطلاع عليه في 2010-03-27 .
- ↑ "شياطين الأنف" . ملف المصطلحات . تم الاسترجاع في 12-06-2014 .
- شذوذ البرمجيات
- نظرية الحوسبة
