برمجة جافا/التركيب النحوي
سنبدأ أولاً بعرض برنامج يُعد نقطة انطلاق، لدراسة أي لغة برمجة، وسنتعرف على خطواته بالتفصيل. يطلق على هذا البرنامج، اسم HelloWorld ، وتتمثل مهمته الوحيد في طباعة العبارة Hello Worlds.
اكتب النص التالي باستخدام أي محرر نصوص، وأقترح عليك استخدام TextPad، ثم أطلق الاسم HelloWorld.java، على الملف..لاحظ وجود حروف الكبيرة في الاسم، وهو أمر مفضل. فإذا أردنا مثلاً، تسمية ملف باسم myownjava.java، فيفضل أن نسميه بالشكل التالي: MyOwnJava، حيث نبدأ كل كلمة بحرف كبير. أما امتداد الملف فيكون java، بالأحرف الصغيرة.
نص برنامج HelloWorld.java :
class HelloWorld {
public static void main (String args[]) {
System.out.println(“Hello World”);
}
}
شرح عبارات البرنامج
يمكن اعتبار عبارة class HelloWorld، في السطر الأول، كتعريف باسم البرنامج، إذ يتعرف المترجم (compiler) على اسم البرنامج من خلالها، وليس من اسم الملف. يتضمن النص الأصلي لبرامج جافا، غالباً، عدداً من الفئات (classes)، يتولى "المترجم"، ترجمتها وتوزيعها إلى عدد من ملفات الفئات (.class files)، لكل منها اسم، هو اسم الفئة، وامتداد، هو class، وعلينا، لهذا السبب، تسمية ملف جافا باسم الفئة الرئيسية المسؤولة عن تشغيل البرنامج، وهي في مثالنا، HelloWorld. تمتاز الفئة الرئيسية، بأن تشغيلها يمكن أن يتم من خلال سطر الأوامر، بالإضافة إلى إمكانية استدعائها من داخل برنامج جافا آخر، وهو ما يميز لغة جافا.
تحتوي هذه الفئة على طريقة واحدة (method)، فيما يمكن للفئات الأخرى أن تحتوي على عدد لا محدود من الطرق، تعرف هذه الطريقة باسم، الطريقة الرئيسية (main method )، وتعد وسيلة لتشغيل برامج جافا.
تتجسد الطريقة في مثالنا، بالنص التالي:
public static void main (String args[]) {
System.out.println(“Hello World”);
}
من الملاحظ وجود ثلاث عبارات تسبق اسم الطريقة، وهي: public وstatic و void، لكن ماذا تعني كل منها؟
1 . تعني عبارة public، أن ، الطريقة main عامة، ويمكن استدعائها من أي برنامج خارجي.
2 . تعني عبارة static، أن الطريقة main تستدعى، دائماً، بدون ربطها بكائن (object).
3 . تعني عبارة void، أن الطريقة main، لن تعيد أي قيمة، بعد تنفيذها.
4 . الشيء الآخر الملاحظ، هو وجود متغير، هو args[]، معرف بأنه على هيئة String ، داخل تعريف الفئة. يحتفظ هذا المتغير، بالقيم التي تكتب بجانب أمر تنفيذ برنامج جافا، عند موجه الأوامر، وتسمى متغيرات سطر الأوامر.
تؤدي طريقة (main)، الموجودة داخل الفئة HelloWorld، مهمة واحدة فقط، هي طباعة العبارة HelloWorld باستدعاء طريقةprintln ، من الفئة out ، التي تنتمي إلى الكائن System.
لاحظ الآن، أننا استخدمنا كلمة جديدة، هي كائن، تضاف إلى الفئة والطريقة. ذكرنا سابقاً أن جافا، هي لغة تعتمد على البرمجة بالكائنات، ولكل كائن مجموعة من الفئات والطرق. وبين هذه الفئات، والطرق، والكائنات علاقة سنأتي على ذكرها بالتفصيل، في العدد المقبل.
قبل تشغيل البرنامج، علينا ترجمته. توجد طريقتان للقيام بذلك، هما:
1 . باستخدام موجه الأوامر
انتقل إلى موجه دوس، ثم انتقل إلى المجلد الذي سجلت به الملف الأصلي لبرنامج جافا، وسوف نفترض أنه c:\javaprog. أكتب الأمر cd\javaprog، ثم شغل مترجم جافا (compiler)، بكتابة javac HelloWorld.java، وسوف يقوم المترجم، بترجمة البرنامج، وإنشاء ملف يحمل الاسم HelloWorld، امتداده class. هذا الملف، بهيئة بايت كود، وهو قابل للتشغيل باستخدام آلة جافا الافتراضية، التي سبق ذكرها في العددين السابقين. شغل البرنامج بكتابة java HelloWorld، وسوف تترجم وتنفذ آلة جافا الافتراضية الملف، الذي سيعرض على الشاشة كلمة Hello World.
2 . باستخدام برنامج TextPad
شغل برنامج TextPad، ثم افتح الملفHelloWorld.java ، ثم اختر compile java، من قائمة Tools، لترجمة البرنامج. انتقل، بعد ذلك، إلى الملف ثانية، بالذهاب إلى قائمة Window، في برنامج TextPad، واختيار HelloWorld.java، منها، ثم نفذ البرنامج، بالضغط على قائمة Tools، ثم Run Java.
إذا واجهتك مشكلة في ترجمة البرامج، فتأكد مما يلي:
وضع الفاصلة المنقوطة بعد System.out.println(“Hello World").
إغلاق الأقواس.
الالتزام بحالة الحروف (صغيرة أو كبيرة).
التأكد من أنك انتقلت إلى المجلد ذاته، الذي يوجد فيه نص البرنامج HelloWorld.
إذا تم كل شيء على ما يرام، يمكنك الاسترخاء، وارتشاف فنجان جافا، وإطلاق قهقهة عالية، فقد أتممت للتو كتابة برنامجك الأول، بلغة جافا، ونفذته.
سنجري الآن، ثلاثة تعديلات على البرنامج لاختبار مدى فهمك لما ذكرناه:
أولاً: غير اسم البرنامج وحافظ على اسم الفئة داخل النص، وحاول ترجمة الملف، ثم تشغيله، ولاحظ ماذا سيحدث.
ثانياً: غير اسم الفئة وحافظ على اسم البرنامج، ثم ترجم الملف، وشغله، وراقب النتيجة.
ثالثاً: عدّل البرنامج، بحيث يعرض على الشاشة ثلاثة سطور: الأول Hello word، والثاني Welcome to Java، والثالثSoon I will be a Java Programmer .
سنعود الآن إلى برنامج HelloWorld، لنسلط عليه المزيد من الضوء.
يتألف الملف الأصلي لبرنامج جافا، من أجزاء تفصل بينها أقواس، ويسمى المقطع الموجود بين كل قوسين "{ }"، بكتلة. بدون هذه الأقواس لا يمكن ترجمة برنامج جافا، لأن "المترجم" يعتمد عليها في معرفة أين وكيف يبدأ البرنامج. بالإضافة إلى أن هذه الأقواس، تعد طريقة منطقية ضرورية، لجمع أجزاء البرنامج، وربطها منطقيا مع بعضها. فالكتلة الواحدة تنفذ كعبارة واحدة، ابتداءً من الخطوة الأولى التي تبدأ بعد فتح القوس، وانتهاءً بالخطوة الأخيرة، التي تسبق إغلاق القوس. (هذا لا يعني أن جميع الكتل تنفذ، فتنفيذ الكتل يعتمد على سير البرنامج).
ترتب الكتل في برنامج جافا، بحيث يمكن للكتلة استيعاب كتل أخرى في داخلها. فلدينا، في برنامجنا هذا، الكتلة الخارجية التي تعرف الفئة HelloWorld ، ونجد داخل هذه الكتلة، كتلة أخرى تعبر عن الكتلة الرئيسية في البرنامج.
ترتيب وتنظيم برنامج جافا
يوجد شيئان مهمان عند كتابة أي برنامج بلغة جافا (وبأي لغة أخرى، أيضاً):
الأول، ترتيب نص البرنامج بحيث يكون سهل القراءة، ويتم ذلك بإبعاد الكتلة مقدار معيناً عن الحدود اليسرى للصفحة، لتمييزها عن غيرها. وعند وجود كتل أخرى ضمنها، نزيد هذه المسافة كلما كانت الكتلة أكثر داخلية.
الثاني، هو التعليق على نص البرنامج، حيث توفر جافا ثلاث طرق لذلك: الأولى، أن نبدأ التعليق بالرمزين //، فيصبح كل ما يليهما غير قابل للترجمة، حتى نهاية السطر. الثانية، بالرمزين */، ثم ننتهي بالرمزين /*، ويعتبر كل ما بينهما، تعليقاً، لا يتناوله مترجم جافا، حتى لو امتد عدة سطور. الثالثة، بالرموز **/، وننهيه بالرمزين /*، وتستخدم هذه الطريقة لتحديد التعليقات التي نريدها أن توثق.
مثال:
// This is the Hello World program written in Java
class HelloWorld {
public static void main( String arg[]) {
/* now print the line
no need to do any thing else */
/** this comments is to be documented
it can be multiple lines
we will end it but putting */
system.out .println(“Hello World”);
}
}
البيانات والمتغيرات
لا تضم فئة جافا، طرقاً، فقط، بل بيانات ومتغيرات. لنطور برنامجنا قليلاً، وذلك بإدخال بعض المتغيرات عليه:
// This is the Hello World program … My own version
class HelloMh.Freak {
public static void main (String args[]) {
// you can freely change Mh.Freak by your name
String name = “Mh.Freak”;
/* now let us say hello*/
System.out.print(“Hello “);
System.out.println(name);
}
}
يعرض هذا البرنامج، على الشاشة، كلمةHello متبوعة باسم الشخص الذي حددناه بمتغير ( (variable، أطلقنا عليه اسم name، وأعطينا هذا المتغير قيمة ابتدائية، هي "Mh.Freak". استخدمنا طريقتين، هما System.out.print، وsystem.out.println. تعرض الأولى كلمةHello ، وتقف المشيرة بعد الكلمة المباشرة، وتعرض الثانية قيمة المتغير name، وهي في هذه الحالة Mh.Freak ، ثم تنقل المشيرة إلى السطر التالي.
متغيرات سطر الأوامر
لم يصبح برنامجنا،HelloWorld ، عاماً، حتى الآن. ولكي يصبح كذلك، يجب أن يتمكن من طباعة كلمة Hello، لأي اسم كان، بدون إجراء أي تعديل على نص البرنامج، وإعادة ترجمته. نستطيع إجراء ذلك باستخدام متغيرات سطر الأوامر، التي تكتب قيمها بجانب عبارة تشغيل البرنامج. مثال:
java HelloWorld command line arguments should be here
تتألف الجملة "command line arguments should be here"، من ستة قيم للمتغيرات، يبدأ عدها من الرقم صفر، أي أن القيمة command، رقمها صفر، وline، رقمها 1.. والقيمة here، رقمها 5.
عندما عرّفنا الطريقة الرئيسية في البرنامج، عرّفنا، أيضاً، متغيراً على هيئة String، وأسميناه arg[]، وهو يوجد على هيئة مصفوفة. عند كتابة كلمات، على سطر الأوامر، بعد أمر تشغيل برنامج جافا، تأخذ متغيرات هذه المصفوفة قيمها، من هذه الكلمات، وتكون في هذا المثال، كما يلي:
arg[0] = “command”;
arg[1] = “line”;
arg[2] = “arguments”;
arg[3] = “should”;
arg[4] = “be”;
arg[5] = “here”;
ويعني هذا أن بإمكاننا إدخال قيم، واستخدامها في برنامج جافا، من خلال موجه سطر الأوامر.
لنطور برنامجنا قليلاً باستخدام متغيرات سطر الأوامر، فيصبح نصه على الشكل التالي:
// this is the hello program written in java
/** this line will be documented
this line as well */
class Hello {
public static void main(String args[]) {
// now let us say hello
System.out.print(“Hello “);
/* let us print the name of the person by print the first word entered at the command line */
System.out.println(args[0]);
}
}
ترجم هذا البرنامج باستخدام مترجم جافا، ثم شغله، بإدخال الأمر: java Hello Mh.Freak، ولاحظ النتيجة.
لقد استغنينا عن المتغير name، الموجود في برنامج HelloMh.Freak، وأصبح برنامجنا هذا عاماً، بشكل أكبر. يمكن أن تكون قيم المتغيرargs[] ، رقماً، أو عبارة، أو كائناً، أو أي نوع آخر، وذلك لأنه على هيئة String .
عليك الآن اختبار برنامجك. يمكنك جعل البرنامج، مثلاً، يعرض على الشاشة، عبارة:
Hello Mh.Freak, your email address is morejava@alameh.net ، إذا أدخلت الأمر التالي، عند موجه دوس:
java Hello Mh.Freak morejava@alameh.net . لاحظ، أيضاً، ماذا يحدث إذا لم تدخل شيئاً، بل كتبت عند سطر الأوامر java Hello، فقط، وحاول أن تفسر رسالة الخطأ التي ستظهر أمامك.
عبارات الشرط واتخاذ القرارات
يتوجب على المبرمج، في كافة لغات البرمجة، استخدام عبارات تمكنه من اتخاذ قرارات معينة، كتنفيذ أمر معين أو عدم تنفيذه، وفقاً لنتيجة عملية حسابية أو منطقية.
تحتوي جميع لغات البرمجة على عبارة if. يجب استخدام هذه العبارة لفحص القيم المدخلة، وتلافى أخطاء الإدخال. فعلينا، مثلاً، أن نجعل البرنامج يتأكد من إدخال كلمات عند سطر الأوامر، وذلك بمقارنة قيمةargs.length مع الصفر. فإذا كانت أكبر من الصفر، فهذا يعني وجود كلمات لاحقة بأمر تنفيذ برنامج جافا، والعكس صحيح. ويصبح البرنامج بهذا التعديل، على الشكل التالي:
// again this is our program helo written in java
class Hello {
public static void main (String args [] ) {
/* now let us say hello */
System.out.print(“Hello “);
if (args.length > 0) {
System.out.println(args[0]);
}
}
}
ترجم البرنامج ثم شغله، وأدخل قيماً لمتغيرات سطر الأوامر. يمكنك، الآن، إدخال عدة تعديلات على البرنامج. عدّل البرنامج، مثلاً، لينفذ التالي:
يفحص وجود كلمات لاحقة بأمر تنفيذ البرنامج. فإذا وجدها عرض على الشاشة كلمة Hello، وبعدها الكلمات المدخلة (اسم الشخص). أما إذا لم يعثر عليها، فيعرض على الشاشة عبارة تشير إلى عدم وجود الاسم، مثل Sorry you didn’t enter a name at the command line.
أظهر لنا المثال السابق، عدة أشياء جديدة، لم نرها من قبل، وسوف نتحدث عن كل واحدة منها.
تعتبر عبارة args.length، بمثابة طريقة من طرق الكائن args، الذي هو على هيئة String. وتعتبر length في الأصل، إحدى طرق الكائنString ، وبما أن args هي على هيئة String ، فإنها ترث جميع خصائص وطرق الكائن الأصلي String . أما الشيء الجديد الآخر، فهو if ، وعبارات المقارنة. تستخدم عدة عبارات للمقارنة في لغة جافا، هي:
== لمقارنة المساواة (يستخدم الرمز = لإعطاء قيمة لمتغير معين).
> و < لمقارنة أكبر، ثم مقارنة أصغر، على التوالي.
>= و <= لمقارنة أكبر أو يساوي، ثم أصغر أو يساوي، على التوالي.
true و false لمقارنة صح أو خطأ، على التوالي.
تستخدم عبارة أخرى للمقارنة، لتفادي الأخطاء التي يمكن أن تحصل عند تنفيذ برنامج معين، وفي حالات أخرى كثيرة، هي try وcatch، سنتناولهما عندما نتحدث عن أخطاء الاستثناءات exception errors .
توجد عبارة تلازم عبارة if، في كثير من الأحيان، هي عبارة else. تتمثل مهمة هذه العبارة، في إعطاء الفرصة لتنفيذ بعض الأوامر في حال عدم تحقق الشرط الموجود في عبارة if . وبالعودة إلى التمرين الذي نصحتك بمحاولة تنفيذه، كان عليك استخدام أكثر من عبارة if واحدة لتحقيق المطلوب. سنستخدم هذه المرة، عبارتي if وelse ، وسنعدل، لهذا السبب، برنامجنا، على الشكل التالي :
// Hello program written in java, using if and else
class Hello {
public static void main (String args[]) {
/* Now let’s say Hello J */
System.out.print(“Hello “);
if (args.length > 0) {
System.out.println(args[0]);
}
else {System.out.println(“whoever you are”);
}
}
}
سيعرض البرنامج على الشاشة عبارة Hello Mh.Freak، إذا أدخلت java Hello Mh.Freak، لتنفيذ البرنامج، فيما سيعرض Hello whoever you are، إذا لم تدخل اسماً بعد java Hello .
يمكنك دمج العبارتين else و if أيضا لعمل المقارنة. عدّل البرنامج كتمرين، كي يتمكن من عرضHello ، لعدة أشخاص. أمر التنفيذ يجب أن يكون:
java Ahlan Mh.Freak Adnan Maher
والنتيجة:
Ahlan Mh.Freak wa adnan wa maher shukran lakom.
بهذا تكون قد كتبت برنامجك الأول بلغة جافا..