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 أو حتى عمل ملف تنفيذي لنظام آخر غير لينكس.
تلميح
لعمل نص بلغة تفسيرية كل ما عليك فتح محرر نصوص ثم وضع شابانغ
#!
متبوعة بمسار البرنامج المفسر في بداية البرامج مثلا
#!/bin/bash
لتدل على أن هذا الملف مكتب بلغة bash
واذا كنت لا تعرف المسار إلى المفسر اكتب
#!/bin/env
متبوعة باسم البرنامج المفسر في بداية البرامج مثلا
#!/bin/env wish
تلميح
عادة لن تحتاج لبيئة تطوير إذا استخدمت
محرر نصوص قوي مثل emacs أو vim أو إذا كنت لا تجيدها فإني أرى أن تستخدم
برنامج kate انه محرر نصوص رائع وسهل وراقي
أهم مزاياه أنه يوفر تلوين للنص (البرنامج) بحسب نوعه ويمكنه تقسيم البرنامج
إلى وحدات منسقة في شجرة
اضافة إلى وجود سطر للأوامر لتجريب البرنامج
أو تصنيفه وغيرها من العمليات
- لغة bash
لغة سطر الأوامر في لينكس تعتبر سهلة لأنك ببساطة تعرف هذه الأوامر
وكل ماعليك هو تريكيبها معا وعمل برنامج
- لغة tcl/tk
لغة برمجة متواضعة وبسيطة يمكن عمل برامج رسومية بها
خصوصا إذا استعملت برامج visual tcl
ولكنها تظل بسطية جدا وسطحية
أهم تطبيق لها هو امكانية استدعائها من داخل
لغة السي مما يسمح لك بتطور برنامج لعمل macro
أو إذا كنت تعمل مستويات في لعبة ممكن أن
تجعل كل شخصية تتحرك بمنطق معين بهذه اللغة
أنا لا أنصح بهذه اللغة كلغة للتطوير (مجرد رأي)
- لغة perl
لغة أكثر ما يميزها قدرتها على معالجة النصوص
عبر التعابير العادية "Regular Expretions"
لهذا تعتبر من تقاليد لينكس إذ تأتي كخيار إجباري في
معظم التوزيعات وتستخدم لتعديل ملفات الإعدادات
وهي من لغات برمجة الإنترنت
ويمكن لهذه اللغة أن تقوم بالكثير من الأشياء
وهي أيضا سهلة ويمكن لأي كان أن يتعلمها
وهي لغة برمجة كينونية
- لغة python
لغة برمجة موجهة للكائنات
مما يزيد من سهولتها ويمكن لأي كان أن يتعلمها
وهي اللغة التي تستعملها ريدهات لعمل برامج الإعداد
يعمل مفسر اللغة على توليد ملف compiled python script ذات الإمتداد .pyc
عند أول تشغيل (وعند أي تعديل) مما يجعلها تعمل بسرعة أكبر في المرات القادمة.
ولها بيئات تطوير مثل
PythonCard.
أنصح بأن تكون مراحل التطوير الأولى لأي مشروع بهذه اللغة لتوفير
الوقت الذي تستتهلكه عمليات التصنيف المتكررة.
- لغة ruby
لغة برمجة تفسيرية موجهة للكائنات (irb واجهتها التفاعلية)
- لغة php
لغة برمجة تستخدم بشكل أساسي لعمل صفحات الإنترنت
وأن تكون واجهة للتعامل مع قاعدة بيانات mySQL
ولكن يمكن عمل برامج أخرى بها
- لغة java
لغة سهلة يمكنها عمل برامج تطبيقية وبرامج للإنترنت
وهي لغة تفسيرية موجهة للكائنات
وهي لغة قياسية تعمل على أكثر من جهاز وأكثر من
شركة تنتج المصنف الخاص بها وهي لغة تفسيرية
ولكنها تنتج byte-code أو ما يسمى virtual machine code
مما يفترض أن يجعلها تعمل أسرع من للغات التفسيرية الأخرى
من مصنفاتها gnu-java و kaffe وهناك j2sdk من شركة sun الذي يفضله غالبية مبرمجي جافا.
- لغة C/C++
لغة البرمجة المفضلة لدى مبرمجي لينكس
وتعتبر C أفضل لغة برمجة على الإطلاق
وهي لغة برمجة هيكلية
ولكن إذا أردت البرمجة الكينونية فعليك ب
C++
- لغة ForTran
لغة قديمة صعبة وتستخدم عادة لأغراض التحليل العددي
وحاليا استبدلت بشكل كامل بلغة C
- لغة Pascal
لغة قوية ولكن ليست شائعة في عالم لينكس
ولكنها موجودة
وهناك مصنفان لها FreePascal و GNUpascal
ولعمل برامج رسومية GUI لديك الخيارات
- kylix
مكتبة وبيئة تطوير متكاملة يمكن تنزيلها مجانا
من Borland
- lazarus
بيئة تطوير متكاملة تشبه Delphi
- لغة Basic
لا تستغرب إذا قلت لك أن فيروس أحب إلى مبرمج لينكس من لغة basic
وعلى الرغم من ذلك يوجد بعض لغات بيسك في لينكس مثل
kbasic و
hbasic
والأفضل هو gambas
وعادة لاتأتي مثل هذه البرامج مع توزيعات لينكس
ولا تتوقع أن تأتي في المستقبل
- لغات الذكاء الصناعي Lisp مثل rep
و Prolog مثل gprolog
تلميح
تتقول أحد الطرائف أن البرمجة دون 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 تستخدم
هذه في أحيان وتلك في أحيان أخرى
والمميز في البرمجة الكينونية هو الوراثة أو الإشتقاق أي بناء أنواع جديدة
من أخرى وذلك بأن تأخذ كل ما فيها وتضيف عليها مثلا الزر هو مربع وزيادة
|