العمارة الحاوية
الملف ليس بِتّات مضغوطة عارية — إنه بنية منظّمة تحوي البِتّات والأبعاد وفضاء اللون والبيانات الوصفية والشفافية والحركة. هندسة الحاوية قرار مستقلّ تماماً عن خوارزمية الضغط، ويحدّد نصف قدرات الصيغة.
أنت مصمّم صيغة في 1995. تكتب ملفاً يقرأه برنامج لم يُكتب بعد. واجه:
- التعرّف: كيف يعرف البرنامج من أول بايتات أنه ملفّك؟ ولماذا لا يكفي الامتداد؟
- التوسّع: ستضيف ميزة بعد سنوات. كيف يقرأ برنامج قديم ملفاً جديداً دون أن ينهار — يتجاهل ما لا يفهمه بأمان؟ وما الذي يُرفق مع كل قطعة ليعرف القارئ "كم أتخطّى؟ وهل التخطّي آمن أم قاتل؟"
- السلامة: كيف يكتشف القارئ أن الملف تلف؟
- الترتيب: endianness — ولماذا يجب أن تنصّ عليه صراحةً؟
المبدأ الجامع: TLV — DNA كل حاوية
قسّم الملف إلى قطع، كلٌّ تحمل Type (ما هذه؟) + Length (كم طولها؟) + Value. القارئ يقرأ Type؛ إن جهله، يقرأ Length ويقفز بأمان. هذا حلّ التوسّع المستقبلي.
FIG 1 بنية chunk في PNG — كل بايت يحلّ مشكلة
ثلاث حاويات — نفس الـDNA، أرواح مختلفة
FIG 2 ISOBMFF (HEIF/AVIF) — شجرة boxes من عالم MP4
| الحاوية | الصيغة | السمة |
|---|---|---|
| chunks + CRC | PNG | توقيع كاشف-أعطال، أعلام critical/ancillary بحالة الأحرف |
| RIFF | WebP | TLV little-endian؛ VP8/VP8L/VP8X/ALPH/ANIM |
| ISOBMFF | HEIF/AVIF | شجرة boxes؛ items متعدّدة، alpha كعنصر، HDR أصيل |
| markers | JPEG | أقدم، أقلّ انتظاماً؛ metadata في APPn (فوضى تاريخية) |
الخلاصة المعمارية
صيغة الصورة = (خوارزمية ضغط) ⊗ (حاوية). البُعدان مستقلّان. القدرات (alpha, anim, HDR, metadata, تدريجي, كشف تلف, توسّع) يقرّرها الصندوق لا الضاغط. هذا الفصل سيُمكّن JPEG XL من احتواء وضعين مختلفين تحت سقف واحد.
- افتح PNG حقيقياً بـ
xxd. فسّر التوقيع الثماني بايتاً بايتاً، ثم فكّك chunks على الورق (Length→Type→القطعة التالية). ارسم خريطة الملف. - ابنِ محلّل chunks من الصفر: يطبع (الاسم، الإزاحة، الطول، critical/ancillary من حالة الحرف). تحقّق من CRC-32 (نفّذه بنفسك).
- اختبار التوسّع: احقن chunk ثانوياً مزيّفاً (حرف أول صغير) بطول و CRC صحيحين. هل يفتح العارض الملف؟ يجب أن يتخطّاه. الآن اجعل الحرف الأول كبيراً وأعِد — يجب أن يرفض العارض. تشاهد آلية critical/ancillary تعمل بيدك.