المقدمةالفهرسالتالي

الفصل 1

مسار البرنامج

 

إن الغرض من هذا الكتاب هو تعليمك كيفية التفكير كعالم كمبيوتر. أنا أحب طريقة تفكير علماء الكمبيوتر لأنهم يجمعون بين أفضل المزايا الموجودة لدى الرياضيين، المهندسين، وعلماء الطبيعة. مثل علماء الرياضيات، يستخدم علماء الكمبيوتر اللغات الاصطلاحية والرموز للتعبير عن الأفكار (وخصوصاً الحسابات). مثل المهندسين، يصممون أشياء و يجمعون المكونات لتؤلف نظماً. مثل علماء الطبيعة، يلاحظون سلوك الأنظمة المعقدة، يبنون فرضيات، ويختبرون التوقعات.

إن المهارة الأكثر أهمية لأي عالم كمبيوتر هي حل المشكلات. وبهذا أنا أعني القدرة على صياغة المشاكل، والتفكير الإبداعي في الحلول، ثم التعبير عن الحل بوضوح ودقة. كما اتضح فإن تعلم البرمجة هو فرصة ممتازة للتدرب على مهارات حل المشاكل.

على أحد الأصعدة، ستتعلم كيف تبرمج، وهي مهارة مفيدة بحد ذاتها. وعلى صعيد آخر، ستستخدم البرمجة كوسيلة توصلك إلى نهاية. عندما نتقدم في هذا الكتاب، ستتوضح لك تلك النهاية أكثر فأكثر.

1.1 ما هي لغة البرمجة؟

إن لغة البرمجة التي ستتعلمها هي Java، وهي حديثة نسبياً (أطلقت شركة Sun الإصدار الأول في أيار/مايو، 1995). Java هي مثال عن اللغات عالية المستوى (High-level languages)؛ من اللغات عالية المستوى الأخرى التي قد تكون سمعت بها Perlو ،C++ أو C ،Python.

كما هو واضح من الاسم لغات عالية المستوى؛ هناك أيضاً لغات منخفضة المستوى (low-level languages)، والتي تدعى أحياناً بلغات التجميع (assembly language) أو لغة الآلة (machine language). يمكن القول أن الحواسيب تستطيع تنفيذ البرامج المكتوبة في اللغات منخفضة المستوى فقط. وبالتالي، يجب ترجمة البرامج المكتوبة باللغات عالية المستوى قبل أن نتمكن من تشغيلها. هذه الترجمة تأخذ بعض الوقت، وهي خسارة بسيطة تسببها اللغات عالية المستوى.

لكن المزايا كثيرة. أولاً، من الأسهل بكثير أن نكتب برنامجاً بلغة عالية المستوى؛ وبكلمة "أسهل" أنا أعني أن البرنامج يأخذ وقتاً أقصر لكتابته، ومن الأسهل والأسرع قراءته، ومن المرجح أكثر أن يكون صحيحاً. ثانياً، البرامج المكتوبة باللغات عالية المستوى محمولة، بمعنى أنها تستطيع أن تعمل على أنواع مختلفة من الحواسيب بمجرد عمل تعديلات بسيطة أو بدون أي تعديلات. البرامج المكتوبة باللغة منخفضة المستوى يمكنها أن تعمل على نوع واحد فقط من الحواسيب، ويجب إعادة كتابتها قبل أن نستطيع تشغيلها على جهاز آخر.

تبعاً لهذه المزايا، كل البرامج تقريباً مكتوبة بلغات عالية المستوى. أما اللغات المنخفضة المستوى فيتم استخدامها في بعض التطبيقات الخاصة القليلة فقط.

هناك طريقتان لترجمة برنامج؛ التفسير (Interpreting) والتجميع (Compiling).
المفسر هو برنامج يقرأ البرنامج عالي المستوى وينفذ المكتوب. في الواقع، يقوم المفسر بترجمة البرنامج سطرا بعد آخر، أي أنه يقرأ السطور وينفذ الأوامر.

المجمع (أو المترجم Compiler) هو برنامج يقوم بقراءة برنامج عالي المستوى ويترجمه كله دفعة واحدة، قبل تنفيذ أية تعليمة. غالباً ما نقوم بتجميع البرنامج كخطوة مستقلة، وبعد ذلك ننفذ الشفرة المترجمة (compiled code) لاحقاً. في هذه الحالة، يطلق على البرنامج عالي المستوى اسم الشفرة المصدرية (source code)، ويدعى البرنامج المترجم بالشفرة الهدف (object code) أو الملف التنفيذي (executable).

