أي لغة هي عبارة عن نصوص مجردة
ثم يتم برمجة محرر يقوم بقراءته و معالجة هذا النص للقيام بنتائج معينة مثل تلوين النصوص والأجزاء بعد أن يكون قد حلله وفق قواعد تلك اللغة
وكذلك يقوم بعمليات فحص للتأكد من أن النص يخضع لقواعد اللغة التي خصصت له
ويتخذ اجراءات بناء على نتيجة الفحص كأن يحدد مكان الخطأ أو يتوقع ما هو المفقود مثل عدم وجود وسم غالق مقابل لأحد الوسوم
وهكذا
الذي يختلف عن بقية لغات التطبيقات
أن لغات التطبيقات يكون لها مترجم أو مفسر يستطيع أن يحول النص بعد أن يكون صحيحا قواعديا إلى أي شيء آخر منثل ملف تنفيذي موافق لمنصا ما
أو ينتج معلومات من نمط آخر وهكذا
بينما اللغات التوصيفية أو الوسمية مثل XML فلا تنتج شيء وتبقى مجرد نص
ولكن هناك من يقوم بإنتاج مفسرات مختلفة تكون وظيفتها قراءت ملف بلغة XML كدخل والخرج وفق المطلوب إنتاجه
ومنهم من يقوم بإنتاج لغات خاصة مبنية على XML ويخضعها لقواعد محددة
مثلا SVG هي تنسيق مبني على XML و يخضع لقواعد تخص العناصر الرسومية ويكون النتيجة هي رسومات بعد أن يوجد برنامج مفسر أو قاريء لها ثم تحويلها إلى رسومات فيكتورية
نفس الأمر مطبق على لغة زامل XAML حيث يتم تحويله إلى واجهات وعناصر تصميمية في مشاريع WPF و SilverLight
ودعني أضرب مثال يقرب فكرة إنشاء لغة وكيف يمكن الاستفادة منها :
قبل مدة كنت بحاجة لتمرير قيم متحولات وخصائص مختلفة من طبقة XAML إلى طبقة العمل وذلك لتحديد خصائص متعلقة بعملية ربط المعطيات Data Binding زائدة عن المتوفر .
المتوفر كان يستخدم خصائص بأسمائها الصريحة وتعين لها القيم
وكنت سأضر في كل مرة أحتاج لخاصية جديدة بأن أضيفها وأبدأ باستخدامها
فكانت عملية بالنسبة لي تأخذ وقت عدا عن السطر الطويل نتيجة أسماء الخصائص وقيمها
فقمت ببرمجة MarkupExtension وسم مضاف يقوم بتمرير نص واحد فقط ومن ثم أنا أعيد تحيليل النص و أعين قيم الخصائص داخل جسم الاضافة
ولكن حتى لا أقع في أخطاء قمت بتعريف صيغة للنص ومن ثم بنيت له مفسر داخل جسم الإضافة بحيث يحلل النص ويقطعه ويقرأ أجزاءه وأحرفه ثم أعين القيم بناء عليه الطريقة أشبه بطريقة JSON
مثلا أمرر القيمة
"F:MRPOD; D:T; C:B2V"
حيث أقسم النص بناءً على ; أولا
ومن ثم أقوم بقراءة كل جزء ناتج وأعيد تقسيمه بناء على :
سينتج لدي قسم أول هو حرف وقسم ثاني مجموعة حروف
بناء على كل حرف أيسر أقوم بمعالجة الجزء الأيمن
فمثلا من أجل الحرف F والذي يمثل Flags أقرأ الجزء الأيمن حرف حرف وكل حرف يمثل قيمة لخاصية ما كمثال وجود الحرف R يعني أن الخاصية IsReadOnly قيمتها true
والحرف D وأعني بها Default لاسترجاع قيم افتراضية و في مثالنا T يعيد القيمة true و ربما يكون 0 وربما تاريخ اليوم حسب الرمز الأيمن
بينما من أجل الحرف C ويمثل Converter
فأعتبر جزؤه الأيمن كلمة واحدة تمثل اسم نوع مثلا B2V أعني بها فئة BooleanTwoVisibility
وهكذا
بنفس التشبيه ولكن على نطاق بسيط يمكنك تخيل كيف يتم بناء لغة وسمية ومفسر لها
التعليقات