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 انه محرر نصوص رائع وسهل وراقي أهم مزاياه أنه يوفر تلوين للنص (البرنامج) بحسب نوعه ويمكنه تقسيم البرنامج إلى وحدات منسقة في شجرة اضافة إلى وجود سطر للأوامر لتجريب البرنامج أو تصنيفه وغيرها من العمليات
.pyc
عند أول تشغيل (وعند أي تعديل) مما يجعلها تعمل بسرعة أكبر في المرات القادمة.
ولها بيئات تطوير مثل
PythonCard.
أنصح بأن تكون مراحل التطوير الأولى لأي مشروع بهذه اللغة لتوفير
الوقت الذي تستتهلكه عمليات التصنيف المتكررة.
C/C++
C++
تتقول أحد الطرائف أن البرمجة دون 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 تستخدم
هذه في أحيان وتلك في أحيان أخرى
والمميز في البرمجة الكينونية هو الوراثة أو الإشتقاق أي بناء أنواع جديدة من أخرى وذلك بأن تأخذ كل ما فيها وتضيف عليها مثلا الزر هو مربع وزيادة
<< السابق | كتاب لينكس الشامل | التالي >> |