لغة Java غير تقليدية لأنها لغة مجمّعة ومفسرة بنفس الوقت. بدلاً من ترجمة برامج Java إلى لغة الآلة، يولد مجمع Java شفرة Java byte. شفرة بايت سهلة (وسريعة) عند التفسير، مثل لغة الآلة، لكنها محمولة أيضاً، مثل لغة عالية المستوى. وهكذا، يمكننا تجميع برنامج Java على جهاز واحد، ثم ننقل شفرة بايت إلى جهاز آخر عبر شبكة، ثم نفسر شفرة بايت على الجهاز الثاني. هذه القدرة هي إحدى مزايا Java التي تتفوق بها على العديد من اللغات عالية المستوى الأخرى.

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

1.2 ما هو البرنامج؟

البرنامج هو مجموعة من التعليمات المتتابعة التي تحدد كيفية عملية حسابية . العملية الحسابية قد تكون رياضية، مثل حل جملة معادلات أو إيجاد جذور كثير حدود، لكن قد تكون أيضاً معالجة رمزية، مثل البحث عن نص واستبداله في مستند أو (غريب بما يكفي) تجميع برنامج آخر.

التعليمات (statements) تبدو مختلفة بين لغات البرمجة المختلفة، لكن توجد بعض الدوال الأساسية التي يمكن لجميع لغات البرمجة تنفيذها تقريباً:

الإدخال (input): الحصول على المعطيات من لوحة المفاتيح، ملف، أو جهاز آخر.
الإخراج (output): عرض البيانات على الشاشة، أو إرسالها إلى ملف أو جهاز آخر.
الحساب (math): تنفيذ العمليات الحسابية الأساسية مثل الجمع والضرب.
الاختبار (testing): التحقق من شروط معينة وتنفيذ التعليمات المناسبة لكل حالة.
التكرار (repetition): تنفيذ عمل ما بصورة متكررة، عادة مع وجود تغيير.

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

1.3 ما هو التنقيح؟

البرمجة هي عملية معقدة، ولأنها تتم بوساطة البشر، فهي غالباً ما تقود إلى أخطاء. لأسباب غريبة، تدعى الأخطاء البرمجية bugs (حشرات أو جراثيم) وعملية ملاحقتها وتصحيحها تدعى debugging. هناك عدة أنواع مختلفة من الأخطاء التي يمكن أن تحدث في برنامج، ومن المفيد أن نميز بينها في سبيل القبض عليها أسرع.

1.3.1 الأخطاء النحوية

لا يمكن للمجمع أن يترجم البرنامج إلا إذا كان صحيحاً نحوياً؛ وبخلاف ذلك، تفشل عملية الترجمة ولن تكون قادراً على تشغيل برنامجك. النحو (Syntax) يشير إلى بنية البرامج و قواعد كتابة تلك البنية.

مثلاً، في اللغة الإنكليزية، يجب أن تبدأ الجملة بحرف كبير وأن تنتهي بنقطة. بالنسبة لمعظم القراء، بعض الأخطاء النحوية ليست بمشكلة ذات اعتبار، لهذا السبب تجدنا نقرأ شعر e e cummings بدون أن نطلق رسائل أخطاء.

المترجمات ليست بذات القدر من التسامح. إذا وجد خطأ نحوي واحد في أي مكان من برنامجك، سيطبع المترجم رسالة خطأ ويتوقف، ولن تتمكن من تشغيل برنامجك.

ولنعقد الموضوع أكثر، فإن القواعد النحوية في Java أكثر منها في اللغة الإنكليزية، ورسائل الخطأ التي تتلقاها من المترجم ليست مفيدة على الأغلب. خلال الأسابيع الأولى من عملك في البرمجة، غالباً ما ستقضي الكثير من الوقت تبحث عن الأخطاء النحوية. على الرغم من ذلك، فإنك سترتكب أخطاءً أقل وستجدها أسرع عندما تكتسب المزيد من الخبرة.

1.3.2 أخطاء وقت التشغيل

النوع الثاني من الأخطاء هي الأخطاء عند التشغيل، وقد تمت تسميتها كذلك لأنها لا تظهر قبل تشغيل البرنامج. في Java، تظهر أخطاء وقت التشغيل عندما يشغل المفسر شفرة byte ويحدث خطأ ما.

الخبر الجيد الآن هو أن Java لغة آمنة نوعاً ما، ما يعني أن المجمع يقبض على العديد من الأخطاء. لذلك فإن أخطاء وقت التشغيل نادرة، وخاصة بالنسبة للبرامج البسيطة.

في Java، تدعى أخطاء وقت التشغيل بالاستثناءات (exceptions)، وفي معظم بيئات البرمجة تظهر بشكل نوافذ أو مربعات حوار تحتوي على معلومات عما حدث وما الذي كان البرنامج يفعله عند حدوث الخطأ. هذه المعلومات مفيد عند تنقيح البرنامج من الأخطاء.

1.3.3 الأخطاء المنطقية

النوع الثالث من الأخطاء هو الخطأ المنطقي أو الدلالة الخاطئة. إذا وجد خطأ منطقي في برنامجك، فستتم ترجمته وتشغيله بنجاح، بمعنى أن الكمبيوتر لن يعطي أي رسائل خطأ، لكنه لن يقوم بالعمل كما يجب. بل سينفذ شيئاً آخر. سيقوم البرنامج بتنفيذ ما طلبته منه حرفياً.

البرنامج الذي كتبته لم يكن البرنامج الذي ترغب فيه. معنى البرنامج (أو ما يدل عليه) خاطئ. معرفة مكان وقوع الخطأ المنطقي قد يتطلب البراعة، ذلك لأنها تتطلب منك العمل بالمقلوب تنظر إلى مخرجات البرنامج وتحاول استنتاج ما يفعله.

1.3.4 تصحيح الأخطاء بالتجريب

أحد أهم المهارات التي يجب عليك اكتسابها أثناء العمل مع هذا الكتاب هو تصحيح الأخطاء (debugging). وبالرغم من أنه محبط، فهو من أكثر أجزاء البرمجة تحدياً، ويتطلب ذكاء ومهارة.

أحياناً يكون اكتشاف الأخطاء مثل عمل التحري. تجد الأدلة ويجب عليك أن تحزر العمليات والأحداث التي أدت إلى النتائج التي تراها.

تصحيح الأخطاء أيضاً يشبه العلوم التجريبية. بمجرد أن تظن أنك عرفت ما هو الخطأ تعدل برنامجك وتجرب ثانية. إذا كان حدسك صحيحاً، عندئذ ستتمكن من التنبؤ بنتيجة التعديل، وتقترب خطوة من البرنامج الصحيح المطلوب. إذا كان حدسك خاطئاً، عليك أن تجد حلاً آخر. وكما يقول (شرلوك هولمز) ، "بمجرد أن تستبعد المستحيل، فإن ما يبقى، مهما كان بعيد الاحتمال، لا بد أن يكون الحقيقة". (من The Sign of Four للكاتب A. Conan Doyle)

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

مثلاً، نظام التشغيل لينوكس الذي يحتوي على آلاف الأسطر البرمجية، بدأ كبرنامج بسيط استعمله (لينوز تورفالدز) ليستكشف رقاقة إنتل 80386. وعلى حد قول (لاري غرينفيلد)، "أحد أولى مشاريع لينوز كان برنامجاً يبدل بين طباعة AAAA و BBBB. ثم تطور هذا إلى لينوكس" (من The Linux Users' Guide Beta Version 1).

في الفصول اللاحقة سأبدي المزيد من الاقتراحات عن تصحيح الأخطاء وغيرها من الخبرات البرمجية.

1.4 اللغات الطبيعية واللغات الاصطلاحية

اللغات الطبيعية هي اللغات التي يتكلم بها الناس، مثل الإنكليزية، العربية و الفرنسية. لم يقم البشر بتصميم هذه اللغات (على الرغم من أنهم يحاولون فرض بعض القواعد عليها)؛ بل تطورت هذه اللغات طبيعياً.

اللغات الاصطلاحية هي لغات صممها الناس لتطبيقات مخصصة. مثلاً، الرموز التي يستخدمها الرياضيون لغة اصطلاحية وهي ملائم بصورة خاصة لتدوين العلاقات بين الأرقام والحروف. الكيميائيين يستعملون لغة اصطلاحية للتعبير عن البنية الكيميائية للجزيئات. وأهم شيء:

لغات البرمجة هي لغات اصطلاحية صممت للتعبير عن الحسابات (computations).

كما ذكرت سابقاً، اللغات الاصطلاحية لها قواعد نحوية صارمة. مثلاً، 3 + 3 = 6 عبارة رياضية صحيحة نحوياً، لكن 3 = +6$ ليست كذلك. أيضاً، H2O اسم مركب كيميائي صحيح نحوياً، لكن 2Zz ليس كذلك.

القواعد النحوية تأتي في صفتين غالبتين، قواعد الرموز وقواعد البنية. الرموز هي العناصر الرئيسية للغة، مثل الكلمات والأرقام والعناصر الكيميائية. أحد الأخطاء الموجودة في العبارة 3=+6$ هو أن $ ليس رمزاً رياضياً (على الأقل هذا ما أعرفه). بشكل مشابه، 2Zz ليس صحيحاً لعدم وجود عنصر يرمز له بالاختصار Zz.

النمط الآخر من الأخطاء النحوية مرتبط ببنية العلاقة؛ وهي الطريقة التي ترتب وفقها الرموز. بنية العبارة 3=+6$ غير صحيحة، لأنك لا تستطيع كتابة علامة الجمع بعد علامة المساواة مباشرة. أيضاً، الأرقام في الصيغ الجزيئية تأتي بعد اسم العنصر، وليس قبله.

عندما تقرأ جملة بالإنكليزية أو عبارة بلغة اصطلاحية، عليك معرفة بنية الجملة (برغم أن ذلك يحدث بدون وعي مع اللغات الطبيعية). هذه العملية تدعى إعراب.

ومع أن اللغات الطبيعية والاصطلاحية تملك العديد من المقومات المشتركة ─رموز، بنية، نحو، ومعاني─ إلا أن الاختلافات عديدة.

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

الحشو: في سبيل تفسير الغموض في اللغات الطبيعية والتقليل من سوء التفاهم، تحوي اللغات الطبيعية على الكثير من الإسهاب. كنتيجة لذلك فهي غالباً ما تكون محشوة. اللغات الاصطلاحية تكون أقل حشواً وأكثر إيجازاً.

الحرفية: اللغات الطبيعية ملئا بالمصطلحات والمجازات. اللغات الاصطلاحية تعني تماماً ما تقول.

إن الأشخاص الذين كبروا وهم يتحدثون لغة طبيعية (كل الناس) غالباً ما يواجهون صعوبة عن التحول إلى لغة اصطلاحية. بشكل أو بآخر فإن الاختلافات بين اللغات الطبيعية والاصطلاحية تشبه الاختلافات بين الشعر والنثر، ومع ذلك:

الشعر: يستعمل الكلمات لصوتها ورنتها كما لمعناها، والقصيدة بالكامل تعطي أثراً أو رد فعل عاطفي. الغموض ليس شائعاً فحسب بل هو متعمد.

النثر: المعنى الحرفي للكلمات أهم والبنية تشارك في إضافة المعاني. النثر أكثر قابلية للتحليل من الشعر، لكنه يظل غامضاً أحياناً.

البرامج: معنى برنامج الكمبيوتر واضح ولا يقبل الالتباس، ويتم فهمه التام بتحليل رموزه وبنيته.

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

1.5 البرنامج الأول

تقليدياً البرنامج الأول الذي يكتبه الناس بأي لغة برمجة جديدة يسمى "Hello, World" ─ (مرحباً، بالعالم). لأن كل ما يفعله هو طباعة الكلمات "Hello, World". في لغة Java، سيبدو هذا البرنامج كما يلي:

class Hello {

  // main: generate some simple output

  public static void main (String[] args) {
    System.out.println ("Hello, world.");
  }
}

هذا البرنامج يحتوي على العديد من المقومات التي يصعب شرحها للمبتدئين، لكنه يظهر "معاينة" لمواضيع سنراها بالتفصيل فيما بعد.

كل البرامج تتألف من تعاريف أصناف (class definitions)، التي تكتب بالشكل:

class CLASSNAME {
  public static void main (String[] args) {
    STATEMENTS
  }
}

هنا يشير CLASSNAME إلى اسم كيفي تختاره أنت. اسم الصنف في هذا المثال هو Hello.

main هي عملية (method)، أي مجموعة من العمليات لها اسم. الاسم main اسم خاص؛ يشير إلى المكان في البرنامج حيث يبدأ التنفيذ. عندما نشغل البرنامج، يبدأ بتنفيذ التعليمة الأولى في main ويتابع، بالترتيب، حتى يصل إلى التعليمة الأخيرة، عندها يتم الخروج من البرنامج.

يمكن أن تحوي main أي عدد من التعليمات، لكن المثال السابق يحوي تعليمة واحدة فقط. وهي تعليمة طباعة (print statement)، بمعنى أنها تقوم بطباعة رسالة على الشاشة. من المحيّر أن "اطبع" تعني أحياناً "اعرض شيئاً على الشاشة"، وأحياناً تعني "أرسل شيئاً إلى الطابعة". لن أتحدث كثيراً عن إرسال الأشياء إلى الطابعة في هذا الكتاب؛ كل طباعتنا ستتم على الشاشة. تنتهي تعليمة الطباعة بفاصلة منقوطة (;).

System.out.println هي عملية توفرها إحدى مكتبات Java. المكتبة (library) هي مجموعة من تعاريف الأصناف والعمليات.

تستعمل Java الأقواس المنحنية ( } و { ) لتجميع الأشياء مع بعضها. الأقواس الخارجية (في السطرين 1 و8) تحوي تعريف الصنف، والأقواس الداخلية تحوي تعريف main.

السطر الثالث يبدأ بـ //، هذا يعني أن هذا السطر هو تعليق(comment) . التعليق هو بعض النص المكتوب باللغة الإنكليزية يمكنك وضعه بين سطور البرنامج، غالباً لشرح ما يفعله البرنامج. عندما يرى المترجم //، فسيتجاهل كل شيء من بعده حتى نهاية السطر.

1.6 المصطلحات

حل المشكلات: عملية وضع المشكلة ضمن صيغة، إيجاد حل، والتعبير عنه.

اللغة عالية المستوى: لغة برمجة مثل Java مصممة لتكون سهلة القراءة والكتابة على البشر.

اللغة منخفضة المستوى: لغة برمجة مصممة لتكون سهلة التنفيذ على الحاسب. أيضاً تدعى "لغة الآلة" أو "لغة التجميع".

اللغة الاصطلاحية: أية لغة صممها الناس لأغراض خاصة، مثل التعبير عن الأفكار الرياضية أو البرامج الحاسوبية. جميع لغات البرمجة هي لغات اصطلاحية.

اللغة الطبيعية: لغة يتحدث بها الناس وتطورت بصورة طبيعية.

قابلية النقل: صفة خاصة ببرنامج يمكن تشغيله على أكثر من نوع واحد من الحواسيب.

التفسير: تنفيذ برنامج مكتوب بلغة عالية المستوى عن طريق ترجمته سطراً تلو الآخر.

التجميع (الترجمة): ترجمة برنامج مكتوب بلغة عالية المستوى إلى لغة منخفضة المستوى، دفعة واحدة، تحضيراً لتنفيذه لاحقاً.

الشفرة المصدرية: برنامج مكتوب بلغة عالية المستوى، قبل أن تتم ترجمته.

الشفرة الهدف: خرج المترجم، بعد ترجمة البرنامج.

الملف التنفيذي: اسم آخر للشفرة الهدف الجاهزة للتنفيذ.

شفرة بايت: نوع خاص من الشفرة الهدف يستعمل في برامج Java. شفرة بايت مشابهة للغات منخفضة المستوى، لكنها محمولة، مثل اللغات العالية المستوى.

التعليمة: جزء من البرنامج يحدد حسبة (computation).

تعليمة الطباعة: تعليمة تسبب عرض خرج على الشاشة.

تعليق: جزء من البرنامج يحوي معلومات عن البرنامج، لكنه لا يملك أي تأثير عند تشغيله.

عملية: مجموعة مسماة من التعليمات.

مكتبة: مجموعة من تعاريف الأصناف والعمليات.

خطأ برمجي: خطأ في البرنامج.

النحو: بنية البرنامج.

الدلالة: معنى البرنامج.

إعراب: فحص البرنامج وتحليل البنية النحوية.

خطأ نحوي: خطأ في البرنامج يجعل إعرابه مستحيلاً (بالتالي تستحيل ترجمته).

استثناء: خطأ في البرنامج يجعله يفشل أثناء تشغيله. يدعى أيضاً بخطأ التشغيل.

خطأ منطقي: خطأ في البرنامج يجعله ينفذ شيئاً يختلف عما يقصده المبرمج.

تصحيح الأخطاء: عملية اكتشاف وإزالة لأي خطأ من الأنواع الثلاثة.

problem-solving: The process of formulating a problem, finding a solution, and expressing the solution.

high-level language: A programming language like Java that is designed to be easy for humans to read and write.

low-level language: A programming language that is designed to be easy for a computer to execute. Also called “machine language” or “assembly language.”

formal language: Any of the languages people have designed for specific purposes, like representing mathematical ideas or computer programs. All programming languages are formal languages.

natural language: Any of the languages people speak that have evolved naturally.

portability: A property of a program that can run on more than one kind of computer.

interpret: To execute a program in a high-level language by translating it one line at a time.

compile: To translate a program in a high-level language into a low-level language, all at once, in preparation for later execution.

source code: A program in a high-level language, before being compiled.

object code: The output of the compiler, after translating the program.

executable: Another name for object code that is ready to be executed.

byte code: A special kind of object code used for Java programs. Byte code is similar to a low-level language, but it is portable, like a high-level language.

statement: A part of a program that specifies a computation.

print statement: A statement that causes output to be displayed on the screen.

comment: A part of a program that contains information about the program, but that has no effect when the program runs.

method: A named collection of statements.

library: A collection of class and method definitions.

bug: An error in a program.

syntax: The structure of a program.

semantics: The meaning of a program.

parse: To examine a program and analyze the syntactic structure.

syntax error: An error in a program that makes it impossible to parse (and therefore impossible to compile).

exception: An error in a program that makes it fail at run-time. Also called run-time error.

logic error: An error in a program that makes it do something other than what the programmer intended.

debugging: The process of finding and removing any of the three kinds of errors.

1.7 تمرينات

تمرين 1.1

عند علماء الكمبيوتر عادة مزعجة وهي استعمال كلمات إنكليزية شائعة للتعبير عن شيء مختلف عن معناها الأصلي. مثلاً، في الإنكليزية، كلمتي statement وcomment هما نفس الشيء تقريباً، لكن عندما نتكلم عن برنامج، فهما مختلفان كلياً.

إن المصطلحات في نهاية كل فصل موجودة للتركيز على الكلمات والعبارات التي تملك معنى خاصاً في علوم الحاسوب. عندما ترى كلمة مألوفة، لا تفترض انك تعرف معناها!

  1. في لغة الحواسيب، ما هو الفرق بين statement وcomment؟
  2. ماذا يعني أن نقول أن هذا البرنامج محمول؟
  3. ما هو الملف التنفيذي؟

تمرين 1.2

قبل أن تفعل أي شيء آخر، اكتشف كيف يتم ترجمة وتشغيل برنامج Java في بيئة البرمجة لديك. بعض بيئات البرمجة توفر أمثلة برمجية مشابهة للمثال في القسم 1.5.

  1. اكتب برنامج "Hello, World!"، ثم ترجمه وشغله.
  2. أضف تعليمة طباعة ثانية تطبع جملة ثانية بعد "Hello, Word!". شيء ظريف مثل، "How are you?". ترجم وشغل البرنامج مرة ثانية.
  3. أضف تعليقاً إلى البرنامج (في أي مكان) وترجمه مرة أخرى. شغل البرنامج ثانية. من المفروض ألا يؤثر التعليق الجديد على تنفيذ البرنامج.

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

تمرين 1.3

من الجيد ارتكاب أكبر عدد ممكن من الأخطاء يمكن أن تفكر فيها، حتى ترى رسائل الخطأ التي يولدها المجمّع. أحياناً يخبرك المجمع ما هو الخطأ بدقة، وكل ما عليك هو إصلاحه. لكن أحياناً تكون رسائل الخطأ مضللة. سيتولد لديك إحساس يخبرك متى تثق بالمجمع ومتى سيتوجب عليك اكتشاف الأخطاء بنفسك.

  1. أزل أحد أقواس الفتح المنحنية.
  2. أزل أحد أقواس الإغلاق المنحنية.
  3. بدلاً من main، اكتب mian.
  4. أزل الكلمة static.
  5. أزل الكلمة public.
  6. أزل الكلمة System.
  7. استبدل println بPrintln.
  8. استبدل println بprint. هذا الخطأ خدعة صغيرة لأنه خطأ منطقي، وليس خطأ نحوياً. التعليمة System.out.print مشروعة، لكنها قد تفعل ما تتوقعه وقد لا تفعل.
  9. احذف أحد الأقواس. أضف واحداً زائداً.
المقدمةالفهرسالتالي