المعلوماتية > برمجيات
اللغات النصية ولغات البرمجة - الجزء الثاني
اللغات النصية:
تقدّم اللغاتُ النصية نمطاً برمجياً مختلفاً عن لغات برمجة النظام. ومن أشهر الأمثلة على هذه اللغات بيرل (Perl) وبايثون(Python) وفيجوال بيسك (Visual Basic) ويونيكس شيل (Unix Shells). وتفترض هذه اللغات كما ذكرنا سابقاً وجود مجموعةٍ من المكونات المفيدة المكتوبة بلغاتٍ أخرى، فهي لاتهدف إلى بناء التطبيقات من الصفر، بل تسعى في المقام الاول إلى الربط بين هذه المكونات. فعلى سبيل المثال، تُستعمل لغة فيجوال بيسك لترتيب المجموعات لمتحكّمات واجهة المستخدم على الشاشة، كما تُستعمل نصوص يونيكس شيل لتجميع برامج الترشيح ضمن أنابيب. فاللغات النصية تستعمل غالباً من أجل توسيع خصائص المكونات وليس الهدف منها كتابة البرامج المعقّدة وبنى المعطيات. ويطلق على هذه اللغات أحياناً اسم لغات الصمغ أو لغات تكامل النظام.
وتميل هذه اللغات لأن تكون ضعيفة الكتابة من أجل تبسيط عملية ربط المكونات، ففي الفيجوال بيسك على سبيل المثال، قد يحمل المتحول سلسلةً محرفيةً في لحظةٍ ما ثم رقماً صحيحاً في لحظةٍ أخرى. فاللغة ضعيفة الكتابة تسهّل ربط المكونات بسبب عدم وجود قيودٍ مسبقةٍ على طريقة عمل الأشياء. كما أن جميع المكونات والقيم ممثّلةٌ بشكلٍ موحّد ولذلك يمكن استعمال أيٍّ منها في أي موضع، ففي يونيكس شيل، تقوم جميع برامج الترشيح بقراءة سيلٍ من البايتات من مصدر دخلٍ وكتابة سيلٍ من البايتات إلى مصدر خرجٍ، ويمكنُ لأي برنامجين أن يتصلا مع بعضهما عن طريق ربط خرج الأول مع دخل الثاني.
مثال: يقوم الأمر التالي الخاص بيونيكس شيل بتكديس ثلاثة مرشحات واستعمالها من أجل معرفة عدد السطور الحاوية على كلمة "scripting" ضمن النص المختار:
select | grep scripting | wc
بحيث يقوم برنامج select بقراءة النص المحدد وطباعته كخرج، ويقوم برنامج grep بقراءة الدخل (وهو خرج برنامج select) ويعطي خرجاً مساوياً للسطور الحاوية على كلمة “scripting”، ليقوم بعدها البرنامج wc بأخذ الخرج السابق كدخلٍ له وعدّ الأسطر الحاوية على الكلمة المطلوبة وإعطاء هذا العدد كخرجٍ نهائي. ومن الممكن استعمال أي من البرامج الثلاثة السابقة في عدد كبير من الحالات لتنفيذ الكثير من المهمّات المختلفة.
طبيعة لغات برمجة النظام وقوة كتابتها لاتشجّع إعادة الاستخدام، وهذا المثال المكتوب باستخدام Tcl وهي لغة نصية يوضّح الفائدة من ضعف الكتابة في اللغات النصية:
button .b -text Hello! -font {Times 16} -command {puts hello}
يقوم هذا النص ببناء زر يعرض سلسلةً نصية باستخدام الخط Times وبحجم 16 نقطة، كما يتم عرض رسالةٍ قصيرة عندما يقوم المستخدم بالضغط على الزر. ونلاحظ وجود ستة أنواعٍ مختلفةٍ من الأشياء ضمن عبارةٍ واحدة وهي:
اسم الأمر وهو button.
التحكم بالزر وهو .b.
أسماء الخصائص وهي text وfont وcommand.
سلاسل بسيطة وهي Hello! وhello.
اسم الخط وهو {Times 16} ويتضمن مايدعى typeface name وهي التصميم الخاص بنوع خطٍ معين أي أن الـtypeface name في هذه الحالة هو Times بالإضافة لحجم الخط مقاساً بالنقط points والبالغ 16 نقطة.
نص Tcl وهو puts hello.
ومن الممكن استخدام هذه الخصائص بأي ترتيبٍ كان، وفي حال عدم ذكر إحدى الخصائص فإنها تأخذ القيمة الافتراضية ففي هذا المثال هناك أكثر من 20 خاصة تُركت من دون تحديد.
ومن أجل القيام بماسبق باستخدام لغة الجافا، سوف نحتاج إلى رمازٍ بطول سبعة أسطر ضمن أداتين. أما في حال استخدام سي بلس بلس C++ فالأمر يلزم 25 سطراً من الرماز ضمن ثلاث إجرائيات. كما أن Tcl سمحت بتعريف سلوك الزر مباشرةَ عبر تضمينه ضمن أمر بناء الزر نفسه، في حين يتطلب ذلك ضمن الجافا أو سي بلس بلس C++ تعريف ذلك السلوك ضمن
أداة أو إجرائية منفصلة.
قد يعتقد البعض أن طبيعة الكتابة الضعيفة للغات النصية لا تكشف الأخطاء، ولكن توضَّح مع الممارسة أن اللغات النصية آمنة كلغات برمجة النظام. ففي المثال السابق سينتج خطأ فيما لو قام المبرمج بإسناد قيمةٍ محرفيةٍ مثل xyz عوضاً عن رقمٍ صحيح إلى حجم الخط، ولكن الفرق هو أن اللغات النصية تقوم بالتحقّق من الأخطاء في آخر لحظةٍ ممكنة وهي لحظة استعمال المتحول، في حين تقوم لغات البرمجة بذلك خلال زمن الترجمة، ويتم تجنّب كلفة التحقق خلال زمن التنفيذ. ولكن ماتقوم به لغات البرمجة يكلّف رمازاً أطول وفعالية أقل بسبب القيود المفروضة على كيفية استخدام المعلومات.
تمثل الصورة السابقة مقارنةً مابين لغات التجميع ولغات البرمجة واللغات النصية من حيث درجة قوة الكتابة بالنسبة للتعليمات أو العبارات البرمجية.
من الاختلافات الأساسية الأخرى هي أن اللغات النصية تخضع للتفسير (interpreting)، في حين تتم ترجمة لغات البرمجة (compiling). ولكن ماهو الفرق مابين الترجمة والتفسير؟
يتم في اللغة المترجمة ترجمة تعليمات اللغة مباشرةً من قبل المترجم إلى رمازٍ خاص بالآلة الهدف ويدعى رماز الآلة machine) code)، وهو رمازٌ موجّه إلى معالجٍ ونظام تشغيلٍ معيّنين. أما في التفسير، فلا يتم تشغيل الرماز المصدري مباشرةً من قبل الآلة الهدف بل يقوم برنامج آخر وهو المفسّر بقراءة الرماز المصدري الأصلي ومن ثم تنفيذه، فعلى سبيل المثال وفي حال وجود عملية ضرب * ضمن رمازك فإن المترجم سيحوّلها مباشرةً إلى تعليمة multiply الخاصة بالآلة. في حين سيقوم المفسّر بتحويلها إلى تابع الضرب المعرّف ضمنه وقد يكون اسمه التابع x ليقوم التابع x بعد ذلك بتنفيذ التابع multiply الخاص بالآلة.
فاللغات المفسّرة تؤمن التحوّل السريع أثناء عملية التطوير كما أنها تزيد من مرونة التطبيقات عن طريق السماح للمستخدمين بكتابة برامجهم خلال زمن التنفيذ.
وعلى الرغم من هذه الفوائد، إلا أن اللغات النصية تعدّ أقل كفاءةً من لغات برمجة النظام لأنها تعتمد على التفسير عوضاً عن الترجمة، بالإضافة لأنها تعتمد في اختيار مكوّناتها على القوة وسهولة الاستخدام عوضاً عن التفكير في العتاد المستخدم ومحاولة الربط معه. فاللغات النصية مثلاً تستعمل السلاسل متغيرة الطول، في حين تعتمد لغات البرمجة على القيم الثنائية المناسبة لحجم الكلمة الواحدة في الآلة.
ولكن ولحسن الحظ فإن الأداء ليس بمشكلةٍ كبيرة بالنسبة للغات النصية لأن تطبيقاتها أصغر من تطبيقات لغات البرمجة، كما أن أداء البرامج النصية يعتمد على أداء المكوّنات الموجودة ضمنه، والتي تكون مكتوبةً باستخدام لغات برمجة النظام.
تعدّ اللغات النصية ذات مستوىً أعلى من لغات برمجة النظام، لأن متوسط العمل الذي تقوم به عبارةٌ نصيةٌ واحدةٌ يكون أكبر، ومن الممكن أن تنفّذ عبارةٌ نصيةٌ واحدةٌ المئات لا بل الآلاف من تعليمات الآلة، في حين تنفذ العبارة البرمجية مايقارب خمسَ من تعليمات الآلة.
فاللغات النصية كما رأينا تستعمل في ربط التطبيقات، كما أنها تؤمّن مستوىً أعلى من لغات التجميع ولغات البرمجة، وهي أضعف كتابةً من لغات البرمجة المعتمدة على صرامة القيود المعرّفة بالإضافة إلى اعتمادعا على التفسير، فهي تضحي بسرعة
الأداء من أجل الوصول إلى سرعة التطوير.
----------------------------
حاشية المحتوى:
* لغات التجميع: هي لغات برمجة من المستوى الأدنى، تحوي مراسلاتٍ قوية بينها وبين تعليمات ترميز الآلة الخاصة بالبنية العتادية للحاسوب.
----------------------------
المراجع: