6.1 لغات البرمجة كتاب لينكس الشامل >>

6.1 لغات البرمجة

مقدمة

هناك العديد من لغات البرمجة منها ما يمكن للمستخدم العادي الكتابة بها ومنها ما يقتصر على المحترفين ولتسهيل اختيار اللغة يمكنك قراءة هذا الملخص، لغات المستوى الراقي منها اللغات التفسيرية وهي التي لا يقوم برنامج اللغة بتحويل النص من هذه اللغة إلى لغة الألة وإنما يبقى النص بصيغتيه النصية ويسمى script وعند تشغيل هذا النص يقوم برنامج المفسر بإعراب هذا النص أمراً أمراً، وتنفيذة واحداً تلو واحد وفي كل مرة تنفذه فيها تعاد هذه العملية أو وفي أحسن الأحوال ينقل إلى صيغة مكثفة compiled script تختزل بعض عمليات الإعراب ولكن لا يتحول النص إلى لغة الآلة بل إلى ملف ثنائي يسمى byte code وهو عبارة عن سلسلة من تعليمات بلغة الآلة الإفتراضية (آلة وهمية) VM ويكون هناك مفسر يسمى الآلة الإفتراضية يتم استدعاؤه في كل مرة يتم تنفيذ البرنامج فيها حيث يقوم بالتحويل من الآلة الفتراضية إلى الحقيقية. ويكون تنفيذ هذا byte code أسرع من النص script ويعتبر تتبع الأخطاء في اللغات التفسيرية أمرا سهلا لأنها تنفذ سطرا فسطر. من الأمثلة على هذه اللغات bash و perl و python و php التي تتداول برامجها على شكل نصي script وهناك نوع من هذه اللغات python مثلاً يحول يمكنه تحويل النص إلى لغة آلة وهمية افتراضية لكسب المزيد من السرعة ولكن أشهر تلك التي تتداول بشكل ثنائي غير نصي هي جافا java ولغة visual basic على الرغم مما يقال إلا أنها تفسيرية لأن الملف التنفيذي هو عبارة عن ملف يقوم باستدعاء الآلة الإفتراضية msvbvm60.dll مثلاً التي تتابع عملية تفسير البرنامج. وعلى الرغم من كل شيء تظل هذه اللغات بطيئة إلا أنها تمتاز بأنها ستعمل على أي منصة على أي نظام تشغيل إذا وجد المفسر الخاص بها على ذلك النظام وهي فلسفة هكذا لغات "Write once run every where." أي أن تكتبه مرة واحدة وتنفذه أينما كان . وعلى النقيض من ذلك توجد اللغات التي تعطي ملف بلغة الآلة مباشرة مثل لغة C/C++ وتسمى عملية تحويل ملف من الكود المصدر (الملف النصي) إلى لغة الآلة تصنيف compiling ويكون البرنامج الناتج أسرع ما يكون خصوصا إذا كنت تستعمل مصنف gcc الذي يمكنه تحسين optimization أي زيادة سرعة برامجك أو تقليل حجمها ويمكنه استغلال كافة تعليمات معالج معين ولكن لغة C/C++ ليست للهواة. الهدف الأسمى في اللغات التصنيفية الجيدة و القياسية هو تحقيق العبارة الشهيرة "Write once, compile every where." أي أن تكتبه مرة واحدة وتصنفه أينما كان. (يمكن استعمال مصنف gcc في ويندوز بطريقتين أولهما هو مصنف minigw وهو جزء صغير من gcc ولكن يستعمل مكتبات MSVC لهذا فهو صغير الحجم ولكن أقل توافقية والثانية باستعمال cygwin بمكتبة glibc من GNU وهو أكبر بالتأكيد ولكن لن تحتاج لتعديل الكود انظر www.cygnus.com/misc/gnu-win32 و http://sourceware.cygnus.com/cygwin وبالحصول على الملف المصدري لمكتبات مثل gtk+ فإنك تستطي تصنيف بعض برامج لينكس في ويندوز)

هناك ميزة في gcc تسمى cross compiling أي أنك تستطيع تصنيف برامج لمعالج آخر (مثلاً المعالج الخاص بأجهزة PDA أو الخلويات) باستعمال جهاز IA أو حتى عمل ملف تنفيذي لنظام آخر غير لينكس.

tipتلميح

لعمل نص بلغة تفسيرية كل ما عليك فتح محرر نصوص ثم وضع شابانغ #! متبوعة بمسار البرنامج المفسر في بداية البرامج مثلا #!/bin/bash لتدل على أن هذا الملف مكتب بلغة bash واذا كنت لا تعرف المسار إلى المفسر اكتب #!/bin/env متبوعة باسم البرنامج المفسر في بداية البرامج مثلا #!/bin/env wish

tipتلميح

عادة لن تحتاج لبيئة تطوير إذا استخدمت محرر نصوص قوي مثل emacs أو vim أو إذا كنت لا تجيدها فإني أرى أن تستخدم برنامج kate انه محرر نصوص رائع وسهل وراقي أهم مزاياه أنه يوفر تلوين للنص (البرنامج) بحسب نوعه ويمكنه تقسيم البرنامج إلى وحدات منسقة في شجرة اضافة إلى وجود سطر للأوامر لتجريب البرنامج أو تصنيفه وغيرها من العمليات

tipتلميح

تتقول أحد الطرائف أن البرمجة دون FORTRAN أو COBOL مثل شوكولاتة دون كتشب أو خل. (هذا ليس مديحاً لهما طبعاً)

لغات C/C++ و perl و python و php كل هذه اللغات قادرة على عمل برامج رسومية عن طريق مكتبات مثل gtk و qt أو tk.

لديك أيضا بيئات تطوير متكاملة رسومية IDE مثل kdevalop وهو يأتي مع أغلب التوزيعات وهو يوفر طريقة جيدة لإدارة المشاريع الكبيرة ويوفر نظام مساعدة يبدأ معك من الصفر فيشرح أساسيات C/C++ ويسترسل في الشرح إلى الأمور المتقدمة وإذا أردت ما هو أخف منه ليناسب المشاريع الصغيرة لديك anjuta وهو صغير يمكنك تنزيله ولدينا برامج تصميم واجهات رسومية مثل glade و glade2 الذي يعطي بلغة C/C++/perl/python وغيرها بطريقة gnome على مكتبة GTK وهناك برنامج لتصميم الواجهات الرسومية بطريقة KDE أي على مكتبة QT اسمه ‎Qt3 Designer هما يأتيان مع أغلب التوزيعات. الطريقة الأكثر شيوعاً هي استعمال محرر نصوص قوي وليس بيئة تطوير إذا كنت لم تألف أياً منها استعمل kate

الطريقة التي سأتبعها هي بأن أشرح اللغات مفترضاً متلقي عنده معرفة مسبقة بالبرمجة بلغات غير التي أشرح عنها وأقدم شرح تفصيلي في لغة السي فإذا لم تكن ليديك معرفة مسبقة قد تحتاج لتقرأ فصل السي من هذا الكتاب أو تستعين بكتب أخرى وسيكون بقية هذا الفصل لشرح مبادئ عامة ونظرية عن البرمجة مشتركة في اللغات المختلفة

إن أبسط طرق البرمجة هي سرد الأوامر في سلسلة متتالية يتم تنفيذ الأول ثم الثاني .. إلا إذا حددنا في البرنامج قفزات أو حلقات تكرارية أو جمل اختيار البدائل والجمل الشرطية عندها يغير البرامج مجراه ثم يعود لتنفيذ الأوامر واحدا فواحد وهذه الطريقة سهلة في البرامج البسيطة ولكن في البرامج المعقدة يصبح السرد طويلا جدا لذا جاءت طريقة البرمجة الهيكلية ففي اللغات الهيكلية يكون البرنامج أقسام يكون أحدها قسما رئيسياً يتم تنفيذه أولا، هذا القسم يستدعي أقسام أخرى والأقسام الأخرى تستدعي أخرى وهكذا نسمي الأقسام وظائف functions أو برامج فرعي subroutine ويمكن لهذه الوظائف أن تأخذ معطيات وتعطينا ناتج أو حل المسألة الفرعية نسمي المعطيات معاملات arguments أو parmeters ونسمي القيمة التي يعيدها return value، وبهذا تقسم المسألة المطلوب من البرنامج حلها إلى مسائل أبسط حتى نصل إلى عدد من المسائل التي نعرف كيف نحلها انظر هذا المثال بلغة وهمية

# لإيجاد مساحة المستطيل
# البرنامج الرئيسي
# 1- رحب بالمستخدم واسأله عن الأبعاد
print_hello
# 2- خذ منه قيم عن الأبعاد في المتغيرين  w,h
get_input(w,h)
# 3- احسب المساحة
a=calcArea(w,h)
# 4- اطبع الجواب
print a
# انتهاء البرنامج
exit
# ================
# البرنامج الفرعي لكتابة السؤال
function print_hello
	print "Hello ,welcome to ..."
	print "enter the width and height"
end
# احسب المساحة
function calcArea(w,h)
	return w*h
end
# أخذ المساحة
function get_input(w,h)
	input w,h
end
# ... وهكذا ...

لاحظ أننا إذا قسمنا المسألة إلى مسائل أبسط نظل بحاجة إلى نقطة نهاية أي أبسط شيء في المرحلة الأخيرة علينا أن نستدعي شيئا لم نكتبه نحن وهذا ما يسمى بالمكتبة فأنت لن تكتب تفاصيل كل شيء وإنما تبني على أوامر موجودة في اللغة تسمى كلمات مفتاحية keywords أو تستدعي مكتبات كتبها غيرك أو تستدعي نظام التشغيل

وتمكننا البرمجة الهيكلية من حل مسائل لا نعرف حلها بطريقة الإستدعاء الذاتي recursion حيث تقوم الوظيفة باستدعاء نفسها مع معاملات مختلفة وهي المعادلات التي تكتب بالصيغة تعتمد فيها على نفسها ونضع لها نقطة بداية كما في المثال التالي (متسلسلة فابانسي)

An=An-1+An-2
A0=1
A1=1
مثلا احساب A5
A5=A4+A3
الآن يجب أن نحسب A4 و A3
لذا نستدعي نفس العلاقة لكن بوضع n بأربعة ثم بثلاث
A4=A3+A2
A3=A2+A1
A2=A1+A0=1+1=2
نعرف الآن A2 و A1 وهي التي تلزمنا لحساب A3
A3=A2+A1=2+1=3
نعرف الآن A3 و A2 وهي التي تلزمنا لحساب A4
A4=A3+A2=3+2=5
إذن
A5=A4+A3=5+3=8

يمكن أي يكون البرامج بالشكل التالي (بلغة وهمية)

function fa(n)
	if (n=1 or n=0) return 1
	else return fa(n-1)+fa(n-2)
end

هناك لغات مثل سي تجبرك على إعلان نوع المتغير مثل أن تقول أن A هي عدد صحيح و B نسبي وأن C مصفوفة من أعداد نسبية ، و D هو سلسلة من الحروف وهناك لغات لا تطلب ذلك وتحول الأنواع في ما بينها مما يسهل عليك ويجعل التنفيذ أقل سرعة مثل perl

ولكن حتى إذا جعلت برنامج منظماً ستضطر لكتابة البرامج من جديد إذا أردنا تطويره ليشمل فكرة أعم وفي البرامج الكبيرة يصبح لدينا الكثير من المتغيرات مثلا w ربما تعني عرض المستطيل أو عرض الشاشة ... الخ فتضطر إلى إعادة التسمية مثلا rectangle_width و area(w,h) ربما تصبح rectangle_area(rectangle_width,rectangle_height) ولكن عندها سيصبح الملف كبيرا جدا لحل هذه المشكلة ظهرة فكرة البرمجة الكينوية حيث هناك تعرف صنف class معين وتعرف ماذا له من خصائص properties أي متغيرات . وأفعال methods وهي نفسها الوظائف functions ويمكن أن تشترك هذه الخصائص في الاسم مع صنف آخر وتختلف في الطريقة مثلا المستطيل له مساحة والدائرة لها مساحة ولا داع لعمل أسماء طويلة مثل rectangle_area(rectangle_width,rectangle_height) و circle_area(radius) ولا داعي لأن تأخذ الطول والعرض لأنها من خصائص الكائن ، لذا فهي في جميع الأحوال area ثم تعرف كائن من هذا الصنف فيكون له هذه الخصائص والأفعال انظر هذا النص بلغة وهمية

# the is pseudo code 
class rectangle {
	integer w,h;
	integer area() {return w*h};
}
rectangle rect1;
rect1.w=10;
rect1.h=15;
print rect1.area();

لاحظ أننا استعملنا النقطة . بعد الكائن للوصول إلى خصائصه وبعض اللغات تستخدم -> وبعضها مثل C تستخدم هذه في أحيان وتلك في أحيان أخرى

والمميز في البرمجة الكينونية هو الوراثة أو الإشتقاق أي بناء أنواع جديدة من أخرى وذلك بأن تأخذ كل ما فيها وتضيف عليها مثلا الزر هو مربع وزيادة


<< السابق كتاب لينكس الشامل التالي >>