في جملة واحدة
YAML هي لغة لتمثيل البيانات (data serialization) سهلة القراءة للبشر، تستخدم المسافات البادئة وعلامات ترقيم قليلة للتعبير عن هياكل البيانات، مما يجعلها الخيار المفضل لملفات الإعداد التي يضطر الناس لكتابتها وقراءتها بأنفسهم.
المشكلة التي يحلها
في البداية، كانت هناك الفوضى. أو بشكل أدق، كانت هناك صيغ مثل XML. إذا أردت تخزين بيانات مهيكلة — مثلاً، إعدادات مستخدم — كنت ستجد نفسك تغلفها في غابة من الأقواس المثلثة. كانت قوية، قابلة للقراءة آلياً، وكابوس حقيقي لأي إنسان يحاول تعديلها دون أن يرتكب خطأً.
<user>
<name>Alex</name>
<roles>
<role>editor</role>
<role>admin</role>
</roles>
<active>true</active>
</user>
ثم جاء JSON (JavaScript Object Notation). وكان بمثابة نسمة هواء منعشة! مستوحى من صيغة كائنات JavaScript، تخلص من الأقواس المثلثة واستبدلها بالأقواس المتعرجة، والأقواس المربعة، والنقطتين الرأسيتين. كان أخف، وأنظف، وأصبح المعيار الفعلي لواجهات برمجة التطبيقات (APIs) في كل مكان.
{
"name": "Alex",
"roles": [
"editor",
"admin"
],
"active": true
}
ولكن حتى JSON له عيوبه عندما يكون البشر هم من يقودون العملية. كل تلك الفواصل، علامات الاقتباس، والأقواس هي بمثابة فخاخ نحوية. هل نسيت فاصلة؟ الملف بأكمله يصبح غير صالح. هل تريد إضافة تعليق لشرح لماذا تم تعيين إعداد معين بهذه الطريقة؟ للأسف، JSON لا يدعم التعليقات.
هذه هي الفجوة التي وُلد YAML لسدها في أوائل الألفية. اسمه، وهو اختصار ذاتي التكرار، يقول كل شيء: YAML Ain't Markup Language (YAML ليست لغة توصيف). إنه يركز بشكل كامل على كونه صيغة بيانات، وليس نظامًا لوصف المستندات. كان الهدف الأساسي للمطورين هو تحسينه ليكون سهل القراءة والكتابة من قبل البشر. نظروا إلى الهيكل النظيف والمنظم باستخدام المسافات البادئة في لغة Python وفكروا، "ماذا لو استطعنا استخدام ذلك للبيانات؟" والنتيجة هي صيغة تبدو أقل شبهاً بالكود وأكثر شبهاً بمخطط تفصيلي جيد التنظيم.
كيف يعمل من الداخل
يكمن سحر YAML في بساطته وعلاقته بـ JSON. في جوهره، يقوم محلل YAML (parser) بقراءة ملف نصي وبناء هيكل بيانات مجرد في الذاكرة — عملية لا تختلف كثيرًا عن كيفية عمل محلل JSON. هذا هو السبب في أن التحويل بين YAML و JSON سلس للغاية؛ فهما يمثلان نفس المفاهيم الأساسية، ولكن بملابس مختلفة.
لعبة المسافات البادئة
هذه هي الميزة التعريفية لـ YAML. حيث يستخدم JSON الأقواس {} و [] لإظهار التداخل، يستخدم YAML المسافات البيضاء. القاعدة بسيطة: إذا كان السطر مزاحًا لليمين (indented) أكثر من السطر الذي يسبقه، فهو ابن لذلك السطر.
- القاعدة رقم 1: استخدم المسافات، وليس الـ tabs. اتفق العالم بشكل جماعي على هذا لتجنب فوضى المحاذاة.
- القاعدة رقم 2: كن متسقًا. إذا استخدمت مسافتين للمستوى الأول من المسافات البادئة، فاستخدم مسافتين لجميع المستويات الأولى.
انظر إلى الفرق. الهيكل متطابق، لكن نسخة YAML تبدو وكأنها مجموعة ملاحظات نظيفة.
JSON:
{
"server": {
"port": 8080,
"security": {
"enable_https": true
}
}
}
YAML:
server:
port: 8080
security:
enable_https: true
اللبنات الأساسية: Scalars، Sequences، و Mappings
تتكون بيانات YAML من ثلاثة أشياء أساسية:
- Mappings (أو Objects/Dictionaries): هذه هي أزواج المفتاح-القيمة (key-value). في YAML، تكتبها على شكل
key: value. المسافة بعد النقطتين إلزامية!# A simple mapping name: "Alex" email: alex@example.com - Sequences (أو Lists/Arrays): هذه هي قوائم مرتبة من العناصر. تشير إلى كل عنصر بشرطة ومسافة (
-).# A simple sequence of roles - editor - admin - contributor - Scalars (أو Values): هذه هي البيانات الفعلية: نصوص، أرقام، وقيم منطقية (booleans). إحدى ميزات YAML الأكثر ودية هي أنك غالبًا لا تحتاج إلى وضع علامات اقتباس حول النصوص.
name: Alexتعمل بشكل ممتاز. تحتاج إلى علامات الاقتباس فقط إذا كان النص يحتوي على أحرف خاصة أو يمكن أن يُساء تفسيره كنوع آخر (مثلtrueأو5.0).
الجمع بين هذه اللبنات يمنحك القدرة على تمثيل أي هيكل بيانات تقريبًا.
# A list of user objects
- name: Alex
email: alex@example.com
roles:
- editor
- admin
- name: Bailey
email: bailey@example.com
roles:
- contributor
سحر متقدم: Anchors، Aliases، و Tags
لدى YAML بعض الحيل التي يفتقر إليها JSON، بشكل أساسي للحفاظ على ملفاتك جافة (DRY - Don't Repeat Yourself).
Anchors (
&) و Aliases (*): الـ anchor يسمح لك بتسمية جزء من البيانات. والـ alias يسمح لك بالإشارة إلى هذا الجزء في مكان آخر. هذا حل سحري للإعدادات المعقدة حيث توجد لديك كتل متكررة.# Define a default set of configurations with an anchor default_db_config: &db_defaults adapter: postgres pool: 5 timeout: 5000 # Use the defaults in different environments with an alias development: <<: *db_defaults # The << merges the alias in database: myapp_dev production: <<: *db_defaults database: myapp_prodهنا،
&db_defaultsينشئ قالبًا قابلاً لإعادة الاستخدام. و*db_defaultsيقوم بنسخه. إذا كنت بحاجة إلى تغييرtimeoutلجميع البيئات، ما عليك سوى تغييره في مكان واحد فقط.Tags (
!): الـ tags هي طريقة لإخبار المحلل بشكل صريح بنوع البيانات. نادرًا ما ستكتبها بنفسك، لكنها جزء من المواصفات.!!str "123"تجبر المحلل على معاملة "123" كنص، وليس كرقم.
قصص من الواقع
مهندس الـ DevOps المنهك
كان فريق يدير البنية التحتية لتطبيقاته على Kubernetes. كل خدمة، وكل deployment، وكل خريطة إعدادات كانت في ملف .json منفصل. مع نمو النظام، زاد ما يسمى بـ "عمى الأقواس". كانت الفروقات (diffs) في طلبات السحب (pull requests) كابوسًا من الأقواس غير المتطابقة وتغييرات الفواصل الزائدة. في النهاية، انفجر أحد المهندسين وقاد عملية ترحيل إلى YAML. فجأة، أصبحت ملفات deployment.yaml قابلة للمسح البصري. أُضيفت التعليقات لشرح سبب امتلاك خدمة ما لحد ذاكرة معين. أصبح العثور على خطأ إملائي في متغير بيئة عملية مسح بصري بدلاً من لغز نحوي.
الدرس: بالنسبة للإعدادات الهرمية المعقدة التي يقرأها ويعدلها البشر بشكل متكرر، فإن قابلية قراءة YAML تعد تحسينًا هائلاً لجودة الحياة.
المتحمس لمولدات المواقع الثابتة
كان فريق محتوى يستخدم مولد مواقع ثابتة (مثل Hugo أو Jekyll) لإدارة مدونة الشركة. كل مقال كان يبدأ بـ "frontmatter"، وهي كتلة من البيانات الوصفية للعنوان، المؤلف، التاريخ، والوسوم. الإعداد الأولي استخدم frontmatter بصيغة JSON. كان الكتاب غير التقنيين يتعثرون باستمرار بسبب الفواصل المفقودة أو علامات الاقتباس غير المعالجة بشكل صحيح. قام أحد المطورين بتبديل صيغة الـ frontmatter إلى YAML. كانت الصيغة بديهية للغاية (title: My Post، author: Dale) لدرجة أن تذاكر الدعم من الكتاب انخفضت إلى الصفر. أصبحوا الآن يركزون على الكتابة، وليس على الصيغة.
الدرس: قلة الضوضاء النحوية في YAML تجعلها "واجهة" ممتازة لغير المطورين الذين يحتاجون إلى التفاعل مع البيانات المهيكلة.
المأزق مع رمز الدولة
كان مطور يبني نظامًا لمعالجة الطلبات الدولية ويخزن رموز الدول المكونة من حرفين في ملف إعدادات YAML. كل شيء كان يعمل بشكل رائع مع US و DE و JP. ولكن عندما جاء طلب من النرويج (Norway)، تعطل النظام. بعد ساعات من التصحيح، وجدوا الجاني. ملف YAML كان يحتوي على country: NO. محلل YAML، في مساعدته اللامتناهية، فسر NO على أنها القيمة المنطقية false، وليس السلسلة النصية "NO". كان الإصلاح بسيطًا ولكنه محبط: country: "NO".
الدرس: الاستدلال التلقائي على الأنواع في YAML مريح ولكنه قد يؤدي إلى أخطاء مفاجئة. عند الشك، أو عند التعامل مع بيانات تبدو كقيمة منطقية أو رقم، ضع نصوصك بين علامتي اقتباس.
أخطاء ومصائد شائعة
- الـ Tabs مقابل المسافات. هذه هي الخطيئة الأصلية لـ YAML. يجب عليك استخدام المسافات للمسافات البادئة. يمكن ضبط معظم المحررات لتحويل الـ tabs تلقائيًا إلى مسافات، مما سينقذك من هذا النوع من الصداع.
- مشكلة النرويج. كما رأينا أعلاه، النصوص غير المقتبسة مثل
NO،YES،ON،OFF، وحتى بعض الأرقام يمكن تحويلها تلقائيًا إلى أنواع منطقية أو رقمية. القاعدة العامة: إذا كان النص يمكن أن يكون أي شيء آخر، فضعه بين علامتي اقتباس. - نسيان المسافة بعد النقطتين. كتابة
key:valueستسبب خطأ في التحليل. يجب أن تكون هناك مسافة بعد النقطتين:key: value. إنها تفصيلة صغيرة يقع فيها الجميع مرة واحدة على الأقل. - مسافات بادئة غير متسقة. استخدام مسافتين لمستوى تداخل ثم أربع لمستوى آخر سيؤدي إلى إرباك المحلل. اختر عرضًا للمسافة البادئة (مسافتان هي العرف الأكثر شيوعًا) والتزم به.
- التباس السلاسل النصية متعددة الأسطر. يحتوي YAML على أحرف خاصة (
|و>) للتعامل مع النصوص متعددة الأسطر.|يحافظ على فواصل الأسطر (رائع لمقتطفات الكود)، بينما>يطويها في سطر واحد (رائع للفقرات الطويلة). استخدام الحرف الخاطئ يمكن أن يفسد النص الخاص بك.
لماذا يجب أن يكون على رادارك
لا يمكنك الهروب من YAML إذا كنت تعمل في تطوير البرمجيات الحديثة، خاصة في مجال DevOps والبنية التحتية.
- الـ Configuration هو الملك: أدوات مثل Docker Compose، Kubernetes، Ansible، وتقريبًا جميع منصات CI/CD (GitHub Actions، GitLab CI) تستخدم YAML كلغة إعداد أساسية لها. معرفته ليست اختيارية؛ إنها كفاءة أساسية.
- بيانات محورها الإنسان: كلما كنت تنشئ نظامًا يحتاج فيه البشر إلى كتابة أو تحرير بيانات مهيكلة مباشرة — من إعدادات التطبيق إلى البيانات الوصفية للمدونات — يجب أن يكون YAML من أفضل المرشحين.
- كونه Superset لـ JSON: لأن YAML هو (في الغالب) مجموعة شاملة من JSON، لديك مسار ترحيل واضح وقابلية تشغيل ممتازة. يمكنك أخذ ملف JSON معقد، وتحويله إلى YAML لجعله أكثر قابلية للقراءة، وإضافة تعليقات، ثم تحويله مرة أخرى إذا كان نظام آخر يتطلب JSON خالصًا.
فكر في YAML على أنه أمين المكتبة الودود والمنظم، مقابل تيار بيانات JSON الخام والفعال. أنت بحاجة إلى كليهما في مجموعة أدواتك.
تعمق أكثر
- YAML.org: الموقع الرسمي لـ YAML، بما في ذلك المواصفات الكاملة.
- Wikipedia: YAML: نظرة عامة رائعة على تاريخ وميزات وإصدارات اللغة.
- "YAML Ain't Markup Language" on C2 Wiki: تعمق في أصل الكلمة وفلسفة التصميم من الأيام الأولى.
- Ansible's "YAML Syntax" Guide: دليل عملي وواقعي لصيغة YAML من أداة تعتمد عليها بشكل كبير.
- "Learn YAML in Y minutes": ورقة غش رائعة وسريعة للتعرف على الصيغة بسرعة.