برمجياتقراءة دقيقتين

لغة Futhark تبطئ كل عمليات القسمة لإصلاح خلل قسمة أصغر عدد على سالب واحد بعد 10 سنوات

نشرت مدونة لغة Futhark في 14 أكتوبر 2026 مقالة بعنوان “Making all divisions slower to fix a bug in 0.000000000000000000542% of cases”. وتشرح فيها خللًا بقي في اللغة، بحسب كاتبها، عشر سنوات: قسمة أصغر عدد صحيح على سالب واحد تُسقط البرنامج.

والسبب في طريقة تخزين الأعداد نفسها. فالتمثيل الذي تعمل به الأجهزة، two’s complement، غير متماثل: في 8 bit مثلًا يمتد المدى من -128 إلى 127، فلا يوجد 128 موجب يقابل أصغر عدد. وبالمنطق نفسه، حين يُقسم أصغر عدد في 32 bit على سالب واحد، يكون الناتج الصحيح خارج المدى الذي يمكن تمثيله أصلًا.

وفي لغة C لا تعيد هذه العملية رقمًا خاطئًا فحسب، بل تُعد signed integer overflow، وهو سلوك غير معرّف، أي أن الـ compiler مسموح له أن يفترض أنه لن يحدث أبدًا ويبني تحسيناته على ذلك. وعلى معمارية x86 الأمر أوضح، إذ تقول المقالة إن المعالج نفسه يرفع exception فيتوقف البرنامج.

ويمس الخلل Futhark لأنها تولّد كود C، فالمشكلة في جوهرها مشكلة C، وتخص كل لغة تمرّر القسمة إلى المعالج مباشرة. أما سلوك كل لغة في هذه الحالة تحديدًا فيختلف بحسب مواصفاتها.

والإصلاح سطر واحد: قبل القسمة يُفحص هل المقسوم عليه سالب واحد، فإن كان كذلك تُجرى العملية بأعداد unsigned. والكلفة كما تكتبها المقالة: “The cost is a branch on every single division”، أي شرط إضافي على كل قسمة في اللغة، من أجل حالة واحدة نادرة.

وما تكشفه القصة أن الكود الذي يفحص القسمة على الصفر ويعدّها آمنة، في C وC++ وما يشبههما، ما زال يحمل حالة ثانية لا يغطيها ذلك الفحص.

المصادر

  1. مقالة مدونة Futhark عن الخلل وإصلاحه
  2. شرح تمثيل two's complement على Wikipedia
  3. توثيق GCC عن سلوك الأعداد الصحيحة

من عدد الثلاثاء 9 جمادى الأولى - 20 أكتوبر

أخبار ذات صلة

برمجيات

مكتبة roc-deflate بلغة Roc الوظيفية تقترب من libdeflate المكتوبة بـ C بفارق وسيط 2.6% على M1

المغزى: الفجوة المفترضة بين لغة آمنة الذاكرة وكود C محسّن يدويًا صارت رقمًا يمكن قياسه، وهذا الرقم يتغير بالمعالج نفسه، فعبارة لغة أبطأ ناقصة دون تحديد أبطأ على أي جهاز.

14 جمادى الأولى - 25 أكتوبر

أخبار الثلاثاء 9 جمادى الأولى - 20 أكتوبر