<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x644;&#x63A;&#x629; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/page/5/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x644;&#x63A;&#x629; &#x62C;&#x627;&#x641;&#x627;</description><language>ar</language><item><title>&#x627;&#x644;&#x633;&#x644;&#x627;&#x633;&#x644; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; String &#x648;&#x627;&#x644;&#x623;&#x635;&#x646;&#x627;&#x641; Class &#x648;&#x627;&#x644;&#x643;&#x627;&#x626;&#x646;&#x627;&#x62A; Object &#x648;&#x627;&#x644;&#x628;&#x631;&#x627;&#x645;&#x62C; &#x627;&#x644;&#x641;&#x631;&#x639;&#x64A;&#x629; Subroutine &#x641;&#x64A;  &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-string-%D9%88%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-class-%D9%88%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-object-%D9%88%D8%A7%D9%84%D8%A8%D8%B1%D8%A7%D9%85%D8%AC-%D8%A7%D9%84%D9%81%D8%B1%D8%B9%D9%8A%D8%A9-subroutine-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-r1017/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/10.png.ef0562b0242df7ab78e79465501f6ce6.png" /></p>

<p>
	تحدثنا بالقسم السابق عن الأنواع الأساسية (primitive types) الثمانية بالإضافة إلى النوع <code>String</code>. هنالك فارق جوهري بينهما، وهو أن القيم من النوع <code>String</code> عبارة عن كائنات (objects). على الرغم من أننا لن نناقش الكائنات تفصيليًا حتى نَصِل إلى الفصل الخامس، فما يزال من المفيد أن نَطَّلِع قليلًا عليها وعلى مفهوم الأصناف (classes) المُرتبِط بها إلى حد كبير. لن يُمكِّننا استيعاب مفاهيم أساسية كالكائنات (objects) والأصناف (classes) على اِستخدَام السَلاسِل النصية من النوع <code>String</code> فقط، وإنما سيَفتَح لنا الباب لاستيعاب مفاهيم برمجية آخرى مُهِمّة مثل البرامج الفرعية (subroutines).
</p>

<h2>
	الدوال (functions) والبرامج الفرعية (subroutines) المبنية مسبقًا
</h2>

<p>
	تَذَكَّر أن البرنامج الفرعي (subroutine) ما هو إلا مجموعة من التَعْليمَات (instructions) مُضمَّنة معًا تحت اسم معين، ومُصمَّمة لتكون مسئولة عن إنجاز مُهِمّة واحدة مُحدَّدة. سنتعلَّم أسلوب كتابة البرامج الفرعية (subroutines) بالفصل الرابع، ومع ذلك يُمكِنك أن تُنجز الكثير فقط باستدعاء البرامج الفرعية التي كُتبَت بالفعل بواسطة مبرمجين آخرين. يُمكِنك أن تَستدعِي برنامجًا فرعيًا ليُنجز المُهِمّة المُوكَلة إليه باِستخدَام تَعْليمَة استدعاء برنامج فرعي (subroutine call statement). يُعرَّف أي برنامج فرعي بالجافا ضِمْن صَنْف (class) أو كائن (object)، وتَتَضمَّن بعض الأصناف القياسية بلغة الجافا برامجًا فرعية مُعرَّفة مُسْبَقًا يُمكِنك اِستخدَامها. فمثلًا، تحتوي القيم من النوع <code>String</code> التي هي عبارة عن كائن على برامج فرعية مبنية مُسْبَقًا يُمكِنها معالجة السَلاسِل النصية (strings)، والتي يُمكِنك أن تَستدعِيها دون فهم طريقة كتابتها أو كيفية عملها. في الواقع، هذا هو الغرض الأساسي منها: أي برنامج فرعي هو صندوق أسود (black box) يُمكِن اِستخدَامه بدون مَعرِفة ما يحدث داخله.
</p>

<p>
	لنَفْحَص أولًا البرامج الفرعية (subroutines) التي تُعدّ جزءًا من صَنْف (class). يُستخدَم أي صَنْف عمومًا لتجميع بعض المُتْغيِّرات (variables) والبرامج الفرعية (subroutines) المُعرَّفة بذلك الصنف معًا، ويُعرَف كلاهما باسم "أعضاء الصَنْف الساكنة (static members)". لقد رأينا مثالًا لذلك بالفعل: إذا كان لدينا صنف يُعرِّف برنامجًا، فإن البرنامج <code>main()‎</code> هو عضو ساكن (static member) بذلك الصَنْف. ينبغي أن تُضيف الكلمة المحجوزة <code>static</code> عندما تُعرِّف عضو ساكن مثل الكلمة <code>static</code> بالتَصْرِيح <code>public static void main...‎</code>.
</p>

<p>
	عندما يحتوي صنف (class) معين على مُتْغيِّر أو برنامج فرعي ساكن (static)، يُعدّ اسم الصنف جزءًا من الاسم الكامل لذلك المُتْغيِّر أو لذلك البرنامج الفرعي. على سبيل المثال، يحتوي الصنف القياسي <code>System</code> على البرنامج الفرعي <code>exit</code> لذا يُمكِنك أن تُشير إليه باستخدام الاسم <code>System.exit</code> والذي يَتَكوَّن من كُلًا من اسم الصنف المُتْضمِّن للبرنامج الفرعي متبوعًا بنقطة ثم باسم البرنامج الفرعي نفسه. يَستقبِل البرنامج الفرعي <code>exit</code> مُعامِلًا من النوع <code>int</code>، لذلك يُمكِنك اِستخدَامه بكتابة تَعْليمَة استدعاء برنامج فرعي (subroutine call statement) كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_7" style="">
<span class="typ">System</span><span class="pun">.</span><span class="pln">exit</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span></pre>

<p>
	يُنهِي الاستدعاء <code>System.exit</code> البرنامج ويُغلِق آلة جافا الافتراضية (Java Virtual Machine)، لذا يُمكِنك أن تَستخدِمه إذا كنت تُريد إنهاء البرنامج قبل نهاية البرنامج <code>main()‎</code>. تُشير قيمة المُعامِل المُمرَّرة إلى سبب إغلاق البرنامج، فإذا كانت تُساوِي القيمة ٠، يَعنِي ذلك أن البرنامج قد انتهى بشكل طبيعي. في المقابل، تَعنِي أي قيمة آخرى انتهاء البرنامج لوجود خطأ مثل الاستدعاء <code>System.exit(1)‎</code>. تُرسَل قيمة المُعامِل المُمرَّرة إلى نظام التشغيل والذي عادةً ما يتجاهلها.
</p>

<p>
	يُعدّ الصَنْف <code>System</code> واحدًا فقط من ضِمْن مجموعة من الأصناف القياسية التي تأتي مع الجافا. كمثال آخر، يَتَضمَّن الصنف <code>Math</code> مُتْغيِّرات ساكنة (static variables) مثل <code>Math.PI</code> و <code>Math.E</code> والتي قيمها هي الثوابت الرياضية <code>π</code> و <code>e</code> على الترتيب كما يُعرِّف عددًا كبيرًا من الدوال (functions) الحسابية. يُنفِّذ أي برنامج فرعي (subroutine) في العموم مُهِمّة مُحدّدة. لبعض البرامج الفرعية، تَحسِب المُهِمّة قيمة إحدى البيانات ثم تُعيدها، وفي تلك الحالة، تُعرَف تلك البرامج الفرعية باسم الدوال (functions)، ونقول عندها أن تلك الدالة تُعيد (return value) قيمة، والتي يُفْترَض استخدامها بطريقة ما ضِمْن البرنامج المُستدعِي للدالة.
</p>

<p>
	لنَفْترِض مثلًا مسالة حِسَاب الجذر التربيعي (square root)، تُوفِّر لغة الجافا دالة (function) لهذا الغرض اسمها هو <code>Math.sqrt</code>. تُعدّ تلك الدالة عضو برنامج فرعي ساكن (static member subroutine) بالصنف <code>Math</code>. إذا كانت <code>x</code> هي أي قيمة عددية، فإن الاستدعاء <code>Math.sqrt(x)‎</code> يَحسِب الجذر التربيعي (root) لتلك القيمة ثم يُعيدها. لمّا كانت الدالة <code>Math.sqrt(x)‎</code> تُمثِل قيمة، فليس هناك أي مغزى من استدعائها بمفردها بتَعْليمَة استدعاء برنامج فرعي (subroutine call statement) كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_11" style="">
<span class="typ">Math</span><span class="pun">.</span><span class="pln">sqrt</span><span class="pun">(</span><span class="pln">x</span><span class="pun">);</span><span class="pln">   </span></pre>

<p>
	لا يَفعَل الحاسوب أي شيء بالقيمة المُعادة من الدالة (function) بالأعلى، أي أنه يَحسِبها ثم يتجاهلها، وهو أمر غَيْر منطقي، لذا يُمكِنك أن تُخبره مثلًا بأن عليه طباعتها على الأقل كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_15" style="">
<span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">sqrt</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">  </span><span class="com">// اعرض الجذر التربيعي</span></pre>

<p>
	أو قد تَستخدِم تَعْليمَة إِسْناد (assignment statement) لتُخبره بأن عليه تَخْزِينها بمُتْغيِّر كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_13" style="">
<span class="pln">lengthOfSide </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">sqrt</span><span class="pun">(</span><span class="pln">x</span><span class="pun">);</span></pre>

<p>
	يُمثِل استدعاء الدالة <code>Math.sqrt(x)‎</code> قيمة من النوع <code>double</code> أي يُمكِنك كتابة ذلك الاستدعاء أينما أَمْكَن اِستخدَام قيمة عددية مُصنَّفة النوع (numeric literal) من النوع <code>double</code>. يُمثِل <code>x</code> مُعامِلًا (parameter) يُمرَّر إلى البرنامج الفرعي (subroutine) والذي قد يَكُون مُتْغيِّرًا (variable) اسمه <code>x</code> أو قد يَكُون أي تعبير آخر (expression) بشَّرط أن يُمثِل ذلك التعبير قيمة عددية. على سبيل المثال، يَحسِب الاستدعاء <code>Math.sqrt(2)‎</code> قيمة الجذر التربيعي للعَدَد ٢ أما الاستدعاء <code>Math.sqrt(a*a+b*b)‎</code> فهو صالح تمامًا طالما كانت قيم <code>a</code> و <code>b</code> مُتْغيِّرات من النوع العددي.
</p>

<p>
	يحتوي الصَنْف <code>Math</code> على العديد من الدوال الأعضاء الساكنة (static member functions) الأخرى. اُنظر القائمة التالية والتي تَعرِض بعضًا منها:
</p>

<ul>
<li>
		<p>
			<code>Math.abs(x)‎</code>: تَحسِب القيمة المطلقة للمُعامِل <code>x</code>.
		</p>
	</li>
	<li>
		<p>
			الدوال المثلثية العادية (trigonometric functions)‏ <code>Math.sin(x)‎</code> و <code>Math.cos(x)‎</code> و <code>Math.tan(x)‎</code>: تُقاس جميع الزوايا بوحدة قياس راديان (radians) وليس بوحدة الدرجات (degrees).
		</p>
	</li>
	<li>
		<p>
			الدوال المثلثية العكسية (inverse trigonometric functions) ‏<code>Math.asin(x)‎</code> و <code>Math.acos(x)‎</code> و <code>Math.atan(x)‎</code>: تُقاس القيمة المُعادة (return value) من تلك الدوال بوحدة قياس راديان وليس بوحدة الدرجات.
		</p>
	</li>
	<li>
		<p>
			تَحسِب الدالة الأسية <code>Math.exp(x)‎</code> قيمة العدد <code>e</code> مرفوعة للأس <code>x</code> أما دالة اللوغاريتم الطبيعي <code>Math.log(x)‎</code> فتَحسِب لوغاريتم <code>x</code> بالنسبة للأساس <code>e</code>.
		</p>
	</li>
	<li>
		<p>
			<code>Math.pow(x,y)‎</code> تحسب قيمة <code>x</code> مرفوعة للأس <code>y</code>.
		</p>
	</li>
	<li>
		<p>
			<code>Math.floor(x)‎</code>: تُقرِّب <code>x</code> لأكبر عدد صحيح أقل من أو يُساوِي <code>x</code>. تَحسِب تلك الدالة عددًا صحيحًا بالمفهوم الرياضي، ولكنها مع ذلك تُعيد قيمة من النوع <code>double</code> بدلًا من النوع <code>int</code> كما قد تَتَوقَّع. فمثلًا يُعيد استدعاء الدالة <code>Math.floor(3.76)‎</code> القيمة <code>3.0</code> بينما يُعيد استدعاء الدالة <code>Math.floor(-4.2)‎</code> القيمة <code>‎-5</code>. علاوة على ذلك، تَتَوفَّر أيضًا الدالة <code>Math.round(x)‎</code> والتي تُعيد أقرب عدد صحيح للمُعامِل <code>x</code> وكذلك الدالة <code>Math.ceil(x)‎</code> والتي تُقرِّب <code>x</code> لأصغر عدد صحيح أكبر من أو يُساوِي <code>x</code>.
		</p>
	</li>
	<li>
		<p>
			<code>Math.random()‎</code> تُعيد قيمة عشوائية من النوع <code>double</code> ضِمْن نطاق يتراوح من ٠ إلى ١. تَحسِب تلك الدالة أعدادًا شبه عشوائية (pseudorandom number) أي أنها ليست عشوائية تمامًا وإنما إلى درجة كافية لغالبية الأغراض. سنكتشف خلال الفصول القادمة أن تلك الدالة لها استخدامات أخرى كثيرة مفيدة.
		</p>
	</li>
</ul>
<p>
	تَستقبِل الدوال (functions) بالأعلى مُعامِلات (parameters) -أي <code>x</code> أو <code>y</code> داخل الأقواس- بأي قيم طالما كانت من النوع العددي أما القيم المُعادة (return value) من غالبيتها فهي من النوع <code>double</code> بغض النظر عن نوع المُعامِل (parameter) باستثناء الدالة <code>Math.abs(x)‎</code> والتي تَكُون قيمتها المُعادة من نفس نوع المُعامِل <code>x</code>، فإذا كانت <code>x</code> من النوع <code>int</code>، تُعيد تلك الدالة قيمة من النوع <code>int</code> أيضًا وهكذا. على سبيل المثال، تُعيد الدالة <code>Math.sqrt(9)‎</code> قيمة من النوع <code>double</code> تُساوِي <code>3.0</code> بينما تُعيد الدالة <code>Math.abs(9)‎</code> قيمة من النوع <code>int</code> تُساوِي <code>9</code>.
</p>

<p>
	لا تَستقبِل الدالة <code>Math.random()‎</code> أي مُعامِلات (parameter)، ومع ذلك لابُدّ من كتابة الأقواس حتى وإن كانت فارغة لأنها تَسمَح للحاسوب بمَعرِفة أنها تُمثِل برنامجًا فرعيًا (subroutine) لا مُتْغيِّرًا (variable). تُعدّ الدالة <code>System.currentTimeMillis()‎</code> من الصنف <code>System</code> مثالًا آخرًا على برنامج فرعي (subroutine) ليس له أي مُعامِلات (parameters). عندما تُنفَّذ تلك الدالة، فإنها تُعيد الوقت الحالي مُقاس بحساب الفارق بين الوقت الحالي ووقت آخر قياسي بالماضي (بداية عام ١٩٧٠) بوحدة المللي ثانية. تَكُون القيمة المعادة من <code>System.currentTimeMillis()‎</code> من النوع <code>long</code> (عدد صحيح ٦٤ بت). يُمكِنك اِستخدَام تلك الدالة لحِساب الوقت الذي يَستَغْرِقه الحاسوب لتّنْفيذ مُهِمّة معينة. كل ما عليك القيام به هو أن تُسجِّل كُلًا من الوقت الذي بدأ فيه التّنْفيذ وكذلك الوقت الذي انتهى به ثم تَحسِب الفرق بينهما. للحصول على توقيت أكثر دقة، يُمكِنك اِستخدَام الدالة <code>System.nanoTime()‎</code> والتي تُعيد الوقت الحالي مُقاس بحساب الفارق بين الوقت الحالي ووقت آخر عشوائي بالماضي بوحدة النانو ثانية. لكن لا تَتَوقَّع أن يَكُون الوقت دقيقًا بحق لدرجة النانوثانية.
</p>

<p>
	يُنفِّذ البرنامج بالمثال التالي مجموعة من المهام الحسابية ويَعرِض الوقت الذي يَستَغْرِقه البرنامج لتّنْفيذ كُلًا منها:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_17" style="">
<span class="com">/**
 * This program performs some mathematical computations and displays the
 * results.  It also displays the value of the constant Math.PI.  It then 
 * reports the number of seconds that the computer spent on this task.
 */</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">TimedComputation</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span class="kwd">long</span><span class="pln"> startTime</span><span class="pun">;</span><span class="pln"> </span><span class="com">// وقت البدء بالنانو ثانية</span><span class="pln">
        </span><span class="kwd">long</span><span class="pln"> endTime</span><span class="pun">;</span><span class="pln">   </span><span class="com">// وقت الانتهاء بالنانو ثانية</span><span class="pln">
        </span><span class="kwd">long</span><span class="pln"> compTime</span><span class="pun">;</span><span class="pln">  </span><span class="com">// زمن التشغيل بالنانو ثانية</span><span class="pln">
        </span><span class="kwd">double</span><span class="pln"> seconds</span><span class="pun">;</span><span class="pln"> </span><span class="com">// فرق الوقت بالثواني</span><span class="pln">

        startTime </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">();</span><span class="pln">

        </span><span class="kwd">double</span><span class="pln"> width</span><span class="pun">,</span><span class="pln"> height</span><span class="pun">,</span><span class="pln"> hypotenuse</span><span class="pun">;</span><span class="pln">  </span><span class="com">// جوانب المثلث</span><span class="pln">
        width </span><span class="pun">=</span><span class="pln"> </span><span class="lit">42.0</span><span class="pun">;</span><span class="pln">
        height </span><span class="pun">=</span><span class="pln"> </span><span class="lit">17.0</span><span class="pun">;</span><span class="pln">
        hypotenuse </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">sqrt</span><span class="pun">(</span><span class="pln"> width</span><span class="pun">*</span><span class="pln">width </span><span class="pun">+</span><span class="pln"> height</span><span class="pun">*</span><span class="pln">height </span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"A triangle with sides 42 and 17 has hypotenuse "</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">hypotenuse</span><span class="pun">);</span><span class="pln">

        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"\nMathematically, sin(x)*sin(x) + "</span><span class="pln">
                </span><span class="pun">+</span><span class="pln"> </span><span class="str">"cos(x)*cos(x) - 1 should be 0."</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Let's check this for x = 100:"</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"      sin(100)*sin(100) + cos(100)*cos(100) - 1 is: "</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">sin</span><span class="pun">(</span><span class="lit">100</span><span class="pun">)*</span><span class="typ">Math</span><span class="pun">.</span><span class="pln">sin</span><span class="pun">(</span><span class="lit">100</span><span class="pun">)</span><span class="pln"> 
                </span><span class="pun">+</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">cos</span><span class="pun">(</span><span class="lit">100</span><span class="pun">)*</span><span class="typ">Math</span><span class="pun">.</span><span class="pln">cos</span><span class="pun">(</span><span class="lit">100</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"(There can be round-off errors when"</span><span class="pln"> 
                </span><span class="pun">+</span><span class="pln"> </span><span class="str">" computing with real numbers!)"</span><span class="pun">);</span><span class="pln">

        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"\nHere is a random number:  "</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">random</span><span class="pun">()</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"\nThe value of Math.PI is "</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">PI </span><span class="pun">);</span><span class="pln">

        endTime </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">();</span><span class="pln">
        compTime </span><span class="pun">=</span><span class="pln"> endTime </span><span class="pun">-</span><span class="pln"> startTime</span><span class="pun">;</span><span class="pln">
        seconds </span><span class="pun">=</span><span class="pln"> compTime </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1000000000.0</span><span class="pun">;</span><span class="pln">

        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"\nRun time in nanoseconds was: "</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">compTime</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"(This is probably not perfectly accurate!"</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"\nRun time in seconds was:  "</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">seconds</span><span class="pun">);</span><span class="pln">

    </span><span class="pun">}</span><span class="pln"> </span><span class="com">// ‫نهاية main()</span><span class="pln">

</span><span class="pun">}</span><span class="pln"> </span><span class="com">// ‫نهاية الصنف TimedComputation</span></pre>

<h2>
	الأصناف (classes) والكائنات (objects)
</h2>

<p>
	بالإضافة إلى استخدام الأصناف (classes) كحاويات للمُتْغيِّرات والبرامج الفرعية الساكنة (static). فإنها قد تُستخدَم أيضًا لوصف الكائنات (objects). يُعدّ الصنف ضِمْن هذا السياق نوعًا (type) بنفس الطريقة التي تُعدّ بها كلًا من <code>int</code> و <code>double</code> أنواعًا أي يُمكِننا إذًا أن نَستخدِم اسم الصنف للتَصْرِيح (declare) عن مُتْغيِّر (variable). تَحمِل المُتْغيِّرات في العموم نوعًا واحدًا من القيم يَكُون في تلك الحالة عبارة عن كائن (object).
</p>

<p>
	ينتمي أي كائن إلى صنف (class) معين يُبلِّغه بنوعه (type)، ويُعدّ بمثابة تجميعة من المُتْغيِّرات والبرامج الفرعية (subroutines) يُحدِّدها الصنف الذي ينتمي إليه الكائن أي تتشابه الكائنات (objects) من نفس الصنف (class) وتحتوي على نفس تجميعة المُتْغيِّرات والبرامج الفرعية. على سبيل المثال، إذا كان لدينا سطح مستو، وأردنا أن نُمثِل نقطة عليه باِستخدَام كائن، فيُمكِن إذًا لذلك الكائن المُمثِل للنقطة أن يُعرِّف مُتْغيِّرين (variables)‏ <code>x</code> و <code>y</code> لتمثيل إحداثيات النقطة. ستُعرِّف جميع الكائنات المُمثِلة لنقطة قيمًا لكُلًا من <code>x</code> و <code>y</code> والتي ستكون مختلفة لكل نقطة معينة. في هذا المثال، يُمكِننا أن نُعرِّف صَنْفًا (class) اسمه <code>Point</code> مثلًا ليُعرِّف (define) البنية المشتركة لجميع الكائنات المُمثِلة لنقطة بحيث تَكُون جميع تلك الكائنات (objects) قيمًا من النوع <code>Point</code>.
</p>

<p>
	لنَفْحَص الاستدعاء <code>System.out.println</code> مرة آخرى. أولًا، <code>System</code> هو عبارة عن صَنْف (class) أما <code>out</code> فهو مُتْغيِّر ساكن (static variable) مُعرَّف بذلك الصنف. ثانيًا، يشير المُتْغيِّر <code>System.out</code> إلى كائن (object) من الصَنْف القياسي <code>PrintStream</code> و <code>System.out.println</code> هو الاسم الكامل لبرنامج فرعي (subroutine) مُعرَّف بذلك الكائن. يُمثِل أي كائن من النوع <code>PrintStream</code> مقصدًا يُمكِن طباعة المعلومات من خلاله حيث يَتَضمَّن برنامجًا فرعيًا <code>println</code> يُستخدَم لإرسال المعلومات إلى ذلك المقصد. لاحِظ أن الكائن <code>System.out</code> هو مُجرد مقصد واحد محتمل، فقد تُرسِل كائنات (objects) آخرى من النوع <code>PrintStream</code> المعلومات إلى مقاصد أخرى مثل الملفات أو إلى حواسيب آخرى عبر شبكة معينة. يُمثَل ذلك ما يُعرَف باسم البرمجة كائنية التوجه (object-oriented programming): عندما يَتَوفَّر لدينا مجموعة من الأشياء المختلفة في العموم والتي لديها شيئًا مشتركًا مثل كَوْنها تَعمَل مقصدًا للخَرْج، فإنه يُمكِن اِستخدَامها بنفس الطريقة من خلال برنامج فرعي مثل <code>println</code>. في هذا المثال، يُعبِر الصَنْف <code>PrintStream</code> عن الأمور المُشتركة بين كل تلك الأصناف (objects).
</p>

<p>
	تلعب الأصناف (classes) دورًا مزدوجًا وهو ما قد يَكُون مُربِكًا للبعض، ولكن من الناحية العملية تُصمَّم غالبية الأصناف لكي تؤدي دورًا واحدًا منها بشكل رئيسي أو حصري. لا تقلق عمومًا بشأن ذلك حتى نبدأ في التعامل مع الكائنات (objects) بصورة أكثر جديّة بالفصل الخامس.
</p>

<p>
	لمّا كانت أسماء البرامج الفرعية (routines) دائمًا متبوعة بقوس أيسر، يَصعُب خَلْطها إذًا مع أسماء المُتْغيِّرات. في المقابل، تُستخدَم أسماء كُلًا من الأصناف (classes) والمُتْغيِّرات (variables) بنفس الطريقة، لذا قد يَكُون من الصعب أحيانًا التَمْييز بينها. في الواقع، تَتَّبِع جميع الأسماء المُعرَّفة مُسْبَقًا بالجافا نَمْط تسمية تبدأ فيه أسماء الأصناف بحروف كبيرة (upper case) بينما تبدأ أسماء المُتْغيِّرات والبرامج الفرعية (subroutines) بحروف صغيرة (lower case). لا يُمثِل ذلك قاعدة صيغة (syntax rule)، ومع ذلك من الأفضل أن تَتَّبِعها أيضًا.
</p>

<p>
	كملاحظة عامة أخيرة، يُستخدَم عادةً مصطلح "التوابع (methods)" للإشارة إلى البرامج الفرعية (subroutines) بالجافا. يَعنِي مصطلح "التابع (method)" أن برنامجًا فرعيًا (subroutine) مُعرَّف ضِمْن صنف (object) أو كائن (object). ولأن ذلك يُعدّ صحيحًا لأي برنامج فرعي بالجافا، فإن أيًا منها يُعدّ تابعًا. سنميل عمومًا إلى اِستخدَام المصطلح الأعم "البرنامج الفرعي (subroutine)"، ولكن كان لابُدّ من إعلامك بأن بعض الأشخاص يُفضِّلون اِستخدَام مصطلح "التابع (method)".
</p>

<h2>
	العمليات على السلاسل النصية من النوع <code>String</code>
</h2>

<p>
	يُمثِل <code>String</code> صنفًا (class)، وأي قيمة من النوع <code>String</code> هي عبارة عن كائن (object). يَحتوِي أي كائن في العموم على بيانات (data) وبرامج فرعية (subroutines). بالنسبة للنوع <code>String</code>، فإن البيانات مُكوَّنة من متتالية محارف السِلسِلة النصية (string) أما البرامج الفرعية فهي في الواقع مجموعة من الدوال (functions) منها مثلًا الدالة <code>length</code> والتي تَحسِب عدد المحارف (characters) بالسِلسِلة النصية. لنَفْترِض أن <code>advice</code> هو مُتْغيِّر يُشير إلى <code>String</code>، يُمكِننا إذًا أن نُصرِّح عنه ونُسنِد إليه قيمة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_19" style="">
<span class="typ">String</span><span class="pln"> advice</span><span class="pun">;</span><span class="pln">
advice </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Seize the day!"</span><span class="pun">;</span></pre>

<p>
	الآن، يُمثِل التعبير <code>advice.length()‎</code> استدعاءً لدالة (function call)، والتي ستُعيد في تلك الحالة تحديدًا عدد محارف السِلسِلة النصية "Seize the day!" أي ستُعيد القيمة ١٤. في العموم، لأي مُتْغيِّر <code>str</code> من النوع <code>String</code>، يُمثِل الاستدعاء <code>str.length()‎</code> قيمة من النوع <code>int</code> تُساوِي عدد المحارف بالسِلسِلة النصية (string). لا تَستقبِل تلك الدالة (function) أي مُعامِلات (parameters) لأن السِلسِلة النصية المطلوب حِسَاب طولها هي بالفعل قيمة المُتْغيِّر <code>str</code>. يُعرِّف الصَنْف <code>String</code> البرنامج الفرعي <code>length</code> ويُمكِن اِستخدَامه مع أي قيمة من النوع <code>String</code> حتى مع أي سِلسِلة نصية مُجرّدة (string literals) فهي في النهاية ليست سوى قيمة ثابتة (constant value) من النوع <code>String</code>. يُمكِنك مثلًا كتابة برنامج يَحسِب عدد محارف السِلسِلة النصية "Hello World" كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_21" style="">
<span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"The number of characters in "</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"the string \"Hello World\" is "</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Hello World"</span><span class="pun">.</span><span class="pln">length</span><span class="pun">()</span><span class="pln"> </span><span class="pun">);</span></pre>

<p>
	يُعرِّف الصَنْف <code>String</code> الكثير من الدوال (functions) نَستعرِض بعضًا منها خلال القائمة التالية:
</p>

<ul>
<li>
		<p>
			<code>s1.equals(s2)‎</code>: تُوازن تلك الدالة بين السِلسِلتين <code>s1</code> و <code>s2</code>، وتُعيد قيمة من النوع <code>boolean</code> تُساوِي <code>true</code> إذا كانت <code>s1</code> و <code>s2</code> مُكوّنتين من نفس متتالية المحارف، وتُساوِي <code>false</code> إن لم تَكُن كذلك.
		</p>
	</li>
	<li>
		<p>
			<code>s1.equalsIgnoreCase(s2)‎</code>: هي دالة من النوع المنطقي (boolean-valued function). مثل الدالة السابقة، تَفْحَص تلك الدالة ما إذا كانت السِلسِلتان <code>s1</code> و <code>s2</code> مُكوّنتين من نفس السِلسِلة النصية (string)، ولكنها تختلف عن الدالة السابقة في أن الحروف الكبيرة (upper case) والصغيرة (lower case) تُعدّ متكافئة. فمثلًا، إذا كانت <code>s1</code> تحتوي على السِلسِلة النصية "cat"، فستُعيد الدالة <code>s1.equals("Cat")‎</code> القيمة <code>false</code> أما الدالة <code>s1.equalsIgnoreCase("Cat")‎</code> فستُعيد القيمة <code>true</code>.
		</p>
	</li>
	<li>
		<p>
			<code>s1.length()‎</code>: هي دالة من النوع الصحيح (integer-valued function)، وتُعيد قيمة تُمثِل عدد محارف السِلسِلة النصية <code>s1</code>.
		</p>
	</li>
	<li>
		<p>
			<code>s1.charAt(N)‎</code>: حيث <code>N</code> هو عدد صحيح. تُعيد تلك الدالة قيمة من النوع <code>char</code> تُساوي قيمة محرف السِلسِلة النصية برقم المَوضِع <code>N</code>. يبدأ الترقيم من الصفر، لذا يُمثِل استدعاء الدالة <code>s1.charAt(0)‎</code> المحرف الأول أما استدعاء الدالة <code>s1.charAt(1)‎</code> فيُمثِل المحرف الثاني، وهكذا حتى نَصِل إلى المَوضِع الأخير <code>s1.length() - 1</code>. مثلًا، يُعيد <code>‎"cat".charAt(1)‎</code> القيمة 'a'. لاحظ أنه إذا كانت قيمة المُعامِل المُمرَّرة أقل من صفر أو أكبر من أو تُساوِي <code>s1.length</code>، فسيَحدُث خطأ.
		</p>
	</li>
	<li>
		<p>
			<code>s1.substring(N,M)‎</code>: حيث <code>N</code> و <code>M</code> هي أعداد صحيحة. تُعيد تلك الدالة قيمة من النوع <code>String</code> مُكوَّنة من محارف السلسلة النصية بالمواضع <code>N</code> و <code>N+1</code> و .. حتى <code>M-1</code> (المحرف بالمَوضِع <code>M</code> ليس مُضمَّنًا). تُعدّ القيمة المُعادة "سلسلة جزئية (substring)" من السِلسِلة الأصلية <code>s1</code>. يُمكِنك ألا تُمرِّر قيمة للمُعامِل <code>M</code> كالتالي <code>s1.substring(N)‎</code> وعندها ستُعيد تلك الدالة سِلسِلة جزئية من <code>s1</code> مُكوَّنة من محارف السلسلة النصية بدايةً من <code>N</code> إلى النهاية.
		</p>
	</li>
	<li>
		<p>
			<code>s1.indexOf(s2)‎</code>: تُعيد عددًا صحيحًا. إذا كانت <code>s2</code> هى سِلسِلة جزئية (substring) من <code>s1</code>، تُعيد تلك الدالة مَوضِع المحرف الأول من السِلسِلة الجزئية <code>s2</code> بالسِلسِلة الأصلية <code>s1</code>. أما إذا لم تَكُن جزءًا منها، فإنها تُعيد القيمة -١. تَتَوفَّر أيضًا الدالة <code>s1.indexOf(ch)‎</code> حيث <code>ch</code> عبارة عن محرف من النوع <code>char</code>، وتُستخدَم للبحث عنه بسِلسِلة نصية <code>s1</code>. تُستخدَم أيضًا الدالة <code>s1.indexOf(x,N)‎</code> لإيجاد أول حُدوث من <code>x</code> بعد موضع <code>N</code> بسِلسِلة نصية، وكذلك الدالة <code>s1.lastIndexOf(x)‎</code> لإيجاد آخر حُدوث من <code>x</code> بسِلسِلة نصية <code>s1</code>.
		</p>
	</li>
	<li>
		<p>
			<code>s1.compareTo(s2)‎</code>: هي دالة من النوع العددي الصحيح (integer-valued function) تُوازن بين سلسلتين نصيتين <code>s1</code> و <code>s2</code>، فإذا كانت السِلسِلتان متساويتين، تُعيد الدالة القيمة ٠ أما إذا كانت <code>s1</code> أقل من <code>s2</code>، فإنها تُعيد عددًا أقل من ٠، وأخيرًا إذا كانت <code>s1</code> أكبر من <code>s2</code>، فإنها تُعيد عددًا أكبر من ٠. إذا كانت السلسلتان <code>s1</code> و <code>s2</code> مُكوّنتين من حروف صغيرة (lower case) فقط أو حروف كبيرة (upper case) فقط، فإن الترتيب المُستخدَم بموازنات مثل "أقل من" أو "أكبر من" تُشير إلى الترتيب الأبجدي. أما إذا تَضمَّنتا محارف آخرى فسيَكُون الترتيب أكثر تعقيدًا. تَتَوفَّر دالة آخرى مشابهة هي <code>s1.compareToIgnoreCase(s2)‎</code>.
		</p>
	</li>
	<li>
		<p>
			<code>s1.toUpperCase()‎</code>: هي دالة من النوع النصي (String-valued function) تُعيد سِلسِلة نصية جديدة تُساوِي <code>s1</code> ولكن بَعْد تَحْوِيل أي حرف صغير (lower case) بها إلى حالته الكبيرة (upper case). فمثلًا، تُعيد الدالة <code>‎"‎Cat".toUpperCase()‎</code> السِلسِلة النصية "CAT". تَتَوفَّر دالة آخرى مشابهة هي <code>s1.toLowerCase</code>.
		</p>
	</li>
	<li>
		<p>
			<code>s1.trim()‎</code>: هي دالة من النوع النصي (String-valued function) تُعيد سِلسِلة نصية جديدة (string) تساوي <code>s1</code> ولكن بَعْد حَذْف أي محارف غَيْر مطبوعة -كالمسافات الفارغة (spaces)- من بداية السِلسِلة النصية (string) ونهايتها. فمثلًا إذا كانت <code>s1</code> هي السِلسِلة النصية "fred ‎"، فستُعيد الدالة <code>s1.trim()‎</code> السِلسِلة "fred" بدون أي مسافات فارغة بالنهاية.
		</p>
	</li>
</ul>
<p>
	لا تُغيِّر الدوال <code>s1.toUpperCase()‎</code> و <code>s1.toLowerCase()‎</code> و <code>s1.trim()‎</code> قيمة <code>s1</code>، وإنما تُنشِئ سِلسِلة نصية جديدة (string) تُعَاد كقيمة للدالة يُمكِن اِستخدَامها بتَعْليمَة إِسْناد (assignment statement) مثلًا كالتالي <code>smallLetters = s1.toLowerCase();‎</code>. إذا كنت تُريد تَعْدِيل قيمة <code>s1</code> نفسها، فيُمكِنك ببساطة أن تَستخدِم تَعْليمَة الإِسْناد التالية <code>s1 = s1.toLowerCase();‎</code>.
</p>

<p>
	يُمكِنك أن تَستخدِم عَامِل الزيادة (plus operator) <code>+</code> لضم (concatenate) سِلسِلتين نصيتين (strings)، وينتج عنهما سِلسِلة نصية جديدة مُكوَّنة من كل محارف السِلسِلة النصية الأولى متبوعة بكل محارف السِلسِلة النصية الثانية. فمثلًا، يؤول التعبير <code>"Hello" + "World"</code> إلى السِلسِلة النصية "HelloWorld". إذا كنت تُريد مسافة فارغة (space) بين الكلمات، فعليك أن تُضيفها إلى أي من السِلسِلتين كالتالي <code>Hello " + "World"</code>.
</p>

<p>
	لنَفْترِض أن <code>name</code> هو مُتْغيِّر من النوع <code>String</code> يُشير إلى اسم مُستخدِم البرنامج. يُمكِنك إذًا أن تُرحِّب به بتّنْفيذ التَعْليمَة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_23" style="">
<span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Hello, "</span><span class="pln">  </span><span class="pun">+</span><span class="pln">  name  </span><span class="pun">+</span><span class="pln">  </span><span class="str">".  Pleased to meet you!"</span><span class="pun">);</span></pre>

<p>
	يُمكِنك حتى أن تَستخدِم نفس العَامِل <code>+</code> لكي تَضُمُّ (concatenate) قيم من أي نوع آخر إلى سِلسِلة نصية (string). ستَتَحوَّل تلك القيم إلى سِلسِلة نصية (string) أولًا كما يَحدُث عندما تَطبَعها إلى الخَرْج القياسي (standard output) ثم ستُضَمّ إلى السِلسِلة النصية الآخرى. فمثلًا، سيؤول التعبير <code>"Number" + 42</code> إلى السِلسِلة النصية "Number42". اُنظر التعليمات التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_25" style="">
<span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"After "</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="pln">years</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">" years, the value is "</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="pln">principal</span><span class="pun">);</span></pre>

<p>
	يُمكِنك اِستخدَام التَعْليمَة المُفردة التالية بدلًا من التَعْليمَات بالأعلى:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_27" style="">
<span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"After "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> years </span><span class="pun">+</span><span class="pln"> 
                    </span><span class="str">" years, the value is "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> principal</span><span class="pun">);</span></pre>

<p>
	تُعدّ النسخة الثانية أفضل بكثير ويُمكِنها أن تَختصِر الكثير من الأمثلة التي عَرَضَناها خلال هذا الفصل.
</p>

<h2>
	مقدمة إلى التعدادات (enums)
</h2>

<p>
	تُوفِّر الجافا ثمانية أنواع أساسية مَبنية مُسْبَقًا (built-in primitive types) بالإضافة إلى مجموعة ضخمة من الأنواع المُعرَّفة باِستخدَام أصناف (classes) مثل النوع <code>String</code>، ولكنها ما تزال غَيْر كافية لتغطية جميع المواقف المُحتمَلة والتي قد يحتاج المُبرمج إلى التَعامُل معها. لهذا، وبالمثل من غالبية اللغات البرمجية الآخرى، تَمنَحك الجافا القدرة على إنشاء أنواع (types) جديدة، والتي غالبًا ما تَكُون بهيئة أصناف (classes)، وهو ما سنَتَعلَّمه بالفصل الخامس. تَتَوفَّر مع ذلك طريقة آخرى وهي التعدادات (enumerated types - enums) سنناقشها خلال هذا القسم.
</p>

<p>
	تقنيًا، يُعدّ أي تعداد (enum) نوعًا خاصًا من صَنْف (class)، ولكن هذا غَيْر مُهِمّ في الوقت الحالي. سنَفْحَص خلال هذا القسم التعدادات بصيغتها البسيطة (simplified form)، والمُستخدَمة عمليًا في غالبية الحالات.
</p>

<p>
	أي تعداد (enum) هو عبارة عن نوع (type) يَتَضمَّن قائمة ثابتة مُكوَّنة من قيمه المُحتمَلة تُخصَّص عند إِنشاء نوع التعداد. بشكل ما، تُشبه أنواع التعداد (enum) النوع <code>boolean</code> والتي قيمه المحتملة هي <code>true</code> و <code>false</code> فقط. لكن لاحِظ أن النوع <code>boolean</code> هو نوع أساسي (primitive type) أما أنواع التعداد (enums) فليست كذلك.
</p>

<p>
	يُكْتَب تعريف تعداد (enum definition) معين بالصيغة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_29" style="">
<span class="kwd">enum</span><span class="pln"> </span><span class="pun">&lt;</span><span class="kwd">enum</span><span class="pun">-</span><span class="pln">type</span><span class="pun">-</span><span class="pln">name</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">&lt;</span><span class="typ">list</span><span class="pun">-</span><span class="pln">of</span><span class="pun">-</span><span class="kwd">enum</span><span class="pun">-</span><span class="pln">values</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	لا يُمكِنك كتابة ذلك التعريف (definition) داخل أي برنامج فرعي (subroutine)، لذا قد تَضَعه خارج البرنامج <code>main()‎</code> أو حتى بملف آخر مُنفصِل. تُشير <strong><enum-type-name></enum-type-name></strong> إلى اسم نوع التعداد (enum) بنفس الطريقة التي تُشير بها كلمات مثل "boolean" و "String" إلى النوع <code>boolean</code> والنوع <code>String</code> على الترتيب. يُمكِننا أن نَستخدِم أي مُعرّف بسيط (simple identifier) كاسم لنوع التعداد. أما <strong><list-of-enum-values></list-of-enum-values></strong> فتُشير إلى قيم التعداد المُحتمَلة وتَتَكوَّن من قائمة من المُعرّفات (identifiers) يَفصِل بينها فاصلة (comma). يُعرِّف المثال التالي نوع تعداد (enum) اسمه هو <code>Season</code> وقيمه المُحتمَلة هي أسماء فصول السنة الأربعة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_31" style="">
<span class="kwd">enum</span><span class="pln"> </span><span class="typ">Season</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> SPRING</span><span class="pun">,</span><span class="pln"> SUMMER</span><span class="pun">,</span><span class="pln"> FALL</span><span class="pun">,</span><span class="pln"> WINTER </span><span class="pun">}</span></pre>

<p>
	عادةً ما تُكْتَب القيم المُحتمَلة لنوع التعداد (enum) بحروف كبيرة (upper case)، لكنه ليس أمرًا ضروريًا فهو ليس ضِمْن قواعد الصيغة (syntax rules). تُعدّ القيم المُحتمَلة لتعداد معين ثوابتًا (constants) لا يُمكِن تعديلها، وعادةً ما يُطلَق عليها اسم ثوابت التعداد (enum constants).
</p>

<p>
	لأن ثوابت التعداد لنوع مثل <code>Season</code> مُعرَّفة داخله، لابُدّ من أن نُشير إليها باستخدام أسماء مركبة مُكوَّنة من اسم النوع المُتْضمِّن ثم نقطة ثم اسم ثابت التعداد كالتالي: <code>Season.SPRING</code> و <code>Season.SUMMER</code> و <code>Season.FALL</code> و <code>Season.WINTER</code>.
</p>

<p>
	بمُجرّد إنشاء نوع تعداد (enum)، تستطيع أن تَستخدِمه للتَصْرِيح (declare) عن مُتْغيِّرات بنفس الطريقة التي تُصرِّح بها عن مُتْغيِّرات من أي أنواع آخرى. يمكنك مثلًا أن تُصرِّح عن مُتْغيِّر اسمه <code>vacation</code> من النوع <code>Season</code> باستخدام التَعْليمَة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_33" style="">
<span class="typ">Season</span><span class="pln"> vacation</span><span class="pun">;</span></pre>

<p>
	بعد التَصْرِيح عن مُتْغيِّر، يُمكِنك أن تُسنِد (assign) إليه قيمة باستخدام تَعْليمَة إِسْناد (assignment statement). يُمكن لتلك القيمة -على يمين عامل الإِسْناد- أن تَكُون أي من ثوابت التعداد من النوع <code>Season</code>. تَذَكَّر أنه لابُدّ من اِستخدَام الاسم الكامل لثابت التعداد بما في ذلك اسم النوع <code>Season</code>. اُنظر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_35" style="">
<span class="pln">vacation </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Season</span><span class="pun">.</span><span class="pln">SUMMER</span><span class="pun">;</span></pre>

<p>
	يُمكِنك أن تَستخدِم تَعْليمَة طباعة عادية مثل <code>System.out.print(vacation)‎</code> لطباعة قيمة تعداد، وتَكُون القيمة المطبوعة عندها عبارة عن اسم ثابت التعداد (enum constant) بدون اسم نوع التعداد أي سيَكُون الخَرْج في هذه الحالة هو "SUMMER".
</p>

<p>
	لأن التعداد (enum) هو عبارة عن صَنْف (class) تقنيًا، فلابُدّ إذًا من أن تَكُون قيم التعداد (enum value) عبارة عن كائنات (objects) وبالتالي يُمكِنها أن تَحتوِي على برامج فرعية (subroutines). أحد البرامج الفرعية المُعرَّفة بأي قيمة تعداد من أي نوع هي <code>ordinal()‎</code> والتي تُعيد العدد الترتيبي (ordinal number) لتلك القيمة بقائمة القيم المُحتمَلة لذلك التعداد. يُشير العدد الترتيبي ببساطة إلى مَوضِع القيمة بالقائمة، فمثلًا، يُعيد <code>Season.SPRING.ordinal()‎</code> قيمة من النوع <code>int</code> تُساوِي صفر أما <code>Season.SUMMER.ordinal()‎</code> فيُعيد ١ أما <code>Season.FALL.ordinal()‎</code> فيُعيد ٢ وأخيرًا <code>Season.WINTER.ordinal()‎</code> يُعيد ٣. يمكنك بالطبع أن تَستخدِم التابع (method‏) <code>ordinal()‎</code> مع مُتْغيِّر من النوع <code>Season</code> مثل <code>vacation.ordinal()‎</code>.
</p>

<p>
	يُساعد اِستخدَام أنواع التعداد (enums) على كتابة شيفرة مقروءة؛ لأنك ستَستخدِم بطبيعة الحال أسماءً ذات مغزى لقيم التعداد. علاوة على ذلك، يَفْحَص المُصرِّف (compiler) ما إذا كانت القيم المُسنَدة لمُتْغيِّر تعداد معين قيمًا صالحة أم لا مما يُجنِّبك أنواعًا مُحدَّدة من الأخطاء. وفي العموم، ينبغي أن تُدرك أهمية التعدادات (enums) بعدّها الطريقة الأولى لإنشاء أنواع (types) جديدة. يُوضِح المثال التالي كيفية اِستخدَام أنواع التعداد ضِمْن برنامج كامل:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6719_37" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">EnumDemo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

       </span><span class="com">// ‫عرف نوعين تعداد خارج البرنامج main</span><span class="pln">

    </span><span class="kwd">enum</span><span class="pln"> </span><span class="typ">Day</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> SUNDAY</span><span class="pun">,</span><span class="pln"> MONDAY</span><span class="pun">,</span><span class="pln"> TUESDAY</span><span class="pun">,</span><span class="pln"> WEDNESDAY</span><span class="pun">,</span><span class="pln"> THURSDAY</span><span class="pun">,</span><span class="pln"> FRIDAY</span><span class="pun">,</span><span class="pln"> SATURDAY </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">enum</span><span class="pln"> </span><span class="typ">Month</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> JAN</span><span class="pun">,</span><span class="pln"> FEB</span><span class="pun">,</span><span class="pln"> MAR</span><span class="pun">,</span><span class="pln"> APR</span><span class="pun">,</span><span class="pln"> MAY</span><span class="pun">,</span><span class="pln"> JUN</span><span class="pun">,</span><span class="pln"> JUL</span><span class="pun">,</span><span class="pln"> AUG</span><span class="pun">,</span><span class="pln"> SEP</span><span class="pun">,</span><span class="pln"> OCT</span><span class="pun">,</span><span class="pln"> NOV</span><span class="pun">,</span><span class="pln"> DEC </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

         </span><span class="typ">Day</span><span class="pln"> tgif</span><span class="pun">;</span><span class="pln">     </span><span class="com">// صرح عن متغير من النوع‫ Day</span><span class="pln">
         </span><span class="typ">Month</span><span class="pln"> libra</span><span class="pun">;</span><span class="pln">  </span><span class="com">// ‫صرح عن متغير من النوع Month</span><span class="pln">

         tgif </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Day</span><span class="pun">.</span><span class="pln">FRIDAY</span><span class="pun">;</span><span class="pln">    </span><span class="com">// ‫أسند قيمة من النوع Day إلى tgif</span><span class="pln">
         libra </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Month</span><span class="pun">.</span><span class="pln">OCT</span><span class="pun">;</span><span class="pln">    </span><span class="com">// ‫أسند قيمة من النوع Month إلى libra</span><span class="pln">

         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"My sign is libra, since I was born in "</span><span class="pun">);</span><span class="pln">
        </span><span class="com">// ‫قيمة الخرج ستكون OCT</span><span class="pln">
         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">libra</span><span class="pun">);</span><span class="pln">   
         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"That's the "</span><span class="pun">);</span><span class="pln">
         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="pln"> libra</span><span class="pun">.</span><span class="pln">ordinal</span><span class="pun">()</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"-th month of the year."</span><span class="pun">);</span><span class="pln">
         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"   (Counting from 0, of course!)"</span><span class="pun">);</span><span class="pln">

         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Isn't it nice to get to "</span><span class="pun">);</span><span class="pln">
         </span><span class="com">// ‫قيمة الخرج ستكون:  FRIDAY</span><span class="pln">
         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">tgif</span><span class="pun">);</span><span class="pln">   

         </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln"> tgif </span><span class="pun">+</span><span class="pln"> </span><span class="str">" is the "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> tgif</span><span class="pun">.</span><span class="pln">ordinal</span><span class="pun">()</span><span class="pln"> 
                                            </span><span class="pun">+</span><span class="pln"> </span><span class="str">"-th day of the week."</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	كما ذَكَرنا مُسْبَقًا، يُمكِنك أن تُعرِّف التعدادات (enum) بملفات مُنفصِلة. لاحظ أن البرنامج <code>SeparateEnumDemo.java</code> هو نفسه البرنامج <code>EnumDemo.java</code> باستثناء أن أنواع التعداد المُستخدَمة قد عُرِّفت بملفات مُنفصلة هي <code>Month.java</code> و <code>Day.java</code>.
</p>

<p>
	ترجمة -بتصرّف- للقسم <a href="http://math.hws.edu/javanotes/c2/s3.html" rel="external nofollow">Section 3: Strings, Classes, Objects, and Subroutines</a> من فصل Chapter 2: Programming in the Small I: Names and Things من كتاب <a href="http://math.hws.edu/javanotes/index.html" rel="external nofollow">Introduction to Programming Using Java</a>.
</p>

<p>
	 
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%88%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%84%D8%B1%D8%AD%D9%84%D8%AA%D9%83-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r206/" rel="">كيف تتعلم البرمجة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1017</guid><pubDate>Wed, 07 Oct 2020 13:09:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x628;&#x633;&#x64A;&#x637;&#x629; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D8%B3%D9%8A%D8%B7%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-r1016/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/9.png.e8168e9b860321546cd499239fc7a0d9.png" /></p>

<p>
	تُعدّ الأسماء واحدة من أساسيات البرمجة حيث تُستخدَم بالبرامج للإشارة إلى كثير من الأشياء المختلفة. لابُدّ من فهم قواعد تَسْمية الأشياء وطريقة اِستخدَام الأسماء لكي تَتَمكَّن من اِستخدَام الأشياء أي تحتاج في العموم إلى فهم كُلًا من صيغة (syntax) الأسماء ودلالتها (semantics).
</p>

<p>
	وفقًا لقواعد الصيغة (syntax rules) بالجافا، المُعرّفات (identifiers) واحدة من أبسط الأسماء، وتُستخدَم لتسمية كُلًا من الأصناف (classes) والمُتْغيِّرات (variables) والبرامج الفرعية (subroutines). يَتَكوَّن أي مُعرّف من متتالية تتألف من محرف (character) واحد أو أكثر بشَّرْط أن يَكُون أول محرف حرفًا أبجديًا (letter) أو شرطة سفلية (underscore) <code>_</code>، وأن تَكوُن المتتالية بالكامل مُكوَّنة من حروف أبجدية وأرقام (digits) وشرط سفلية فقط. اُنظر الأمثلة التالية لأسماء مُعرّفات (identifiers) صالحة:
</p>

<pre class="ipsCode">
N   n   rate  x15   quite_a_long_name   HelloWorld
</pre>

<p>
	لا يُسمَح للمسافات الفارغة (spaces) بأن تَكُون جزءًا من اسم أي مُعرّف، فمثلًا، في حين تستطيع اِستخدَام HelloWorld كاسم مُعرّف، لا يُمكِنك أن تَستخدِم "Hello World". تختلف كذلك الحروف الكبيرة عن الحروف الصغيرة فيما يَتَعلَّق بالتسمية أي أن الأسماء HelloWorld و helloworld و HELLOWORLD و hElloWorLD هي أسماء مُعرّفات مختلفة. بالإضافة إلى ذلك، لا يُمكِنك اِستخدَام الكلمات المحجوزة (reserved) المُخصَّصة لأغراض خاصة بالجافا كأسماء مُعرِّفات مثل الكلمات class و public و static و if و else و while وعشرات من الكلمات الآخرى. لاحِظ أن الكلمات المحجوزة ليست مُعرّفات فهي لا تُستخدَم كأسماء تُشير إلى أشياء.
</p>

<p>
	تَستخدِم الجافا محارف اليونيكود (Unicode character set) والتي تَتَضمَّن آلافًا من المحارف والحروف الأبجدية (alphabets) من مختلف اللغات. تُعدّ كثير من تلك المحارف بمثابة حروف أبجدية أو أرقام. سنَقْتصِر عمومًا على اِستخدَام المحارف المُتوفِّرة بأي لوحة مفاتيح إنجليزية عادية فقط.
</p>

<p>
	هنالك بعض الاصطلاحات والقواعد الإرشادية التي ينبغي اتباعها في العموم عند تَسْمية (naming) الأشياء. أولًا، تبدأ أسماء الأصناف (classes) بحروف كبيرة (upper case) بعكس أسماء كُلًا من المُتْغيِّرات (variables) والبرامج الفرعية (subroutines) والتي تبدأ عادةً بحروف صغيرة (lower case). يُساعِد الالتزام بذلك التَقْليد (convention) على تَجنُّب أي خلط مُحتمَل. ثانيًا، لا يَستخدِم غالبية مُبرمجي الجافا الشُرط السُفليّة (underscores) بالأسماء مع أن البعض يلجأ إلى اِستخدَامها ببداية أسماء أنواع مُحدَّدة من المُتْغيِّرات (variables). ثالثًا، إذا كان الاسم مُكوَّن من عدة كلمات مثل HelloWorld أو interestRate، فيُعتاد تَكْبير الحرف الأول (capitalize) من كل كلمة باستثناء الأولى فيما يُعرَف باسم نَمْط سنام الجمل (camelCase) حيث تُشبه الحروف الأبجدية الكبيرة (upper case) بمنتصف الاسم سنام الجمل.
</p>

<p>
	بالإضافة إلى الأسماء البسيطة (simple names)، قد تَكُون الأسماء أيضًا مُركَّبة من عدة أسماء بسيطة يَفصِل بين كُلًا منها نقطة (period) مثل الاسم <code>System.out.println</code>، وتُعرَف باسم "الأسماء المُؤهلة (qualified names)". لأن الجافا تَسمَح بتَضْمِين الأشياء ضِمْن بعضها البعض، فإن الاسم المُركَّب يَعمَل كمسار إلى شيء عبر واحد أو أكثر من مستويات الاحتواء (containment level)، فمثلًا يُشير الاسم <code>System.out.println</code> إلى شيء اسمه <code>System</code> يحتوي على شيء آخر اسمه <code>out</code> والذي بدوره يحتوي على شيء اسمه <code>printn</code>.
</p>

<h2>
	المتغيرات (variables)
</h2>

<p>
	تُستخدَم البرامج في العموم لمُعالجة البيانات المُخزَّنة بذاكرة الحاسوب. إذا كنا نُبرمج باِستخدَام لغة الآلة (machine language)، فإننا نَكُون مُضطرّين لاِستخدَام العنوان العددي (numerical memory address) لمَوضِع الذاكرة لكي نَتَمكَّن من الإشارة إلى البيانات المُخزَّنة به أما باللغات عالية المستوى (high-level language) مثل الجافا، فإننا في العموم نَستخدِم أسماءً وليس أعدادًا للإشارة إلى بيانات الذاكرة أي لا يحتاج المبرمج إلى ما هو أكثر من تَذكُّر تلك الأسماء، والتي يُطلَق عليها اسم "المُتْغيِّرات (variables)"، وفي المقابل، يَتعقَب الحاسوب مواضع الذاكرة الفعليّة لتلك البيانات.
</p>

<p>
	لا يُعدّ المُتْغيِّر (variable) اسمًا للبيانات نفسها وإنما لمَوضِع الذاكرة الحامل لتلك البيانات أي أنه يَعمَل كصندوق أو كحاوي يُمكِنك أن تُخزِّن به بعض البيانات التي قد تحتاج إليها لاحقًا. يُشير أي مُتْغيِّر إذًا إلى صندوق بصورة مباشرة وإلى البيانات الموجودة بذلك الصندوق بصورة غير مباشرة. لمّا كانت البيانات المُخزَّنة بالصندوق قابلة للتَعْديل، فقد يشير مُتْغيِّر معين إلى بيانات مختلفة بلحظات مختلفة من تّنْفيذ البرنامج، ولكنه دائمًا ما سيُشير إلى نفس الصندوق. عندما نَستخدِم مُتْغيِّرًا ضِمْن برنامج، فإنه -وبحسب الطريقة التي اُستخدِم بها ذلك المُتْغيِّر- إما يُشير إلى صندوق وإما إلى البيانات المُخزَّنة بذلك الصندوق، وهو ما قد يَكُون مُربِكًا لبعض المبرمجين المبتدئين. سنَفْحَص أمثلة لكلا الحالتين بالأسفل.
</p>

<p>
	تُستخدَم تَعْليمَات الإسناد (assignment statement) بالجافا لتَخْزين بيانات معينة بمُتْغيِّر أي بصندوق، وتُكْتَب على النحو التالي:
</p>

<pre class="ipsCode">
&lt;variable&gt; = &lt;expression&gt;;
</pre>

<p>
	يُمثِل التعبير <strong><expression></expression></strong> -بالأعلى- أي شيء طالما كان يُشير إلى قيمة بيانات أو يَحسِبها. عندما يُنفِّذ الحاسوب تَعْليمَة إسناد معينة، فإنه يُحصِّل (evaluates) قيمة ذلك التعبير ثم يُخزِّنها بالمُتْغيِّر <strong><variable></variable></strong>. اُنظر تَعْليمَة الإسناد (assignment statement) التالية على سبيل المثال:
</p>

<pre class="ipsCode">
rate = 0.07;
</pre>

<p>
	بالتَعْليمَة السابقة، يُمثِل <code>rate</code> المُتْغيِّر <strong><variable></variable></strong> أما القيمة <code>0.07</code> فتُمثِل التعبير <strong><expression></expression></strong>. تُخزِّن تَعْليمَة الإسناد السابقة القيمة <code>0.07</code> بالمُتْغيِّر <code>rate</code> بحيث تحلّ تلك القيمة محلّ قيمته السابقة. سنَفْحَص الآن مثالًا آخر لتَعْليمَة إِسناد أكثر تعقيدًا بقليل، والتي سنحتاج إليها لاحقا ضِمْن البرنامج:
</p>

<pre class="ipsCode">
interest = rate * principal;
</pre>

<p>
	تُسنِد تَعْليمَة الإسناد (assignment statement) بالأعلى قيمة التعبير <code>rate * principal</code> إلى المُتْغيِّر <code>interest</code>. يُشير المحرف <code>*</code> الموجود بالتعبير إلى "عامِل حاصل الضرب (multiplication operator)" المسئول عن حساب حاصل ضرب <code>rate</code> في <code>principal</code>. لمّا كانت الأسماء <code>rate</code> و <code>principal</code> ضِمْن التعبير هي نفسها مُتْغيِّرات، يُحسَب حاصل ضرب القيم المُخزَّنة بتلك المُتْغيِّرات أي يُحسَب حاصل ضرب قيمة <code>rate</code> في قيمة <code>principal</code> ثم تُخزَّن الإجابة بالصندوق الذي يُشير إليه <code>interest</code>. نستطيع أن نقول إذًا أنه وفي العموم عندما نَستخدِم مُتْغيِّرًا ضِمْن تعبير (expression)، فإن القيمة المُخزَّنة بذلك المُتْغيِّر هي كل ما يُهِمّ، ويبدو المُتْغيِّر في تلك الحالة كما لو كان يُشير إلى بيانات الصندوق وليس الصندوق ذاته. في المقابل، عندما نَستخدِم مُتْغيِّرًا على الجانب الأيسر من تَعْليمَة إسناد، فإنه في تلك الحالة يُشير إلى الصندوق ذاته المُمثِل لذلك المُتْغيِّر.
</p>

<p>
	تَعْليمَات الإِسناد ليست تَعْليمَات خبرية، وإنما هي بمثابة أوامر يُنفِّذها الحاسوب بأوقات محددة. لنَفْترِض مثلً أن برنامجًا معينًا يُنفِّذ التَعْليمَة <code>rate = 0.07;‎</code> ثم يُنفِّذ التَعْليمَة <code>interest = rate * principal;‎</code> بوقت لاحق ضِمْن البرنامج، هل يُمكِننا ببساطة أن نَدعِي أننا قد ضربنا <code>principal</code> بالقيمة <code>0.07</code>؟ في الواقع لا! لأن قيمة <code>rate</code> قد تَتَغيَّر في أي لحظة بواسطة تَعْليمَة إِسناد آخرى. يختلف معنى تَعْليمَة الإِسناد تمامًا عن معنى أي معادلة رياضية على الرغم من أن كليهما يَستخدِم الرمز <code>=</code>.
</p>

<h2>
	الأنواع (types)
</h2>

<p>
	يُمكِن لأي مُتْغيِّر (variable) بالجافا أن يَحمِل نوعًا (type) واحدًا فقط من البيانات وليس أي نوع آخر. إذا حاولت أن تُسنِد (assigning) قيمة من نوع مختلف عن نوع مُتْغيِّر معين إلى ذلك المُتْغيِّر، فسيُعدّ ذلك انتهاكًا لتلك القاعدة، وسيُبلِّغ عنه المُصرِّف (compiler) على أساس كَوْنه خطأ في بناء الجملة (syntax error). نقول إذًا أن الجافا هي لغة صارمة في تَحْديد النوع (strongly typed language).
</p>

<p>
	تُوفِر الجافا 8 أنواع أساسية (primitive types) مَبنية مُسْبَقًا هي كالتالي: <code>byte</code> و <code>short</code> و <code>int</code> و <code>long</code> و <code>float</code> و <code>double</code> و <code>char</code> و <code>boolean</code>. تَحمِل الأنواع الأربعة الأولى أعدادًا صحيحة (integers) مثل <code>17</code> و <code>‎-38477</code> و <code>0</code>، ولكنها تختلف عن بعضها فيما يَتعَلَّق بنطاق الأعداد الصحيحة التي يُمكِن لكل نوع منها حَمْله. في المقابل، يَحمِل النوعان <code>float</code> و <code>double</code> أعدادًا حقيقية (real numbers) مثل <code>3.6</code> و <code>‎-145.99</code>، ويختلفان عن بعضهما بكُلًا من نطاق الأعداد المسموح به وبدقة العَدَد. تستطيع المُتْغيِّرات من النوع <code>char</code> أن تَحمِل إحدى محارف اليونيكود (Unicode character set) أما المُتْغيِّرات من النوع <code>boolean</code> فتَحمِل إما القيمة المنطقية <code>true</code> أو القيمة <code>false</code>.
</p>

<p>
	تُمثَل جميع قيم البيانات بذاكرة الحاسوب بهيئة عدد من النظام الثُنائي (binary number) عبارة عن سِلسِلة نصية (string) مُكوَّنة من الرقمين صفر وواحد. يُطلَق اسم "بت (bit)" على كُلًا منها بينما يُطلَق اسم "بايت (byte)" على أي سِلسِلة نصية مُكوَّنة من ٨ بتات، وتُقاس الذاكرة عادةً بتلك الوحدة. يُشير النوع <code>byte</code> إلى بايت واحد فقط بالذاكرة أي تَحمِل المُتْغيِّرات (variable) من النوع <code>byte</code> سِلسِلة نصية من ٨ بتات يُمكِنها أن تُمثِل ٢٥٦ عددًا صحيحًا (٢ مرفوعة للأس ٨) أي قد تُمثِل أي عدد صحيح بين -١٢٨ و ١٢٧. أما بالنسبة للأنواع الصحيحة (integer) الآخرى:
</p>

<ul>
<li>
		<code>short</code> يُمثِل ٢ بايت (١٦ بت)، وتَحمِل المُتْغيِّرات من النوع <code>short</code> قيم ضِمْن نطاق يتراوح من <code>‎-32768</code> إلى <code>32767</code>.
	</li>
	<li>
		<code>int</code> يُمثِل ٤ بايت (٣٢ بت)، وتَحمِل المُتْغيِّرات من النوع <code>int</code> قيم تتراوح من ‎<code>-2147483648</code> إلى <code>2147483647</code>.
	</li>
	<li>
		<code>long</code> يُمثِل ٨ بايت (٦٤ بت)، وتَحمِل المُتْغيِّرات من النوع <code>long</code> قيم بنطاق يتراوح من <code>‎-9223372036854775808</code> إلى <code>9223372036854775807</code>.
	</li>
</ul>
<p>
	لا تحتاج إلى تَذكُّر كل تلك الأعداد بالأعلى، فالغرض منها فقط هو إِعطائك فكرة عن حجم الأعداد الصحيحة التي يُمكِن لكل نوع أن يَحمِلها. وفي العموم عادةً ما يُستخدَم النوع <code>int</code> لتمثيل أي قيمة عددية صحيحة لأنه جيد كفاية لغالبية الأغراض.
</p>

<p>
	أما النوع <code>float</code> فيَستخدِم طريقة ترميز (encoding) قياسية لتمثيل الأعداد الحقيقية (real) بمساحة ٤ بايت من الذاكرة، ويُمكِنه أن يَحمِل قيمة قصوى تَصِل إلى ١٠ مرفوعة للأس ٣٨. علاوة على ذلك، يُمكِن للقيم من النوع <code>float</code> أن تَشتمِل على ٧ أرقام معنوية (significant digits) بحد أقصى. لابُدّ إذًا من تَقْرِيب كُلًا من العددين <code>32.3989231134</code> و <code>32.3989234399</code> إلى العَدَد <code>32.398923</code> حتى نَتَمكَّن من تَخْزِينه بمُتْغيِّر من النوع <code>float</code>. في المقابل، يُمثِل النوع <code>double</code> الأعداد الحقيقية بمساحة ٨ بايت، لذا يُمكِنه أن يَحمِل قيمة قصوى تَصِل إلى ١٠ مرفوعة للأس ٣٠٨، وقد يَشتمِل على ١٥ رقم معنوي (significant digit). في العموم عادةً ما يُستخدَم النوع <code>double</code> لتمثيل قيم الأعداد الحقيقية.
</p>

<p>
	أما المُتْغيِّرات من النوع <code>char</code> فتَحتلّ مساحة ٢ بايت من الذاكرة، وتَحمِل محرفًا وحيدًا مثل <code>"A"</code> أو <code>"*"</code> أو <code>"x"</code> أو مسافة فارغة (space) أو محرفًا خاصًا مثل المحرف "tab" أو محرف "العودة إلى بداية السطر (carriage return)" أو إحدى محارف اليونيكود (Unicode character) بلغات مختلفة. يَستخدِم النوع <code>char</code> ترميزًا عدديًا صحيحًا (integer code number) مُكوَّن من ١٦ بت لتمثيل أي محرف، لذلك فإنه قيمه تُعدّ مرتبطة نوعًا ما بقيم الأعداد الصحيحة (integer)، وسنرى لاحقًا أنه يُمكِننا حتى اِستخدَامها كما لو كانت أعدادًا صحيحة بمواقف معينة.
</p>

<p>
	لمّا كان الحاسوب يَستخدِم عددًا مُحدّدًا ومُتناهيًا (finite) من البتات لتمثيل قيمة أي نوع أساسي (primitive type)، فلا يُمكِن إذًا لقيم النوع <code>int</code> أن تُمثِل أي عدد صحيح عشوائي بل لابُدّ أن يَقَع العََدَد الصحيح ضِمْن نطاق مُحدّد ومُتناهي من القيم. بالمثل، يُمكِن للمُتْغيِّرات من النوعين <code>float</code> و <code>double</code> أن تَحمِل قيمًا محددة فقط أي أنها ليست أعدادًا حقيقية فعليًا بالمفهوم الرياضي. فمثلًا، لأن الثابت الرياضي <code>π</code> يَتَطلّب عددًا لامُتناهيًا من الأرقام العشرية لتمثيله، فلابُدّ من تقريبه أولًا قبل تَخْزِينه بمُتْغيِّر من النوع <code>float</code> أو النوع <code>double</code>. بالمثل، لابُدّ من تقريب الأعداد البسيطة مثل <code>1/3</code> قبل تَخْزِينها بمُتْغيِّرات من النوع <code>float</code> و <code>double</code>.
</p>

<h2>
	القيم مصنَّفة النوع (literals)
</h2>

<p>
	تُخزَّن أي بيانات بالحاسوب كمتتالية من البتات (bits). بالنسبة للقيم الثابتة (constant values)، فإنها تُمثَل باستخدَام ما يُعرَف باسم "القيم مُصنَّفة النوع (literals)"، والتي هي عبارة عن شيء يُمكِنك كتابته لتمثيل قيمة أي يُمكِن عدّه اسمًا لقيمة ثابتة.
</p>

<p>
	لكتابة قيمة من النوع <code>char</code> على سبيل المثال، لابُدّ من إحاطتها بعلامتي اقتباس مُفرّدتين مثل <code>'A'</code> و <code>'*'</code> و <code>'x'</code>. يُشكِّل المحرف وعلامتي الاقتباس معًا "قيمة مُصنَّفة النوع (literal)" من النوع <code>char</code>. بدون علامتي الاقتباس، سيُمثِل <code>A</code> مُعرّفًا (identifier) أما <code>*</code> فستُمثِل عامل حاصل الضرب (multiplication operator). إذا كنت تريد أن تُخزِّن المحرف <code>A</code> بمُتْغيِّر <code>ch</code> من النوع <code>char</code>، فيُمكِنك أن تَستخدِم تَعْليمَة الإِسناد (assignment statement) التالية. لا تُعدّ علامتي الاقتباس جزءًا من القيمة ولا تُخزَّن بالمُتْغيِّر (variable)، فهي فقط نَمْط لتسمية الثوابت المحرفية (character constant):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8736_7" style="">
<span class="pln">ch </span><span class="pun">=</span><span class="pln"> </span><span class="str">'A'</span><span class="pun">;</span></pre>

<p>
	تَستخدِم بعض المحارف الخاصة قيمًا خاصة مُصنَّفة النوع (literals) تَتَضمَّن خطًا مائلًا عكسيًا (backslash) يَعمَل كمحرف هروب (escape character)، فمثلًا، يُمثِل <code>'‎\t'</code> المحرف "tab"، ويُمثِل <code>'‎\r'</code> محرف العودة إلى بداية السطر (carriage return)، ويُمثِل <code>'‎\n'</code> محرف إضافة سطر جديد، ويُمثِل <code>''\'</code> علامة اقتباس مُفردة، ويُمثِل <code>'‎\\'</code> محرف خط مائل عكسي (backslash). يَتَكوَّن كُلًا منها من محرفين إلى جانب علامتي الاقتباس، ومع ذلك فإنه يُشير إلى محرف واحد فقط، فمثلًا تُشير القيمة مُصنَّفة النوع <code>'‎\t'</code> إلى محرف "tab" واحد فقط.
</p>

<p>
	قد تَكُون القيم العَدَدية مُصنَّفة النوع (Numeric literals) أعقد قليلًا مما تَتَوقَّع. هنالك بالطبع أمثلة واضحة مثل <code>317</code> و <code>17.42</code>، ولكن هنالك احتمالات وطرائق أخرى لتمثيل الأعداد بلغة الجافا. أولًا، قد تُستخدَم صيغة أُسية (exponential form) لتمثيل الأعداد الحقيقية مثل <code>1.3e12</code> أو <code>12.3737e-108</code> حيث "e12" و "e-108" هي أسس للعدد ١٠ أي يُكافئ العدد <code>1.3e12</code> حاصل ضرب ١,٣ في <sup>١٢</sup>١٠‏‏ أما العدد <code>12.3737e-108</code> فيُكافئ حاصل ضرب ١٢,٣٧٣٧ في ‎١٠<sup>-١٠٨</sup>. عادةً ما تُستخدَم هذه الصيغة للتعبير عن الأعداد الصغيرة جدًا أو الكبيرة جدًا. ثانيًا، قد تحتوي بعض القيم العددية مُصنَّفة النوع (numeric literal) على علامة عشرية (decimal point) أو على أس (exponential)، وتُعدّ عندها قيمًا من النوع <code>double</code> أتوماتيكيًا أما إذا أردت أن تُنشِيء قيمة مُصنَّفة من النوع <code>float</code>، فينبغي أن تضيف الحرف <code>"f"</code> أو <code>"F"</code> إلى نهاية العدد، فتُمثِل <code>"1.2F"</code> مثلًا قيمة من النوع <code>float</code> تُساوِي <code>1.2</code>. ولأن الجافا لا تَسمَح بإسناد (assign) قيمة من النوع <code>double</code> لمُتْغيِّر من النوع <code>float</code>، فستُواجهك رسالة خطأ سخيفة نوعًا ما إذا حاولت أن تقوم بشيء مثل <code>x = 1.2;‎</code> عندما يَكُون <code>x</code> مُتْغيِّر من النوع <code>float</code>، وعندها يَنبغي أن تُضيف الحرف <code>"F"</code> بالنهاية كالتالي <code>x = 1.2F;‎</code>. حاول عمومًا أن تَستخدِم النوع <code>double</code> لتمثيل الأعداد الحقيقية بالبرامج الخاصة بك.
</p>

<p>
	أما بالنسبة لقيم الأعداد الصحيحة مُصنَّفة النوع (integer literals)، فهنالك أعداد صحيحة عادية مثل <code>177777</code> و <code>‎-32</code> والتي إما أن تَكُون من النوع <code>byte</code> أو النوع <code>short</code> أو النوع <code>int</code> بحسب حجمها. في المقابل، يُمكِنك أن تُنشِيء قيمة مُصنَّفة النوع (literal) من النوع <code>long</code> بإضافة الحرف <code>"L"</code> بنهاية العدد مثل <code>17L</code> أو <code>728476874368L</code>. تَسمَح الجافا أيضًا باستخدام قيم عددية ثنائية (binary) أو ثُمانيّة (octal) أو ست عشريّة (hexadecimal) مُصنَّفة النوع. لن نناقش أيًا منها على نحو تفصيلي وإنما سنَكتفِي بالنقاط التالية: أولًا، تَقْتصِر الأعداد الثُمانيّة (octal numbers) على الأرقام العشرية من ٠ إلى ٧ فقط، وتبدأ أي قيمة ثُمانيّة مُصنَّفة النوع (octal literal) بصفر مثل القيمة <code>045</code> والتي تُمثِل العدد <code>37</code> وليس العدد <code>45</code>. نادرًا ما تُستخدَم الأعداد الثُمانيّة ومع ذلك تذكَّر على الأقل أنها تبدأ بصفر. ثانيًا، تَتَكوَّن الأعداد الست عشرية (Hexadecimal numbers) من ‏١٦ رقم هي الأرقام العشريّة العادية من ٠ إلى ٩ بالإضافة إلى الحروف A و B و C و D و E و F وبحيث تُمثِل تلك الحروف القيم من ١٠ إلى ١٥ على التوالي. لاحِظ أن الحروف الصغيرة (lower case letters) من <code>a</code> وحتى <code>f</code> لها نفس قيمة نظيراتها من الحروف الكبيرة (upper case). تبدأ القيم الست عشرية مُصنَّفة النوع (hexadecimal literal) بالجافا باستخدام <code>0x</code> أو <code>0X</code> مثل <code>0x45</code> أو <code>0xFF7A</code>. وأخيرًا، تبدأ القيم الثنائية مُصنَّفة النوع (binary literals) باستخدام <code>0b</code> أو <code>0B</code>، وتَتَكوَّن من الرقمين ٠ و ١ فقط مثل <code>0b10110</code>.
</p>

<p>
	قد تحتوي القيم العددية مُصنَّفة النوع (numeric literals) على محرف شرطة سفلية (underscores) <code>"_"</code> لفَصْل مجموعات الأرقام (digits) عن بعضها وبدون أي قاعدة فيما يَتَعلَّق بعَدَد الأرقام ضِمْن كل مجموعة. يُمكِننا مثلًا كتابة الثابت العددي ٢ بليون بهيئة ‎<code>2_000_000_000</code> بدلًا من <code>2000000000</code> مما يُسهِل من قراءة العدد. تَبرُز أهمية الشُرَط السفليّة على نحو أكبر عند اِستخدَامها بالأعداد الثنائية (binary numbers) الطويلة مثل <code>0b1010_1100_1011</code>.
</p>

<p>
	تُستخدَم الأعداد الست عشرية (hexadecimal numbers) أيضًا كقيم محرفية مُصنَّفة النوع (character literals) لتمثيل بعض محارف اليونيكود (unicode characters). تَتَكوَّن أي قيمة يونيكود مُصنَّفة النوع (unicode literal) من ‎\u متبوعة بأربعة أرقام ست عشريّة. تُمثِل مثلًا القيمة المحرفية مُصنَّفة النوع <code>'‎\u00E9'</code> محرف يونيكود هو الحرف <code>"é"</code>.
</p>

<p>
	أخيرًا، بالنسبة للنوع <code>boolean</code>، فتُستخدَم القيمتين <code>true</code> و <code>false</code> كقيم مُصنَّفة النوع (literal)، وتُكْتَب على نفس هذه الهيئة بدون علامتي اقتباس مع أنها تُمثِل قيم لا مُتْغيِّرات (variables). عادةً ما تُستخدَم القيم المنطقية كقيم للتعبيرات الشرطية (conditional expressions) كالمثال التالي:
</p>

<pre class="ipsCode">
rate &gt; 0.05
</pre>

<p>
	يُعيد التعبير المنطقي (boolean-valued expressions) السابق قيمة إما تُساوِي <code>true</code> إذا كانت قيمة المُتْغيِّر <code>rate</code> أكبر من <code>0.05</code> أو تُساوِي <code>false</code> إذا كنت قيمته أقل من أو تُساوِي <code>0.05</code>. تُستخدَم التعبيرات المنطقية بكثرة ضِمْن بُنى التَحكُّم (control structure) كما سنرى بالفصل الثالث. إلى جانب ذلك، يُمكِننا أيضًا أن نُسنِد القيم المنطقية إلى مُتْغيِّرات من النوع <code>boolean</code>. فمثلًا إذا كان <code>test</code> مُتْغيِّرًا من النوع <code>boolean</code> فيُمكننا كتابة تَعْليمَتي الإِسْناد (assignment statement) التاليتين:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8736_9" style="">
<span class="pln">test </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
test </span><span class="pun">=</span><span class="pln"> rate </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.05</span><span class="pun">;</span></pre>

<h2>
	السلاسل النصية (strings) والسلاسل النصية المجردة (string literals)
</h2>

<p>
	إلى جانب الأنواع الأساسية (primitive types)، تُوفِّر الجافا أنواعًا آخرى قيمها عبارة عن كائنات (objects) وليس قيم أساسية (primitive). ليس هذا وقتًا مناسبًا بالطبع للحديث عن الكائنات (objects)، ولكننا مُضطرّون للحديث عن النوع <code>String</code> لأهميته. هو ببساطة نوع كائني (object type) مُعرَّف مُسْبَقًا تُوفِّره الجافا لتمثيل السَلاسِل النصية (strings). لا يَقَع ذلك النوع ضِمْن الأنواع الأساسية (primitive)، بل هو في الواقع اسم صَنْف (class)، وهو ما سنعود للحديث عنه بالقسم التالي.
</p>

<p>
	تَتَكوَّن القيم من النوع <code>String</code> من متتالية من المحارف مثل السِلسِلة النصية المُجرّدة "Hello World!‎" التي تَعرَضنا لها بقسم سابق. لابُدّ من إحاطة النص بعلامتي اقتباس مزدوجتين حيث تُعدّ كلتاهما جزءًا من السِلسِلة النصية المجرّدة (string literal)، ولكنهما مع ذلك ليسا جزءًا من قيمتها الفعليّة والتي تَقْتصِر على المحارف بين علامتي الاقتباس. قد تحتوي السِلسِلة النصية من النوع <code>String</code> على أي عدد من المحارف بما في ذلك الصفر، وعندها تَكُون بمثابة سِلسِلة نصية فارغة (empty string) تُمثَل بالسِلسِلة النصية المُجرّدة <code>""</code> أي مُكوَّنة من علامتي اقتباس مزدوجتين فارغتين. انتبه جيدًا للفارق بين علامتي اقتباس فرديتين وآخريتين مزدوجتين حيث تُستخدَم الأولى مع القيم المحرفية مُصنَّفة النوع (char literals) أما الثانية فتُستخدَم مع السَلاسِل النصية المُجرّدة (String literals)، فمثلًا، لاحظ الفرق بين السِلسِلة النصية <code>"A"</code> والحرف <code>'A'</code>.
</p>

<p>
	قد تَتَضمَّن السَلاسِل النصية المُجرّدة (string literal) محارفًا خاصة، ويُستخدم عندها خطًا مائلًا عكسيًا (backslash) لتمثيلها. ضِمْن هذا السياق، تُعدّ علامة الاقتباس المزدوجة محرفًا خاصًا، فإذا كان لدينا القيمة النصية التالية (string value):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8736_11" style="">
<span class="pln">I said</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Are you listening!"</span></pre>

<p>
	يُمكِننا إذًا تمثيلها باستخدام سِلسِلة نصية مُجرّدة (string literal) كالتالي مع محرف "إضافة سطر جديد (linefeed)" بالنهاية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8736_13" style="">
<span class="str">"I said, \"Are you listening!\"\n"</span></pre>

<p>
	يُمكِنك أيضًا أن تَستخدِم <code>‎\t</code> و <code>‎\r</code> و <code>\\</code> وكذلك متتاليات اليونيكود مثل <code>‎\u00E9</code> لتمثيل محارف خاصة آخرى ضمن السِلاسِل النصية المُجرّدة (string literals).
</p>

<h2>
	المتغيرات بالبرامج
</h2>

<p>
	ينبغي دائمًا أن تُصرِّح (declare) عن أي مُتْغيِّر (variable) قبل اِستخدَامه. تُستخدَم تَعْليمَة التَصْرِيح عن المُتْغيِّرات (variable declaration statement) للإعلان عن مُتْغيِّر واحد أو أكثر وكذلك تَخْصيص اسم لكُلًا منها. عندما يُنفِّذ الحاسوب تَعْليمَة تَصْرِيح عن مُتْغيِّر، فإنه يَحجِز له مساحة من الذاكرة كما يَربُط اسمه بتلك المساحة. تُكْتَب تَعْليمَة التَصْريح عن مُتْغيِّر بالصياغة التالية:
</p>

<pre class="ipsCode">
&lt;type-name&gt;  &lt;variable-name-or-names&gt;;
</pre>

<p>
	تُمثِل <strong><variable-name-or-names></variable-name-or-names></strong> اسم مُتْغيِّر واحد أو قائمة من أسماء المُتْغيِّرات يَفصِل بينها فاصلة (comma). يُمكِن لتَعْليمَات التَصْرِيح عن المُتْغيِّرات أن تَكُون أكثر تعقيدًا من ذلك كما سنرى لاحقًا. يُفضَّل عمومًا التَصْرِيح (declare) عن مُتْغيِّر واحد فقط بكل تَعْليمَة تَصْرِيح (declaration statement) إلا لو كانت تلك المُتْغيِّرات مُرتبطَة ببعضها. اُنظر الأمثلة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8736_15" style="">
<span class="typ">int</span><span class="pln"> numberOfStudents</span><span class="pun">;</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">        
boolean isFinished</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">char</span><span class="pln"> firstInitial</span><span class="pun">,</span><span class="pln"> middleInitial</span><span class="pun">,</span><span class="pln"> lastInitial</span><span class="pun">;</span></pre>

<p>
	يُفضَّل أيضًا إضافة بعض التعليقات (comment) لكل تَعْليمَة تَصْرِيح عن مُتْغيِّر (variable declaration)؛ لشرح غرضه بالبرنامج أو لتَوفِير بعض المعلومات التي يُمكِنها أن تُساعِد أي مبرمج آخر يَرغَب بقراءة البرنامج. اُنظر الأمثلة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8736_17" style="">
<span class="kwd">double</span><span class="pln"> principal</span><span class="pun">;</span><span class="pln">    </span><span class="com">// مقدار النقود المُستثمَرَ</span><span class="pln">
</span><span class="kwd">double</span><span class="pln"> interestRate</span><span class="pun">;</span><span class="pln"> </span><span class="com">// معدل الفائدة كقيمة وليس نسبة</span></pre>

<p>
	بهذا الفصل، سنَستخدِم المُتْغيِّرات (variables) المُصرَّح (declare) عنها داخل البرنامج الفرعي <code>main()‎</code> فقط. تُعرَف المُتغيرات المُصرَّح عنها داخل برنامج فرعي (subroutine) معين باسم "المُتْغيِّرات المحليّة (local)" وتَكُون مُتوفِّرة فقط داخل ذلك البرنامج الفرعي عند تَشْغِيله ولا يُمكِن الوصول إليها من خارجه نهائيًا. يُمكِنك أن تُصرِّح عن مُتْغيِّرات بأي مكان داخل البرنامج الفرعي بشَّرْط ألا تَستخدِم أبدًا مُتْغيِّر معين بدون أن تُصرِّح عنه أولًا. يُفضِّل بعض الأشخاص التَصْريح (declare) عن جميع المُتْغيِّرات ببداية البرنامج الفرعي بينما يُفضِّل آخرون إرجاء التَصْرِيح عن المُتْغيِّرات إلى حين الحاجة لاِستخدَامها مباشرةً. يُفضِّل الكاتب التَصْرِيح عن المُتْغيِّرات الهامة والمحورية ببداية البرنامج الفرعي مع إضافة تعليق (comment) على كل تَعْليمَة تَصْرِيح منها يشرح الغرض من المُتْغيِّر، وفي المقابل يرى الكاتب أنه من الممكن إرجاء التَصْرِيح عن المُتْغيِّرات غَيْر المُهِمّة إلى حين الحاجة لاِستخدَامها لأول مرة. يَستخدِم البرنامج التالي بعض المُتْغيِّرات (variables) وتَعْليمَات الإِسْناد (assignment statements):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8736_19" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Interest</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

   </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

       </span><span class="com">/* صرح عن المتغيرات */</span><span class="pln">

       </span><span class="kwd">double</span><span class="pln"> principal</span><span class="pun">;</span><span class="pln">     </span><span class="com">// قيمة الاستثمار</span><span class="pln">
       </span><span class="kwd">double</span><span class="pln"> rate</span><span class="pun">;</span><span class="pln">          </span><span class="com">// معدل الفائدة السنوي</span><span class="pln">
       </span><span class="kwd">double</span><span class="pln"> interest</span><span class="pun">;</span><span class="pln">      </span><span class="com">// قيمة معدل الفائدة بعام واحد</span><span class="pln">

       </span><span class="com">/* إحسب القيم المطلوبة */</span><span class="pln">

       principal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">17000</span><span class="pun">;</span><span class="pln">
       rate </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.027</span><span class="pun">;</span><span class="pln">
       interest </span><span class="pun">=</span><span class="pln"> principal </span><span class="pun">*</span><span class="pln"> rate</span><span class="pun">;</span><span class="pln">   </span><span class="com">// احسب معدل الفائدة</span><span class="pln">

       principal </span><span class="pun">=</span><span class="pln"> principal </span><span class="pun">+</span><span class="pln"> interest</span><span class="pun">;</span><span class="pln">
             </span><span class="com">// احسب قيمة الاستثمار بعد عام واحد مع الفائدة</span><span class="pln">

       </span><span class="com">/* اعرض النتائج */</span><span class="pln">

       </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"The interest earned is $"</span><span class="pun">);</span><span class="pln">
       </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">interest</span><span class="pun">);</span><span class="pln">
       </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"The value of the investment after one year is $"</span><span class="pun">);</span><span class="pln">
       </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">principal</span><span class="pun">);</span><span class="pln">

   </span><span class="pun">}</span><span class="pln"> </span><span class="com">// ‫نهاية main()</span><span class="pln">

</span><span class="pun">}</span><span class="pln"> </span><span class="com">// ‫نهاية الصنف Interest</span></pre>

<p>
	يَستدعِي البرنامج بالأعلى مجموعة من البرامج الفرعية (subroutine call) مثل <code>System.out.print</code> و <code>System.out.println</code> لعَرْض بعض المعلومات للمُستخدِم. بخلاف البرنامج الفرعي الأول، يَطبَع البرنامج الثاني محرف "إضافة سطر جديد (linefeed)" بَعْد عَرْض المعلومة ذاتها، فمثلًا، تَطبَع تَعْليمَة الاستدعاء <code>System.out.println(interest);‎</code> قيمة المُتْغيِّر <code>interest</code> بنفس سطر السِلسِلة النصية المعروضة بواسطة تَعْليمَة الاستدعاء <code>System.out.print</code> السابقة. يُفْترَض للقيمة المطلوب طباعتها باِستخدَام <code>System.out.print</code> أو <code>System.out.println</code> أن تُكْتَب بَعْد اسم البرنامج الفرعي (subroutine) داخل أقواس ويُطلق عليها اسم المُعامِل (parameter). قد يَستقبِل أي برنامج فرعي معاملًا واحدًا أو أكثر لتوفير بعض المعلومات التي يَحتاج إليها ليُنفِّذ المُهِمّة المُوكَلة إليه. تُكْتَب تلك المُعامِلات (parameters) عند استدعاء البرنامج الفرعي (subroutine call) بَعْد اسمه داخل أقواس. في المقابل، قد لا يَستقبِل برنامج فرعي (subroutine) أي مُعامِلات، وفي تلك الحالة لابُدّ أن يُكْتَب زوج من الأقواس الفارغة بَعْد اسم البرنامج الفرعي بتَعْليمَة استدعائه.
</p>

<p>
	ملحوظة: جميع ملفات الشيفرة المصدرية (source code) للأمثلة التوضيحية بالكتاب متاحة <a href="http://math.hws.edu/javanotes/source" rel="external nofollow">بنسخة الكتاب المتوفرة عبر الانترنت</a> كما أنها مُضمَّنة بمجلد اسمه "source" بالنسخة الأرشيفية لموقع الإنترنت. يمكنك مثلًا العثور على ملف الشيفرة المصدرية للبرنامج <code>Interest</code> بالملف <code>Interest.java</code> الموجود بمجلد فرعي اسمه "chapter2" داخل المجلد "source".
</p>

<p>
	ترجمة -بتصرّف- للقسم <a href="http://math.hws.edu/javanotes/c2/s2.html" rel="external nofollow">Section 2: Variables and the Primitive Types</a> من فصل Chapter 2: Programming in the Small I: Names and Things من كتاب <a href="http://math.hws.edu/javanotes/index.html" rel="external nofollow">Introduction to Programming Using Java</a>.
</p>
]]></description><guid isPermaLink="false">1016</guid><pubDate>Mon, 05 Oct 2020 13:00:00 +0000</pubDate></item><item><title>&#x643;&#x62A;&#x627;&#x628;&#x629; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C; &#x623;&#x648;&#x644;&#x64A; &#x628;&#x644;&#x63A;&#x629; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A3%D9%88%D9%84%D9%8A-%D8%A8%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-r1015/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/8.png.a0aa0fdbff429995c9c50732a6eda743.png" /></p>
<p>
	يُعرَّف البرنامج بأنّه سلسلة من التعليمات التي يستطيع الحاسب تنفيذها لأداء مهمّةٍ ما. تبدو فكرةٍ بسيطةٍ للغاية، لكن حتى يتمكن الحاسب من الاستفادة من التعليمات، يجب أن تكون هذه التعليمات مكتوبةً بصيغةٍ يستطيع الحاسب استخدامها. هذا يحتّم استخدام لغات البرمجة لكتابة هذه البرامج. تختلف لغات البرمجة عن اللغات البشرية العادية بكونها واضحةً كليًّا، وهي حازمةٌ للغاية فيما هو مسموح أو غير مسموح في البرنامج. تدعى القواعد التي تُحدد ما هو مسموح بصياغة اللغة (Syntax). تُوصّف قواعد الصياغة المفردات الأساسية للغة وكيفيّة بناء البرامج باستخدام أشياء كالحلقات والأفرع والبرامج الفرعية.
</p>

<p>
	يُعرّف البرنامج صحيح الصياغة بأنّه البرنامج الذي يمكن تصريفه أو ترجمته بنجاحٍ؛ تُرفض البرامج التي تحتوي على أخطاء صياغة (ولعلّ هذا يترافق مع رسالة خطأ مفيدة تساعدك في حل المشكلة).
</p>

<p>
	لذا، لكي تكون مُبرمجًا ناجحًا، عليك أن تكتسب معرفة مُفصّلة بصياغة لغة البرمجة التي ستستخدمها. بيد أنّ الصياغة هي مجرّد جانب من الأمر. ليس كافيًا أن تكتب برنامجًا يعمل، أنت تريد برنامجًا يعمل، ويقدّم نتيجة صحيحة. بكلمات أخرى، يجب أن يكون "معنى" البرنامج سليمًا.
</p>

<p>
	يُشار إلى معنى البرنامج بمصطلح "الدلالة اللفظيّة" (Semantics). بكلمات أدق، تُحدّد الدلالةُ اللفظية للغة البرمجة مجموعة القواعد التي تحدد معنى البرنامج المكتوب بتلك اللغة. يُعرّف البرنامج صحيح الدلالة بأنه البرنامج الذي يقوم بما تريد له أن يقوم به.
</p>

<p>
	أبعد من ذلك، يمكن للبرنامج أن يكون صحيح الصياغة والدّلالة إلا أنّ هذا لا ينفي كونه برنامجًا سيئًا. إذ أنّ استخدام اللغة على نحو صحيح لا يكافئ استخدامها على نحو مفيد. على سبيل المثال، يمتاز البرنامج الجيد بأسلوب كتابةٍ، أي أنّه يُكتب بطريقةٍ تجعل من السهل قراءته وفهمه عبر اتباع أعرافٍ معروفةٍ لدى المبرمجين الآخرين. كما أنّ البرنامج الجيّد يمتاز بتصميم شامل مفهوم للقرّاء البشريين. لا يكترث الحاسب لأمور كهذه البتة، إلّا أنها بالغة الأهمية لقارئ بشري. يُشار عادةً إلى الجوانب هذه من البرمجة بمصطلح التأويل أو التداوليات (pragmatics). (سنستخدم التعبير الأكثر شيوعًا "أسلوب" [style].)
</p>

<p>
	عندما نتطرّق لميزة جديدة في اللغة، سنشرح الصياغة والدلالة وبعضًا من تداوليات تلك الميزة. عليك أوّلًا أن تحفظ الصياغة، وهذا الجانب السهل من الموضوع. ثمّ عليك فهم الدلالة عبر متابعة الأمثلة المطروحة، والتأكد من أنك تدرك كيفيّة عملها، والأفضل من ذلك أن تكتب برامج قصيرةً بنفسك لاختبارك فهمك. وعليك أن تحاول إدراك واستيعاب التداوليات، ونعني تعلّم كيفية استخدام ميزة اللغة على نحوٍ سليمٍ وذلك بأسلوبٍ يُكسبك احترام باقي المبرمجين.
</p>

<p>
	لا شكّ أنّ كونك معتادًا على جميع الميزات الفردية للغة لا يعني أنّك أصبحت مُبرمجًا. لا زال عليك تعلّم كيفية بناء برامج معقدة لحل مسائل بعينها. وستحتاج في هذا الأمر إلى الخبرة والذوق. ستجد في هذا الكتاب تلميحات حول تطوير البرمجيات.
</p>

<p>
	نبدأ رحلتنا في اكتشاف جافا بمسألة أضحت عُرفًا في بدايات كهذه: كتابةُ برنامج يعرض الرسالة "مرحبًا أيها العالم!". قد تبدو مسألة هامشيّة، لكن قدرتك على جعل الحاسب يقوم بذلك هي خطوةٌ أولى كبيرة في تعلم لغة برمجة جديدة (خاصةً إذا ما كانت لغتك الأولى)، وهي تعنى فهمك للعملية الأساسيّة التالية:
</p>

<ol>
	<li>
		جلب نص البرنامج إلى الحاسب.
	</li>
	<li>
		تصريف البرنامج، ومن ثمّ
	</li>
	<li>
		تنفيذ البرنامج المُصرّف.
	</li>
</ol>

<p>
	سيتطلب الأمر في الغالب عدّة محاولات لتتمكن من القيام بذلك في المرة الأولى. لن نتعمّق في تفاصيل كيفية القيام بكلّ من تلك الخطوات هنا، الأمر يتعلق بجهاز حاسبك وبيئة برمجة جافا التي تستخدمها. انظر القسم 2.6 لمعلومات حول إنشاء وتنفيذ برامج جافا في بيئات برمجة معينة.
</p>

<p>
	لكن بشكلٍ عام، ستكتب البرنامج باستخدام محرر نصوص ما وتحفظ البرنامج في ملف. ثم ستستخدم أمرًا في محاولةٍ لتصريف الملف، فإمّا أن تحصل على رسالة مفادها أنّ البرنامج يحتوي على أخطاء صياغة، أو تحصل على نسخةٍ مُصرّفة إلى شيفرة جافا الثّمانيّة، وليس إلى لغة الآلة.
</p>

<p>
	أخيرًا، يمكنك تنفيذ البرنامج المصرف عبر استخدام الأمر المناسب. في الواقع، ستستخدم من أجل لغة جافا مُفسرًا لتنفيذ شيفرة جافا الثمانية. قد تؤتمت بيئة البرمجة التي اخترتها بعضًا من الخطوات عوضًا عنك. على سبيل المثال، عادةً ما تتمّ خطوة التصريف أوتوماتيكيًا لكن كن متأكدًا أن الخطوات الثلاث نفسها تجري دومًا وراء الكواليس.
</p>

<p>
	إليك برنامج جافا يعرض الرسالة "مرحبًا أيها العالم!". لا عليك إن لم تفهم كل ما يجري هنا الآن، حيث لن نتطرق لبعض مفاهيمه حتى بضع فصول من الآن.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_413_7" style=""><span class="com">/** برنامج لعرض الرسالة
 * ‫ التالية "مرحبًا أيها العالم!"
 */</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">HelloWorld</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

   </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"!‏مرحبًا أيها العالم"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span><span class="pln">   </span><span class="com">// HelloWorld نهاية الصنف </span></pre>

<p>
	الأمر الذي يعرض الرسالة في الحقيقة هو:
</p>

<pre class="ipsCode">System.out.println("!مرحبًا أيها العالم");
</pre>

<p>
	الأمر السّابق مثالٌ عن تعليمة استدعاء برنامج فرعيّ إذ تستخدم "برنامجًا فرعيًّا مُدمجًا" (built-in subroutine) يُدعى <code>System.out.println</code> لأداء العمل الحقيقيّ. تذكّر أنّ البرنامج الفرعيّ يتألّف من تعليمات لأداء مهمةٍ ما وقد جُمّعت معًا ومُنحت اسمًا. يمكن استخدام هذا الاسم لاستدعاء البرنامج الفرعيّ متى ما احتجنا أداء تلك المهمة. البرنامج الفرعي المدمج هو برنامجٌ فرعيّ مُعرّف مسبقًا كجزء من اللغة وبذلك يكون متاحًا للاستخدام افتراضيًّا في أي برنامج.
</p>

<p>
	عندما تُنفّذ هذا البرنامج، تُعرض الرسالة "مرحبًا أيها العالم" (بدون علامتي الاقتباس اللاتينية) على الخرج القياسي. مع الأسف لا أستطيع شرح معنى الخرج القياسي بالضبط. يُفترض أن تعمل جافا على العديد من المنصات المختلفة، ويعني الخرج القياسي أمرًا مختلفًا على كلّ منها. على أيّة حال، يمكنك أن تتوقع ظهور الرسالة في مكان ملائم أو غير ملائم. (إن كنت تستخدم واجهة أوامر سطرية، كتلك الموجودة في أدوات تطوير جافا التي تقدّمها شركة أوراكل، فعندما تكتب الأمر لإخبار الحاسب بتنفيذ البرنامج سيطبع الحاسب خرج البرنامج – الرسالة "مرحبًا أيها العالم!"- على السطر التالي. بيد أنّه في بيئة تطوير متكاملة مثل Eclipse، قد يظهر الخرج في واحدةٍ من نوافذ البيئة.)
</p>

<p>
	لا بدّ أنك تشعر بالفضول حيال ما تبقى من أشياء في البرنامج أعلاه. يتألف جزء منه من تعليقاتٍ (comments). يتجاهل الحاسب كليًّا جميع التعليقات في البرنامج، وتقتصر أهميّة وجودها على القراء البشريين فقط. هذا لا يعني أنّها غير مهمّة. يُفترض أن يستطيع الناس كما الحواسيب قراءة البرامج، وقد يكون البرنامج بدون التعليقات صعب الفهم عليهم. يوجد نوعان من التعليقات في جافا. يبدأ النوع الأول بالشريطتين <code>//</code> ويمتد حتى نهاية السطر. يوجد تعليق من هذا الشكل في السطر الأخير من البرنامج أعلاه. يتجاهل الحاسب الشريطتين <code>//</code> وكل ما يليهما على السطر نفسه. من جهة أخرى، يبدأ النوع الثاني من التعليقات بشريطة ونجمة <code>/*</code> وينتهي بشريطة ونجمة <code>*/</code> ويمكن أن يمتد ليشمل عدة أسطر. تُمثل الأسطر الثلاث الأولى من البرنامج مثالًا عن هذا النوع من التعليقات. (للتعليق الذي يبدأ بشريطة ونجمتين <code>/**</code>، كالمذكور أعلاه، معنى خاص؛ حيث أنه تعليق خاص بتوثيق جافا Javadoc ويمكن استخدامه لتوليد توثيق للبرنامج. انظر القسم الفرعي 4.6.5).
</p>

<p>
	كل ما عدا ذلك في البرنامج تفرضه قواعد صياغة جافا. تتمُّ البرمجة كاملةً في جافا ضمن "أصناف". ينصّ السطر الأول في البرنامج أعلاه (دون التعليق) أنّ هذا الصنف يدعى <em>HelloWorld.</em>
</p>

<p>
	إضافةً لكونه اسم الصنف، يُمثّل الاسم "HelloWorld" اسم البرنامج أيضًا. ليس كل برنامجٍ صنفًا. لتحديد البرنامج، يجب أن يتضمن الصنف برنامجًا فرعيًّا يدعى <code>main</code> وذلك بتعريفٍ يأخذ الشكل الآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_413_9" style=""><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

   </span><span class="pun">**تعليمات**</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	عندما تطلب من مُفسّر جافا أن ينفّذ البرنامج، يستدعي المُفسّر البرنامج الفرعيّ <code>main()‎</code>، وبذلك تُنفّذ التعليمات التي يحتويها.
</p>

<p>
	تُؤلّف هذه التعليمات النص البرمجيّ الذي يخبر الحاسب بالضبط بما سيقوم به عند تنفيذ البرنامج. يستطيع البرنامج <code>main()‎</code> استدعاء برامج فرعيّة أخرى مُعرّفة في الصنف نفسه أو حتى في أصنافٍ أخرى، لكن البرنامج <code>main()‎</code> هو من يحدّد كيفية وترتيب استخدام البرامج الفرعيّة الأخرى.
</p>

<p>
	تعني الكلمة <code>public</code> في السطر الأول من التابع <code>‎main‎‎()‎</code> أنّ هذا البرنامج (routine) يمكن استدعاؤه من خارج البرنامج. هذا الأمر بالغُ الأهميّة إذ أنّ البرنامج main()<code>‎</code> يُستدعى من قبل مُفسّر جافا الذي هو أحيانًا خارجيّ بالنسبة للبرنامج نفسه. ما تبقى من السطر الأول من البرنامج أصعب من أن يُفسّر في الوقت الحالي، فكر بالأمر الآن على أنّه مجرّد صياغة ضرورية.
</p>

<p>
	البرنامج الفرعيّ هو مجموعةٌ من الأوامر التي تملي ما يجب القيام به، ويتألف في جافا من سلسلة من التعليمات المحاطة بقوسين من الشكل <code>{ }</code>.
</p>

<p>
	استخدمنا هنا الكلمة «تعليمات» (statements) نيابةً عن التعليمات الفعلية في الحيز المخصص لها ضمن البرنامج. سنستخدم الترجمة العربية في الشيفرات باستمرار في هذا الكتاب للإشارة إلى حيّز ينوب عنه وصفه وتحتاج لكتابته فعلًا عندما تقوم بالبرمجة.
</p>

<p>
	كما أشرنا أعلاه، لا يتواجد البرنامج الفرعي بمفرده بل يكون جزءًا من "صنف". يُعرف البرنامج من خلال صنفٍ عام يأخذ الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_413_11" style=""><span class="pun">تصريحات</span><span class="pln"> </span><span class="pun">حزم</span><span class="pln"> </span><span class="pun">اختيارية</span><span class="pln">
</span><span class="pun">استيراد</span><span class="pln"> </span><span class="pun">حزم</span><span class="pln"> </span><span class="pun">اختيارية</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="pun">اسم</span><span class="pln"> </span><span class="pun">البرنامج</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="pun">تصريحات</span><span class="pln"> </span><span class="pun">اختيارية</span><span class="pln"> </span><span class="pun">لمتغيرات</span><span class="pln"> </span><span class="pun">وبرامج</span><span class="pln"> </span><span class="pun">فرعية</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       </span><span class="pun">تعليمات</span><span class="pln"> </span><span class="pun">برمجية</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="pun">تصريحات</span><span class="pln"> </span><span class="pun">اختيارية</span><span class="pln"> </span><span class="pun">لمتغيرات</span><span class="pln"> </span><span class="pun">وبرامج</span><span class="pln"> </span><span class="pun">فرعية</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	يتعلق أول سطرَين باستخدام الحزم (packages). تُعرّف الحزمة بأنها مجموعة من الأصناف وستتعلم المزيد عنها في القسم 2.4 إلّا أنّ أمثلتنا في بادئ الأمر لن تستخدمها.
</p>

<p>
	يُمثل اسم البرنامج في السطر الذي يبدأ بالكلمات المفتاحية <code>public class</code> اسم البرنامج واسم الصنف في آنٍ معًا. تذكر أن استخدامنا لكلمة اسم البرنامج هو نيابةً عن الاسم الفعلي. إن كان اسم الصنف <code>HelloWorld</code>، عند ذلك يجب حفظ الصنف في ملفٍّ يحمل الاسم <code>HelloWorld.java</code>. عند تصريف هذا الملف، يتولد ملف جديد يحمل الاسم <code>HelloWorld.class</code>. يحتوي ملف الصنف هذا على ترجمة البرنامج إلى شيفرة جافا الثمانيّة والتي يمكن تنفيذها باستخدام مفسر جافا.
</p>

<p>
	يُدعى الملف <code>HelloWorld.java</code> بالشيفرة المصدرية (source code) للبرنامج. تحتاج لتنفيذ البرنامج إلى ملف class المُصرّف فقط وليس الشيفرة المصدرية.
</p>

<p>
	لا أهمية لتنسيق هيئة البرنامج على الصفحة كاستخدام الأسطر الفارغة والمسافات البادئة فهي ليست جزءًا من صياغة أو دلالة اللغة. لا يأبه الحاسب لهيئة البرنامج ولن يتغيّر شيءٌ حتى لو كتبت برنامجك على سطرٍ واحد. بيد أنّ هيئة البرنامج وتنسيق كتابته مهمّ للقراء البشريين، وهنالك ضوابط تنسيق محددة يتبعها معظم المبرمجين.
</p>

<p>
	لاحظ أيضًا أنه وفقًا لتوصيف الصياغة أعلاه، يمكن أن يحتوي البرنامج على برامج فرعية أخرى إلى جانب البرنامج الفرعيّ <code>main()‎</code> إضافةٍ إلى ما يدعى بتصريح المتغيرات. ستتعلم المزيد عن كل هذا لاحقًا في الفصل 4.
</p>

<p>
	ترجمة -بتصرّف- للقسم <a href="http://math.hws.edu/eck/cs124/javanotes8/c2/s1.html" rel="external nofollow">Section 2.1 The Basic Java Application</a> من فصل Chapter 2: Programming in the Small I: Names and Things من كتاب <a href="http://math.hws.edu/javanotes/index.html" rel="external nofollow">Introduction to Programming Using Java</a>.
</p>
]]></description><guid isPermaLink="false">1015</guid><pubDate>Fri, 02 Oct 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x625;&#x646;&#x62A;&#x631;&#x646;&#x62A; &#x648;&#x645;&#x627; &#x628;&#x639;&#x62F;&#x647; &#x648;&#x639;&#x644;&#x627;&#x642;&#x62A;&#x647; &#x628;&#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D9%88%D9%85%D8%A7-%D8%A8%D8%B9%D8%AF%D9%87-%D9%88%D8%B9%D9%84%D8%A7%D9%82%D8%AA%D9%87-%D8%A8%D8%AC%D8%A7%D9%81%D8%A7-r968/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_08/7.png.d5f002d2a5e841244e96a2ce60e5a61d.png" /></p>

<p>
	يمكن وصل الحواسيب مع بعضها البعض في شبكات (networks). يستطيع الحاسب على الشبكة أن يتواصل مع الحواسيب الأخرى على نفس الشبكة عبر تبادل البيانات والملفات أو إرسال واستقبال الرسائل. يمكن حتى للحواسيب على شبكة ما أن تتعاون معًا في إجراء حسابات ضخمة.
</p>

<p>
	في يومنا هذا، تتصل ملايين الحواسيب في أنحاء العالم بشبكة عملاقة واحدة تدعى الإنترنت (Internet). تتصل حواسيب جديدة إلى الإنترنت في كل يوم، عبر اتصالات لاسلكية واتصالات فيزيائية باستخدام تقنيات مختلفة مثل خط المشترك الرقمي (DSL)، مودمات الكابل التلفزيوني (Cable modems) والإيثرنت (Ethernet).
</p>

<p>
	هناك بروتوكولات مُفصّلة للتواصل عبر الإنترنت. يُعرّف البروتوكول ببساطة على أنه توصيف مُفصل لكيفية إجراء الاتصالات. لكي يتسنى لحاسوبين التواصل معًا أصلًا، عليهما استخدام نفس البروتوكولات. البرتوكولان الأساسيّان على شبكة الإنترنت هما بروتوكول الإنترنت IP (مختصر للعبارة Internet Protocol) والذي يوّصف كيفية نقل البيانات فيزيائيًّا من حاسب إلى آخر، وبروتوكول التحكم بالنقل TCP (مختصر للعبارة Transmission Control Protocol) والذي يضمن أنّ البيانات المرسلة باستخدام IP استُقبلت كاملةّ وخاليةً من الأخطاء. يُؤمِّن هذان البروتوكولان، واللذان يشار لهما معًا بالمصطلح TCP/IP، أساس التواصل هذا. تستخدم البروتوكولات الأخرى TCP/IP لإرسال أنواع مختلفةٍ من المعلومات مثل صفحات الويب، البريد الإلكتروني، وملفات البيانات.
</p>

<p>
	تجري جميع عمليات الاتصال على شبكة الإنترنت على هيئة رُزم (packets). تتألف الرزمة من بعض البيانات المُرسلة من حاسب إلى آخر، مضافًا إليها معلومات العنونة التي تشير إلى الموضع من شبكة الإنترنت الذي يفترض أن تذهب تلك البيانات إليه. فكّر بالرزمة وكأنها ظرف بريدي يحمل العنوان ويحتوي رسالة بداخله. (تمثل الرسالة البيانات المراد إرسالها.) تتضمن الرزمة أيضًا عنوان استجابة (return address) أي عنوان المرسل. يمكن للرزمة أن تحمل كمية محدودة من البيانات فقط، ويجب تقسيم الرسائل الأطول إلى عدة رزم يتم إرسالها عندئذ على الشبكة بشكلٍ فرديّ وإعادة تجميعها عند وصولها إلى وجهتها.
</p>

<p>
	يمتلك كل حاسبٍ على شبكة الإنترنت عنوان IP (أي IP address). هذا العنوان هو رقمٌ يُميّز هذا الحاسب على نحوٍ فريد عن جميع الحواسيب الأخرى على شبكة الإنترنت. (في الحقيقة، ادعاء التّفرّد هذا غير حقيقيّ كليًّا، لكن الفكرة الأساسيّة صحيحة، أما الحقيقة الكاملة فمعقّدة بعض الشيء.) يستخدم عنوان IP لعنونة الرزم. يمكن للحاسب إرسال البيانات إلى حاسب آخر على شبكة الإنترنت فقط إذا ما كان يعرف عنوان IP لذاك الأخير. نظرًا لأنّ الناس يُفضّلون استخدام الأسماء عوضًا عن الأرقام، لذا تُميّز معظم الحواسب أيضًا بأسماء تدعى أسماء النطاق (domain names). على سبيل المثال، يمتلك الحاسب الرئيسي لقسم الرياضيات في جامعة هوبارت وويليام سميث اسم النطاق math.hws.edu. (تُستخدم أسماء النطاق للسهولة فقط، ما زال حاسبك يحتاج لمعرفة عنوان IP قبل أن يستطيع التواصل. هناك حواسيب على شبكة الإنترنت مهمّتها ترجمة أسماء النطاق إلى عناوين IP. عندما تستخدم اسم نطاق، يحتاج حاسوبك إلى إرسال رسالة إلى خادم أسماء النطاق للبحث عن عنوان IP الموافق. بعدئذٍ، يستخدم حاسبك عنوان IP بدلًا من اسم النطاق، للتواصل مع الحاسب الآخر.)
</p>

<p>
	يُؤمِّن الإنترنت عددًا من الخدمات للحواسيب المتصلة به (وبالطبع لمستخدمي تلك الحواسيب). تستخدم هذه الخدمات TCP/IP لإرسال أنواع مختلفة من البيانات عبر الإنترنت. من أكثر تلك الخدمات شيوعًا، الرسائل الفورية، مشاركة الملفات، البريد الإلكتروني والشبكة العنكبوتية العالمية. لكل خدمة بروتوكولاتها الخاصة التي تستخدمها للتحكم بنقل البيانات عبر الشبكة. لكلّ خدمةٍ أيضًا ما يشبه واجهة مستخدم تسمح للمستخدم بمعاينة، وإرسال، واستقبال البيانات من خلال الخدمة.
</p>

<p>
	على سبيل المثال، تستخدم خدمة البريد الإلكتروني بروتوكولًا يعرف باسم بروتوكول نقل البريد البسيط (Simple Mail Transfer Protocol ويختصر إلى SMTP) لنقل رسائل البريد الإلكتروني من حاسبٍ إلى آخر. تستخدم بروتوكولات أخرى، مثل POP و IMAP، لجلب الرسائل من حساب البريد الإلكتروني ليتسنى للمستلم قراءتها. بيد أنّ الشخص الذي يستخدم البريد الإلكتروني لا يحتاج لفهم أو حتى معرفة وجود هذه البروتوكولات. وتقوم، عوضًا عن ذلك، برامج الحاسب باستخدام هذه البروتوكولات وراء الكواليس لإرسال واستقبال رسائل البريد الإلكتروني. تؤمن هذه البرامج للمستخدم واجهة مستخدم سهلة الاستخدام تخفي خلفها بروتوكولات الشبكة.
</p>

<p>
	تكاد الشبكة العنكبوتية العالمية تكون أكثر خدمات الشبكة تشويقًا، إذ تسمح لك بطلب صفحات من المعلومات المُخزَّنَة على حواسيب في جميع أرجاء الإنترنت. يمكن أن تحتوي صفحة الويب على روابط لصفحات أخرى على الحاسب نفسه الذي حصلت منه على الصفحة أو على حواسيب أخرى في أي مكان من العالم. يُطلق على الحاسب الذي يخزن صفحات المعلومات هذه باسم مخدِّم أو خادم ويب (web server). يُمثّل نوعٌ من البرنامج يدعى بمتصفحات الويب (web browser) واجهة المستخدم لخدمة الويب هذه. نذكر من أكثر متصفحات الويب شعبية: Microsoft Edge، و Internet Explorer، وفايرفوكس، وكروم، وسفاري.
</p>

<p>
	تستخدم متصفح الويب لطلب صفحةٍ من المعلومات. يرسل المتصفح طلبًا لتلك الصفحة إلى الحاسب الذي يختزنها، وعند استلام ردّ من ذاك الحاسب، يعرض متصفح الويب الصفحة لك في هيئة مُنسّقة ومرّتبة. متصفح الويب هو مجرد واجهة مستخدم للويب. يستخدم متصفح الويب وراء الكواليس بروتوكولًا يدعى بروتوكول نقل النصوص الفائقة HTTP (اختصارًا للعبارة HyperText Transfer Protocol) لإرسال طلب كل صفحة واستقبال الاستجابة من خادم الويب.
</p>

<p>
	ليس هذا فحسب، قد تفكر الآن، هل لكل هذا علاقةٌ بجافا؟ في الحقيقة، جافا مترافقة بقوة مع شبكة الإنترنت والشبكة العنكبوتية العالمية. كان من أكبر نقاط قوة جافا في بداية صدورها هو قدرتها على كتابة البريمجات (applets). البريمج هو برنامج صغير يُرسل عبر شبكة الإنترنت ويُنفّذ على صفحة ويب. منحت البريمجات لصفحات الويب القدرة على أداء مهام معقدة وإجراء تفاعلات معقدة مع المستخدم. مع الأسف، فقد عانت البريمجات من العديد من المشاكل ومن ثم توقف استخدامها وظهرت الآن خيارات أخرى لتنفيذ البرامج على صفحات الويب.
</p>

<p>
	رغم أنّ البريمجات تُمثّل جانبًا واحدًا من علاقة جافا بالإنترنت. يمكن استخدام جافا لكتابة تطبيقات معقدة مستقلة لا تعتمد على متصفح ويب. الكثير من هذه التطبيقات مرتبطة بالشبكة. على سبيل المثال، تستخدم الكثير من أكبر وأعقد مواقع الويب برمجيات خادم ويب مكتوبةً بلغة جافا. تتضمن الجافا دعمًا ممتازًا لبروتوكولات الشبكة، كما أنّ استقلالها عن المنصة يسمح بكتابة برامج شبكية تعمل على أنواع مختلفة كثيرة من الحواسيب. ستتعلم المزيد حول دعم جافا للشبكة لاحقًا من <a href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20%D8%AC%D8%A7%D9%81%D8%A7/" rel="">هذه السلسلة</a>.
</p>

<p>
	لا يُمثل دعم جافا للشبكة ميزتها الوحيدة. إلّا أنّ الكثير من لغات البرمجة الجيدة اندثرت بعد اختراعها بفترة وجيزة. تحلّت جافا بالحظ الوفير لتستغل شعبية الإنترنت الكثيفة والمتزايدة.
</p>

<p>
	مع نضوج جافا، وصلت تطبيقاتها لمستوً يتعدى شبكة الإنترنت بكثير. تأتي النسخة المعيارية من جافا بدعم مسبق للكثير من التقنيات، كالتشفير، وضغط البيانات، ومعالجة الصوت، والرسوميات ثلاثية الأبعاد. كما كتب المبرمجون مكتبات جافا لتؤمن مقدرات إضافية.
</p>

<p>
	يمكن تطوير أنظمة معقدة عالية الأداء باستخدام جافا. على سبيل المثال، هادوب (Hadoop)، وهو نظام لمعالجة البيانات على نطاق واسع، مكتوب بلغة جافا. تستخدم كل من ياهو، وفيسبوك والكثير من مواقع الويب الأخرى نظام Hadoop لمعالجة كميات البيانات الضخمة التي يولدوها مستخدمو تلك المنصات.
</p>

<p>
	أبعد من ذلك، لا يقتصر استخدام جافا على الحواسيب التقليدية. يمكن استخدام جافا لكتابة برامج للهواتف الذكية (ولكن ليس لهواتف iPhone). حيث أنّ جافا هي لغة التطوير الأساسية للأجهزة التي تعمل بنظام آندرويد. (يستخدم نظام آندرويد نسخة شركة غوغل من جافا ولا يستخدم نفس مكونات واجهة المستخدم الرسومية كما في جافا المعيارية.) كما أن جافا هي لغة البرمجة المستخدمة في قارئ الكتب الإلكترونية Amazon Kindle وفي الميزات التفاعلية على أقراص الفيديو Blu-Ray.
</p>

<p>
	في وقتنا هذا، تحتل جافة مرتبةً متقدمة بين أكثر لغات البرمجة شعبية وأوسعها استخدامًا. إنّها خيار جيد تقريبًا في أي مشروع برمجي يُقصد له العمل على أكثر من نوع من أجهزة الحواسيب كما أنها خيار منطقي حتى في حالة البرامج التي ستعمل على جهاز واحد. من المرجّح أنّها ما تزال لغة البرمجة الأكثر تدريسًا في الكليّات والجامعات. إنّها مشابهة لحد كبير للكثير من لغات البرمجة الشائعة، مثل C++‎ و JavaScript، و Python لدرجة أنّ معرفتك بك ستمنحك بداية جيدة لتعلم هذه اللغات أيضًا.
</p>

<p>
	عمومًا، فإنّ تعلّم جافا هو نقطة انطلاق رائعة على طريقك لتصبح مبرمجًا خبيرًا. نأمل أنك ستستمتع بهذه الرحلة.
</p>

<p>
	ترجمة وبتصرف للفصل <a href="http://math.hws.edu/eck/cs124/javanotes8/c1/s4.html" rel="external nofollow">The Internet and Beyond</a> من كتاب <a href="http://math.hws.edu/eck/cs124/javanotes8/index.html" rel="external nofollow">Introduction to Programming Using Java</a>
</p>
]]></description><guid isPermaLink="false">968</guid><pubDate>Tue, 18 Aug 2020 12:22:47 +0000</pubDate></item><item><title>&#x648;&#x627;&#x62C;&#x647;&#x629; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x627;&#x644;&#x62D;&#x62F;&#x64A;&#x62B;&#x629; &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%AB%D8%A9-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-r967/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_08/6.png.5fa51e611406a07609fad4d6f2efe09f.png" /></p>

<p>
	لم يتسنى للناس العاديين، ومن ضمنهم معظم المبرمجين، الاقتراب من الحواسيب في الفترة التي تلت صدورها لأول مرة، إذ كانت الحواسيب محتجزةً في غرفٍ مقفلة مع مرافقين يرتدون اللباس الأبيض يأخذون برنامجك وبياناتك، ويقومون بتغذيتها للحاسوب، ومن ثم يعيدون لك استجابة الحاسوب بعد فترة معينة من الزمن. عند إدخال مفهوم "مشاركة الوقت" (timesharing) للحاسوب، وهو عملية تبديل الحاسوب لانتباهه بسرعة من شخص لآخر، وذلك في ستينيات القرن الماضي، أصبح بإمكان عدة أشخاص التفاعل مع الحاسوب في الوقت ذاته. في نظام معتمد على مشاركة الوقت، يجلس المستخدمون أمام "طرفيّة" (terminal) ويرسلون الأوامر إلى الحاسوب، ويرد الحاسوب بكتابة استجابته. استخدمت الحواسيب الشخصية الأولى أيضًا الأوامر المكتوبة والاستجابات، إلّا أنّ هناك في كل مرة شخص واحد معنيّ يستخدم الحاسوب. هذا النوع من التفاعل بين المستخدم والحاسوب يدعى بواجهة سطر الأوامر (Command-line interface).
</p>

<p>
	يتفاعل بالطبع معظم الناس في يومنا هذا مع الحواسيب بطريقة مختلفة كليًّا حيث يستخدمون واجهة مستخدم رسومية (Graphical User Interface، واختصارًا GUI). يرسم الحاسوب مكوّنات الواجهة على الشاشة، وتتضمن المكونات أشياء مثل النوافذ (windows) وأشرطة التمرير (scroll bars) والقوائم (menus) والأزرار (buttons) والأيقونات (icons). عادةً ما تُستخدم الفأرة للتحكم بهذه المكوّنات، أو في حالة شاشات اللّمس، تستخدم أصابعك. لا شكّ أنّك مطّلع على أساسيّات واجهات المستخدم الرسومية، هذا بالطبع ما لم تكن قد انتقلت عبر الزمن من السبعينيات.
</p>

<p>
	أصبح الكثير من مكوّنات واجهة GUI معياريًّا إلى حد كبير. نعني بذلك أنّ لهذه المكوّنات مظهرًا وسلوكًا متشابهًا على الكثير من منصات الحاسوب المختلفة ومن ضمنها أنظمة ماك وويندوز ولينكس. تستطيع برامج جافا -والتي يُفترض أن تُنفَّذ على الكثير من المنصات المختلفة بدون إجراء تعديل على البرنامج- استخدام جميع مكوّنات GUI المعياريَّة. قد يختلف مظهر هذه المكوّنات بين منصةٍ وأخرى، إلّا أنَّ وظيفتها متطابقةٌ على أي حاسوب يُنفّذ البرنامج عليه.
</p>

<p>
	تجد أدناه صورةً لبرنامج جافا بسيطٍ جدًا يوضّح بضع من المكوّنات المعياريّة لواجهة GUI. عندما يُنفّذ البرنامج، ستفتح نافذةٌ شبيهة بالصورة التي تظهر هنا على شاشة الحاسوب. هناك أربعة مكوّنات في النافذة يستطيع المستخدم التفاعل معها: زر، مربّع تأشير (checkbox)، حقل نصّي (text field) وقائمة منبثقة (pop-up menu). هناك بضعة مكوّنات أخرى في النافذة، التّسميات (labels) ذاتها هي مكوّنات (على الرغم من أنّك لا تستطيع التفاعل معها). النصف الأيمن من النافذة عبارةٌ عن مكوّن مساحة نصيّة (text area) يستطيع عرض عدّةٍ أسطر من النص. يظهر مكوّن شريط التّمرير جنبًا إلى جنب مع المساحة النصيّة عندما يصبح عدد أسطر النصّ أكبر من أن يتّسع في المساحة النصيّة. في الحقيقة، وفقًا لمصطلحات جافا، تُعدّ النافذة بأكملها "مكوّنًا".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_08/overview-GUIDemo.png.36e75ef9b67b93ec34708739a69616fe.png" data-fileid="50187" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="50187" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_08/overview-GUIDemo.png.36e75ef9b67b93ec34708739a69616fe.png" alt="overview-GUIDemo.png"></a>
</p>

<p>
	(إذا أردت تنفيذ هذا البرنامج، فالشيفرة المصدريّة، الملف <a href="http://math.hws.edu/eck/cs124/javanotes8/source/chapter1/GUIDemo.java" rel="external nofollow">GUIDemo.java</a>، متوفرّة على الشبكة. لمزيد من المعلومات حول استخدامه والأمثلة الأخرى في هذا الكتاب، انظر القسم 2.6)
</p>

<p>
	تتضمّن جافا في الواقع ثلاث مجموعات كاملة من مكوّنات الواجهة الرسومية GUI. الأولى هي مجموعة أدوات النوافذ المجرّدة (Abstract Windowing Toolkit أو اختصارًا AWT)، وقد أصبحت متوفرة مع صدور النسخة الأصليّة من جافا. أمّا المجموعة الثانية وتُعرف باسم Swing فقد طُرحت مع النسخة 1.2 من جافا لتصبح بعدئذٍ المجموعة المعياريّة لأدوات GUI لسنوات عديدة. أما مجموعة الأدوات الثالثة وتدعى JavaFX فقد أصبحت جزءًا معياريًّا من جافا في نسختها الثامنة (لكنّها حُذفت مؤخّرًا ولذا تتطلّب تثبيتًا منفصلًا في بعض نسخ جافا). على الرغم من أنّك ما زلت قادرًا على استخدام كلٍّ من Swing وAWT، إلّا أنّه يُراد بمجموعة JavaFX أن تكون الوسيلة الحديثة لكتابة تطبيقات GUI. يتناول هذا الكتاب شرح JavaFX حصرًا. (إذا أردت تعلّم Swing، ألقِ نظرةً على النسخة السابقة من هذا الكتاب.)
</p>

<p>
	عندما يتفاعل المستخدم مع مكوّنات GUI، تولِّد أحداثًا (Events). على سبيل المثال، النقر على زر الضغط (push button) يولِّد حدثًا، والضغط على مفتاح من لوحة المفاتيح يولّد حدثًا. في كل مرة يتوّلد فيها حدث، تُرسل رسالة إلى البرنامج تخبره أنّ حدثًا قد جرى ويستجيب البرنامج وفقاً لبرنامجه. في واقع الأمر، يتألف برنامج GUI النمطي من "معالجات أحداث" (event handlers) تخبر البرنامج بكيفيّة الاستجابة إلى أنواع مختلفة من الأحداث. في المثال أعلاه، بُرمج البرنامج ليستجيب لكل حدث بعرض رسالةٍ في المساحة النصيّة. في مثال أكثر واقعيّة، يتوجّب على معالجات الأحداث القيام بأكثر من مجرد ذلك.
</p>

<p>
	استخدام المصطلح "رسالة" هنا مُتعمّد. كما رأيت في <a href="https://academy.hsoub.com/programming/java/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-objects-%D9%88%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-oop-r966/" rel="">القسم السابق</a>، تُرسل الرسائل إلى الكائنات. في الواقع، تُحقّق مكوّنات GUI على أنها كائنات. تتضمن جافا العديد من الأصناف المعرّفة مسبقًا والتي تُمثّل أنواعًا مختلفة من مكوّنات GUI. بعض هذه الأصناف عبارةٌ عن أصناف فرعيّةٍ من أصناف أخرى. إليك مخطّطًا يوضح فقط بعضًا من صفوف JavaFX GUI وعلاقاتها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_08/overview-fig5.png.bd48e7f2ae5914a3ea54907538ea4cf4.png" data-fileid="50186" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="50186" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_08/overview-fig5.png.bd48e7f2ae5914a3ea54907538ea4cf4.png" alt="overview-fig5.png"></a>
</p>

<p>
	لا تقلق حيال التفاصيل في الوقت الحاضر، لكن حاول أن تفهم كيف تُستخدم البرمجة كائنيّة التوجه والوراثة هنا.
</p>

<p>
	لاحظ أنّ جميع أصناف الواجهة GUI الموضحة هنا هي أصناف فرعيّة، إما بشكلٍ مباشرٍ أو غير مباشر، من الصنف الرئيسي <code>Control</code> والذي يُمثل الصفات العامة المشتركة بين الكثير من مُكوّنات JavaFX.
</p>

<p>
	في المخطط، لدى اثنين من الأصناف المتفرِّعة مباشرًة من الصنف <code>Control</code> أصنافًا فرعيّة بدورها. جُمع الصنف <code>TextField</code> والصنف <code>TextArea</code> واللذان يشتركان بأنماط سلوك محددّة معًا كصنفين فرعيين للصنف <code>TextInputControl</code>. وعلى غرار ذلك، نجد أنّ الصنفين <code>Button</code> و <code>CheckBox</code> هما صنفان فرعيّان من الصنف <code>ButtonBase</code> الذي يُمثّل الخصائص المشتركة لكل من الأزرار ومربعات التأشير. (بالمناسبة، فإنّ الصنف <code>ComboBox</code> هو الصنف الذي يُمثّل القوائم المنبثقة.)
</p>

<p>
	ربما ترى من هذا النقاش المقتضب كيف أنّ برمجة واجهات المستخدم الرسومية يستغّلُ التصميم كائني التوجّه بفعاليّة. والواقع أنّ واجهات المستخدم الرسومية بكائناتها المرئيّة هي عامل رئيسي ساهم في شعبيّة البرمجة كائنية التوجّه.
</p>

<p>
	تُعدّ البرمجة بمكوّنات واجهات المستخدم الرسومية والأحداث واحدًا من أكثر جوانب جافا متعةً وأهميةً. على أيّة حال، سنقضي بضع فصول مع الأساسيّات قبل العودة إلى هذا الموضوع في الفصل السادس.
</p>

<p>
	ترجمة وبتصرف للفصل <a href="http://math.hws.edu/eck/cs124/javanotes8/c1/s4.html" rel="external nofollow">The Modern User Interface</a> من كتاب <a href="http://math.hws.edu/eck/cs124/javanotes8/index.html" rel="external nofollow">Introduction to Programming Using Java</a>
</p>
]]></description><guid isPermaLink="false">967</guid><pubDate>Tue, 18 Aug 2020 12:05:00 +0000</pubDate></item><item><title>&#x645;&#x641;&#x647;&#x648;&#x645; &#x627;&#x644;&#x643;&#x627;&#x626;&#x646;&#x627;&#x62A; Objects &#x648;&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647; OOP</title><link>https://academy.hsoub.com/programming/java/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-objects-%D9%88%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-oop-r966/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_08/5.png.d1770ff12c45cd081adf63073ed4b22c.png" /></p>
<p>
	يجب إجراء تصميم للبرامج، فلا يمكن لأحدٍ أن يجلس ببساطةٍ أمام الحاسوب ويُؤلف برنامجًا معقدًا. يُهتَّم فرع <strong>هندسة البرمجيات</strong> (software engineering) ببناء برامج صحيحة، فعَّالة ومكتوبة على نحوٍ سليم. يحاول مهندس البرمجيات استخدام أساليب مقبولة ومُثبتة لتحليل المسألة لكي يتم حلها ومن ثم تصميم برنامج لحل تلك المسألة.
</p>

<p>
	خلال سبعينيات وبداية ثمانينيات القرن الماضي، كانت المنهجية الأساسية في هندسة البرمجيات هي "<strong>البرمجة البنيوية</strong>" (structured programming). يعتمد أسلوب البرمجة البنيوية لتصميم البرامج على النصيحة الآتية: لحل مسألة ضخمة، جزِّئها إلى عدة أجزاء ثم اعمل على كلّ جزءٍ على حدة. لحل كل جزء، عالجه كما لو مسألةً جديدة يمكن أن تُجزّأ بدورها إلى مسائل أصغر. ستصل في نهاية المطاف إلى مسائل يُمكن حلّها مباشرةً بدون تفكيكها. يُدعى هذا الأسلوب <strong>بالبرمجة التنازلية</strong> (top-down programming) أي منهج من الأعلى إلى الأسفل.
</p>

<p>
	ليس هناك من خطبٍ بالبرمجة التنازلية فهو أسلوب مفيدٌ وغالبًا ما يُعتمَد في حل المسائل بيد أنّه ناقص. أولًا، يتعامل كليًا تقريبًا مع إنتاج التعليمات اللازمة لحل المسألة. لكن مع مرور الوقت، أدرك الناس أن تصميم بنى البيانات للبرنامج لا يقلّ أهمية عن تصميم البرامج الفرعية وبنى التحكم. لا تُقدم البرمجة التنازلية الاهتمام المُلائم للبيانات التي يتلاعب بها البرنامج.
</p>

<p>
	المشكلة الثانية باستخدام البرمجة التنازلية الصارمة هي أنَّها تجعل من الصعب إعادة استخدام العمل المنجز في مشاريع أخرى. عند البدء بمسألة ما وتقسيمها إلى أجزاء مناسبة، تميل البرمجة التنازلية إلى أن تفضي لحل حصري بالمسألة. من غير المحتمل أن تستطيع أخذ كتلة ضخمة من البرمجة من برنامج آخر واستخدامها في مشروعك، ستحتاج على الأقل إلى تعديلات كثيفة. إن الحصول على برامج عالية الجودة أمر صعبٌ ومُكلف لذا يحرص المبرمجون ومن يوظِّفهم على إعادة استخدام أعمالهم السابقة.
</p>

<p>
	لذا، يُدمج التصميم التنازلي غالبًا في الممارسة العملية مع <strong>التصميم التصاعدي</strong> (bottom-up design) أي من الأسفل إلى الأعلى. في التصميم التصاعدي، تبدأ من الأسفل بمسائل تعرف مسبقًا كيفية حلها (وقد يكون لديك في متناول يدك مُكوّن برمجي قابل لإعادة الاستخدام فيها). من هناك، تستطيع العمل تصاعدياً نحو حلّ للمسألة الكلية.
</p>

<p>
	ينبغي أن تكون المكونات القابلة لإعادة الاستخدام "مقولبة" قدر الإمكان. <strong>الوحدة</strong> (module) هي إحدى مكونات نظام ضخم تتفاعل مع بقية النظام بأسلوب بسيط، واضح المعالم ومباشر. تكمن الفكرة في إمكانية "وصل" الوحدة بالنظام. لا يهتم النظام ككل بالتفاصيل التي تجري داخل الوحدة طالما أن الوحدة تؤدي الدور الذي أُسند لها على نحوٍ صحيح. يُدعى هذا <strong>بإخفاء المعلومات</strong> (information hiding) وهو أحد أهم مبادئ <a href="https://academy.hsoub.com/programming/general/%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">هندسة البرمجيات</a>.
</p>

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

<p>
	أصبحت الوحدات التي تستطيع دعم هذا النوع من تخبئة المعلومات واسعة الانتشار بين لغات البرمجة في بداية ثمانينيات القرن الماضي. منذ ذلك الحين، سيطرت صيغة أكثر تقدمًا من الفكرة ذاتها على هندسة البرمجيات. يُدعى هذا الأسلوب الأخير <strong>بالبرمجة كائنية التوجه</strong> (object-oriented programming، وغالبًا ما يختصر إلى <abbr title="Object-Oriented Programming | البرمجة كائنية التوجه"><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه">OOP</abbr></abbr>).
</p>

<p>
	يتمحور مفهوم البرمجة كائنية التوجه حول <strong>الكائن</strong> (object)، والذي يمثِّل نوعًا من الوحدات التي تتضمن بيانات وبرامج فرعية. وجهة النظر في البرمجة كائنية التوجه هي أن الكائن هو كيان مُكتفٍ ذاتيًّا فلديه حالة (state) داخلية (هي البيانات التي يتضمنها) وقادر على الاستجابة للرسائل (استدعاءات البرامج الفرعية الموجودة ضمنه). يتضمن كائن قائمة المراسلات البريدية على سبيل المثال حالةً تتألف من قائمة من الأسماء والعناوين. إذا أرسلت له رسالة تُخبره فيها بإضافة اسم، يستجيب عبر تعديل حالته لتعكس التغيير الذي طلبته. إذا أرسلت له رسالة تخبره فيها بطباعة نفسه، يستجيب عبر طباعة قائمته من الأسماء والعناوين.
</p>

<p>
	تهدف مقاربة البرمجة كائنية التوجه في هندسة البرمجيات إلى البدء بتعريف الكائنات المشمولة في مسألة ما والرسائل الذي ينبغي على تلك الكائنات الاستجابة لها. يكون البرنامج الناتج هو مجموعة من الكائنات، لكل منها بياناته ومجموعة خاصة من المسؤوليات. تتفاعل الكائنات عبر إرسال الرسائل بين بعضها. لا يستخدم أسلوب البرمجة التنازلية في التصميم واسع النطاق لبرنامج كهذا وقد يعاني الأشخاص المعتادون على البرامج التقليدية من صعوبة في الاعتياد على البرمجة كائنية التوجه. على أية حال، يدّعي الأشخاص الذين يستخدمون البرمجة كائنية التوجه أنها تميل لكونها نموذجًا أفضل للآلية التي يعمل بها العالم الحقيقي بأكمله، وأنها نتيجة لذلك، أسهل في الكتابة والفهم وأوفر حظًّا في أن تكون صحيحة.
</p>

<p>
	ربما تظن أن الكائنات تعرف كيف تستجيب لرسائل بعينها. قد تستجيب الكائنات المختلفة إلى نفس الرسالة بطرائق مختلفة. على سبيل المثال، فقد ينتج عن الرسالة "طباعة" نتائج مختلفة كليًا وفق الكائن الذي تُرسَل إليه. تدعى هذه الخاصية التي تسمح للكائنات المختلفة بالاستجابة لنفس الرسالة بطرائق مختلفة <strong>بالتعدديّة الشكلية</strong> (polymorphism).
</p>

<p>
	من الشائع أن تشترك الكائنات بسماتٍ أو "تشابه عائلي". تنتمي الكائنات التي تحتوي النوع نفسه من البيانات وتستجيب للرسائل نفسها بالطريقة نفسها إلى صنف (class) واحد. (في البرمجة الفعلية، يكون الصنف نوعًا أوليًّا، أي أنَّنا ننشئ صنفًا ومن ثم يُنشَأ كائن أو أكثر بالاعتماد على ذاك الصنف بعدِّه قالبًا). لكن يمكن للكائنات أن تكون متشابهةً بدون أن تكون مشتقة كم الصنف نفسه تمامًا.
</p>

<p>
	على سبيل المثال، تخيّل برنامج رسمٍ يسمح للمستخدم برسم خطوط، ومستطيلات، وأشكال بيضوية، ومضلّعاتٍ، ومنحنيات على الشاشة. يمكن تمثيل كل كائن مرئي على الشاشة بكائن برمجي في البرنامج. سيتضمن البرنامج خمسة أصناف من الكائنات، يقابل كلٌّ منها نوعًا من الكائنات المرئية التي يمكن رسمها. ستتبع جميع الخطوط إلى صنف واحد، وجميع المستطيلات إلى صنف آخر مختلف، وقس على ذلك. ثمة بوضوح قرابة بين تلك الأصناف حيث تمثل جميعها "كائنات قابلة للرسم". من المتوقع على سبيل المثال أن تستجيب جميع هذه الأصناف إلى رسالة "ارسم نفسك".
</p>

<p>
	هناك مستوى آخر للتجميع يعتمد على البيانات اللازمة لتمثيل كل نوع من الكائنات. هذا المستوى، وإن كان أقل بديهية إلا أنه مفيد جدًا في البرنامج. يمكننا تجميع المضلعات والمنحنيات معًا ضمن "كائنات متعددة النقاط"، بينما تندرج الخطوط والمستطيلات والمنحنات ضمن "كائنات ذات نقطتين." (يُحدد الخط بنقطتين تمثلان نهايتيه، والمستطيل باثنتين من زواياه، والمنحني بزاويتين من المستطيل الذي يحتويه. نتحدث عن المستطيلات ذات الأضلاع العمودية والأفقية والتي يمكن تحديدها بنقطتين فقط. وهذا هو المعنى الشائع لكلمة مستطيل في برامج الرسم.) يمكننا تمثيل هذه العلاقات بالرسم البياني التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50182" href="https://academy.hsoub.com/uploads/monthly_2020_08/overview-fig4.png.37718b226ef7ea9b22ab148020942600.png" rel="" data-fileext="png"><img alt="overview-fig4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50182" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_08/overview-fig4.thumb.png.19bd941f26ab056e1872fe6a45471ee7.png"></a>
</p>

<p>
	يُمثل كلّ من "الكائن القابل للرسم" <code>DrawableObject</code>، و"الكائن متعدد النقاط" <code>MultipointObject</code> و"الكائن ثنائي النقاط" <code>TwoPointObject</code> أصنافًا في البرنامج. يكون كلّ من "الكائن متعدد النقاط" <code>MultipointObject</code> و"الكائن ثنائي النقاط" <code>TwoPointObject</code> صنفين فرعيين من "الكائن القابل للرسم" <code>DrawableObject</code>. يمثّل الصنف "خط" <code>Line</code> صنفًا فرعيًا من الصنف <code>TwoPointObject</code> "الكائن ثنائي النقاط" وعليه (على نحوٍ غير مباشر) من الصنف <code>DrawableObject</code> "كائن قابل للرسم". يُقال أنّ الصنف المتفرِّع من صنف ما يرث صفات ذاك الصنف. يمكن للصنف الفرعي أن يضيف على ما ورثه من أبيه، ويمكنه حتى أن يعيد تعريف جزء مما ورثه (عبر تعريف استجابة مختلفة لبعض الرسائل). على أية حال، تُمثَّل الخطوط والمستطيلات وما إلى هنالك كائنات قابلة للرسم ويعبر الصنف <code>DrawableObject</code> "كائن قابل للرسم" عن هذه العلاقة.
</p>

<p>
	تُعدّ الوراثة وسيلة فعالة لتنظيم البرنامج. كما أنَّها ذات صلة بمسألة إعادة استخدام المكونات البرمجية. الصنف هو أقصى مكون يمكن إعادة استخدامه. إن كان يناسب حاجة البرنامج الذي تحاول كتابته بالضبط، يمكنك إعادة استخدامه مباشرةً. وإن كان يناسب برنامجك إلى حد بعيد، يمكنك إعادة استخدامه عبر تعريف صنف فرعي وإجراء التغييرات اللازمة فقط لجعله ملائمًا لحاجاتك. وهكذا، تقصد البرمجة كائنية التوجه أن تكون أداة رفيعة لتطوير البرامج وحلًّا جزئيًّا لمسألة إعادة استخدام البرمجيات.
</p>

<p>
	تمثل الكائنات، والأصناف، والبرمجة كائنية التوجه عمومًا أفكارًا رئيسية في هذا الكتاب يلهج بذكرها وشرحها دومًا، وستبدأ باستخدام الكائنات المدمجة في لغة جافا في الفصل التالي، وتبدأ في الفصل الخامس بإنشاء صفوف وكائنات جديدة وخاصة بك.
</p>

<p>
	ترجمة وبتصرف للفصل <a href="http://math.hws.edu/eck/cs124/javanotes8/c1/s5.html" rel="external nofollow">Objects and Object-oriented Programming </a> من كتاب <a href="http://math.hws.edu/eck/cs124/javanotes8/index.html" rel="external nofollow">Introduction to Programming Using Java</a>
</p>
]]></description><guid isPermaLink="false">966</guid><pubDate>Tue, 25 Aug 2020 18:05:00 +0000</pubDate></item><item><title>&#x644;&#x628;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x628;&#x646;&#x627;&#x621; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629; &#x644;&#x644;&#x628;&#x631;&#x627;&#x645;&#x62C;</title><link>https://academy.hsoub.com/programming/java/%D9%84%D8%A8%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%86%D8%A7%D8%A1-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D8%A8%D8%B1%D8%A7%D9%85%D8%AC-r965/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_08/4.png.61ab1de9fa2506d7a85a18c02e299742.png" /></p>

<p>
	هناك جانبان أساسيان للبرمجة: <strong>البيانات</strong> (data) و<strong>التعليمات</strong> (instructions). للعمل مع البيانات، تحتاج إلى فهم <strong>المُتغيّرات</strong> (variables) و<strong>الأنواع</strong> (types)؛ أمّا للعمل مع التعليمات عليك فهم <strong>بنى التحكم</strong> (control structures) والبرامج الفرعيّة (subroutines). ستقضي الجزء الأكبر من بداية هذه السلسلة، <a href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20%D8%AC%D8%A7%D9%81%D8%A7/" rel="">مدخل إلى جافا</a>، في التعرف على هذه المفاهيم.
</p>

<p>
	المُتغيّر (variable) هو مجرد موقع في الذّاكرة (أو عدة مواقع متتالية تُعامل وكأنها وحدةٌ واحدة) يُمنح اسمًا لتسهيل الإشارة إليه واستخدامه ضمن برنامجٍ. على المبرمج القلق فقط حيال الاسم، وتقع مسؤولية تتبع موقع الذاكرة على عاتق المُصرّف (compiler). بصفتك مُبرمجًا، ستحتاج فقط إلى تذكّر أنّ الاسم يُشير إلى ما يشبه صندوقًا يحتضن البيانات في الذاكرة، على الرغم أنك غير مضطرٍ لمعرفة أين يقع هذا الصندوق بالضبط في الذاكرة.
</p>

<p>
	في جافا والعديد غيرها من لغات البرمجة، يكون لكلّ متغيّر نوعٌ يُشير إلى نوع البيانات التي يمكنه الاحتفاظ بها. قد يحتفظ نوع من المتغيرات بالأعداد الصحيحة (integers) – مثل 3، أو 7-، أو 0 – بينما يحتفظ نوع آخرٌ بأعداد عشرية (floating point) وهي الأعداد ذات الفواصل العشرية، مثل 3.14، أو 2.7-، أو 17.0. نعم، يميّز الحاسوب بوضوح بين العدد الصحيح 17 والعدد ذي الفاصلة العشرية 17.0؛ تبدو هاتان القيمتان مختلفتين تمامًا داخل الحاسوب. يمكن أن يكون هناك أيضًا أنواع للمحارف (characters) مثل: 'A'، ';' وغيرها، والسلاسل النصية (strings) مثل: " مرحبًا "، " قد تتضمّن السلسة النصية العديد من المحارف "، وغيرها. وهنالك أنواعٌ أقل شيوعًا مثل التواريخ، الألوان، الأصوات أو أي نوع من البيانات قد يحتاج البرنامج تخزينها.
</p>

<p>
	تتضمن لغات البرمجة دائمًا أوامر لجلب البيانات من وإلى المتغيرات وأداء العمليات الحسابيات على هذه البيانات. على سبيل المثال، تُخبر عبارة الإسناد التالي -والتي قد ترد في برنامج جافا- الحاسوبَ بأن يأخذ العدد المُخزّن في المُتغيّر المُسمّى <code>principal</code>، ويضرب ذاك العدد بالقيمة 0.07 ويخزّن النتيجة في المُتغيّر المُسمّى <code>interest</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3042_7" style="">
<span class="pln">interest </span><span class="pun">=</span><span class="pln"> principal </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.07</span><span class="pun">;</span></pre>

<p>
	هنالك أيضًا "أوامر دخل" لجلب البيانات من المستخدم أو من الملفات المخزَّنة على الحاسوب، وهنالك "أوامر خرج" لإرسال البيانات في الاتجاه المعاكس.
</p>

<p>
	هذه الأوامر الأساسيّة الخاصّة بنقل البيانات من مكانٍ إلى آخر وأداء الحسابات هي عناصر البناء الأساسية لجميع البرامج. تُجمع عناصر البناء هذه لتُكوِّن برامج معقدةً باستخدام بنى التحكم والبرامج الفرعيّة.
</p>

<p>
	البرنامج هو عبارة عن سلسلة من التعليمات. في تدفق التحكم العادي، يُنفّذ الحاسوب التعليمات وفقًا لترتيب ورودها في البرنامج، واحدةً تلو الأخرى. إلّا أنّ نموذج العمل هذا محدودٌ جدًا، إذ سرعان ما يُنفِّذ الحاسوب التعليمات المراد تنفيذها ولكن مع <strong>بنى التحكم</strong> (Control structures)، التي هي تعليمات خاصة، يمكن تغيير تدفق تنفيذ الشيفرة. هناك نوعان أساسيّان لبنى التحكم هذه: <strong>الحلقات</strong> (Loops)، تسمح بتكرار تنفيذ سلسلة من التعليمات مرارًا وتكرارًا، و<strong>التّفرعات</strong> (branches)، والتي تسمح للحاسوب بالاختيار بين مساري عمل مختلفين أو أكثر من خلال اختبار شروطٍ أثناء تنفيذ البرنامج.
</p>

<p>
	على سبيل المثال، قد يكون الشرط كالتالي: إذا كانت قيمة المُتغيّر <code>principal</code> أكبر من 10000، يُحسب عندئذٍ المُتغيّر <code>interest</code> بضرب قيمة <code>principal</code> بالقيمة 0.05؛ وإلا يُحسَب <code>interest</code> بضرب قيمة <code>principal</code> بالقيمة 0.04. يحتاج البرنامج إلى وسيلة للتعبير عن قرارٍ كهذا. في لغة جافا، يُعبّر عما سبق بعبارة <code>if</code> الشرطية التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3042_9" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">principal </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10000</span><span class="pun">)</span><span class="pln">

  interest </span><span class="pun">=</span><span class="pln"> principal </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.05</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">else</span><span class="pln">

  interest </span><span class="pun">=</span><span class="pln"> principal </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.04</span><span class="pun">;</span></pre>

<p>
	(لا تقلق بشأن التّفاصيل الآن. تذكر فقط أن الحاسوب يستطيع اختبار شرطٍ وتحديد ما سيقوم به لاحقًا بناءً على نتيجة ذاك الاختبار.)
</p>

<p>
	تُستخدَم الحلقات loops عندما يلزم أداء المهمة ذاتها أكثر من مرة. على سبيل المثال، إذا أردت طباعة تسميةٍ بريدية (mailing label) لكل واحد من الأسماء على قائمة المراسلات، قد يخطر لك التالي: "أحضر الاسم الأول والعنوان واطبع التسمية، أحضر الاسم الثاني والعنوان واطبع التسمية، أحضر الاسم الثالث والعنوان واطبع التسمية.." لكن سرعان ما ستدرك أنّ خطتك غير عمليّة وقد تفشل إن لم تكن تعرف مُسبقًا عدد الأسماء لديك. قد ترغب عوضًا عن ذلك بقول شيء من هذا القبيل: "طالما أن هنالك المزيد من الأسماء التي تحتاج المعالجة، أحضر الاسم التالي والعنوان واطبع التسمية." يُمكن استخدام الحلقة في البرنامج للتعبير عن تكرارٍ كهذا.
</p>

<p>
	البرامج الضخمة مُعقَّدة لدرجة تجعل من المستحيل كتابتها إن لم يكن ثمة طريقة لتجزئتها إلى "كتل" تسهل إدارتها. تُؤمن <strong>البرامج الفرعية</strong> (subroutine) وسيلةً لأداء ذلك. يتألف البرنامج الفرعي من التعليمات اللازمة لأداء مهمةٍ ما وقد جُمعت معًا كوحدةٍ منفردة ومُنحت اسمًا مميِّزًا. يمكن استخدام هذا الاسم بديلًا عن مجموعة التعليمات بأكملها. على سبيل المثال، افرض أنّ إحدى المهام التي يحتاج برنامجك أداءها هي رسم منزلٍ على الشاشة. يمكنك كتابة التعليمات اللازمة، وجمعها في برنامج فرعيّ ومن ثم منح ذلك البرنامج الفرعي اسمًا ملائمًا ولنقل <code>drawHouse()‎</code>. عند ذلك، تستطيع عند حاجتك لرسم منزلٍ في أي مكان من البرنامج أداء ذلك باستخدام أمر واحدٍ كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3042_11" style="">
<span class="pln">drawHouse</span><span class="pun">();</span></pre>

<p>
	وسيكون له نفس المفعول فيما لو كررت جميع تعليمات رسم المنزل في كل مرة.
</p>

<p>
	لا تقتصر إيجابية الأمر على توفير كتابة بعض الأسطر حيث يساعد تنظيم برنامجك ضمن برامج فرعية على تنظيم أفكارك وجهود تصميم برنامجك. عند كتابتك البرنامج الفرعيّ الخاصة برسم المنزل، تستطيع التركيز على مسألة رسم المنزل دون القلق حينها على بقية البرنامج. وحالما تنتهي من كتابة البرنامج الفرعي، يمكنك نسيان تفاصيل رسم المنازل كليًّا، لقد تم حل تلك المشكلة ولديك برنامج فرعي يقوم بها عوضًا عنك. يصبح البرنامج الفرعي جزءًا ضمنيًا من اللغة التي تستطيع استخدامها دون التفكير حول تفاصيل ما يدور "ضمن" البرنامج الفرعي.
</p>

<p>
	تُمثل المتغيرات والأنواع، والحلقات، والتّفرعات والبرامج الفرعية أساس ما نصطلح تسميته "البرمجة التقليدية" (traditional programming)، غير أنّه مع ازدياد حجم البرامج، نحتاج أيضًا إلى بنى إضافية لتساعدنا في التعامل مع تعقيد هذه البرامج. أحد أكثر هذه الأدوات فعالية هي "البرمجية كائنية التوجه" (object-oriented programming) وسنتطرق لها في القسم التالي.
</p>

<p>
	ترجمة وبتصرف للفصل <a href="http://math.hws.edu/eck/cs124/javanotes8/c1/s4.html" rel="external nofollow">Fundamental Building Blocks of Programs</a> من كتاب <a href="http://math.hws.edu/eck/cs124/javanotes8/index.html" rel="external nofollow">Introduction to Programming Using Java</a>
</p>
]]></description><guid isPermaLink="false">965</guid><pubDate>Tue, 18 Aug 2020 10:50:53 +0000</pubDate></item><item><title>&#x622;&#x644;&#x629; &#x62C;&#x627;&#x641;&#x627; &#x627;&#x644;&#x627;&#x641;&#x62A;&#x631;&#x627;&#x636;&#x64A;&#x629; (Java Virtual Machine)</title><link>https://academy.hsoub.com/programming/java/%D8%A2%D9%84%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-java-virtual-machine-r964/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_08/3.png.bbe3abe9afaa05780f7a618229112e26.png" /></p>

<p>
	تتألّف لغة الآلة من تعليماتٍ بسيطةٍ جدًا يُمكن تنفيذها مباشرةً من قبل وحدة المعالجةِ المركزيّة للحاسوب. رغم ذلك، فإنّ جميع البرامج تقريبًا مكتوبةٌ بلغات برمجة عالية المستوى (high-level programming languages) مثل جافا أو <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> أو <a href="https://academy.hsoub.com/programming/cpp/" rel="">C++‎</a>. لا يُمكن تنفيذ البرنامج المكتوب بلغة برمجةٍ عالية المستوى مباشرةً على أيّ حاسوب. يجب أوّلًا أن يُترجم إلى لغة الآلة. يُمكن إجراء التّرجمة هذه من قبل برنامجٍ يُدعى المُصرّف (Compiler). يأخذ المُصرّف برنامجًا مكتوبًا بلغة برمجةٍ عالية المستوى ويترجمه إلى برنامج قابلٍ للتّنفيذ بلغة الآلة. حالما تنتهي التّرجمة، يُمكن تنفيذ البرنامج المُترجم إلى لغة الآلة في أي وقتٍ ولأيّ عددٍ من المرات على نوعٍ واحد من الحواسيب (نظرًا لأنّ لكلّ نوعٍ من الحواسيب لغة آلةٍ فريدةٌ خاصةٌ به). إذا ما أُريد للبرنامج أن يُنفّذ على نوع حواسيب مختلف، يجب إعادة ترجمته إلى لغة الآلة الموائمة باستخدام مُصرّف مختلف.
</p>

<p>
	هنالك بديلٌ لترجمة البرامج المكتوبة بلغاتٍ عالية المستوى. عوضًا عن استخدام المُصرّف الذي يُترجم البرنامج دفعةً واحدة، يمكنك استخدام المُفسّر (Interpreter) الذي يترجمه تعليمةً تلو تعليمةٍ حسب الحاجة. المُفسّر هو برنامج يعمل بنفس آلية عمل وحدة المعالجة المركزيّة، عبر ما يشبه دورة جلب وتنفيذ خاصّة به. لتنفيذ برنامجٍ ما، يقوم المُفسّر بتشغيل حلقةٍ يقوم فيها بقراءة تعليمة واحدةٍ من البرنامج، تحديد ما يلزم لتنفيذ هذه التّعليمة، ومن ثم تنفيذ أوامر لغة الآلة الموافقة.
</p>

<p>
	(يُشبه المُصرّف المُترجم البشريّ الذي يترجم كتابًا كاملًا من لغة إلى أخرى مما يُنتج كتابًا جديدًا في اللغة الهدف. أما المُفسّر فيقابل المُفسّر البشري الذي يترجم خطابًا في الأمم المتحدة من لغة إلى أخرى في الوقت ذاته الذي يُلقى فيه الخطاب.)
</p>

<p>
	أحد استخدامات المفسّرات هو تنفيذ البرامج المكتوبة بلغات عالية المستوى. تُنفَّذ لغة البرمجة Lisp، على سبيل المثال، باستخدام مفسّر وليس مُصرّف. على أيّة حال، للمفسّرات غرضٌ آخر: تسمح المفسّرات لك باستخدام برنامج بلغة الآلة مُخصّص لنوع حواسيب معين على نوع آخر مختلفٍ كليًّا. على سبيل المثال، كان Commodore 64 أو "C64" أحد الحواسيب المنزليّة الأولى. وعلى الرغم من أنّك لن تجد C64 متوفرًا الآن في الأسواق، إلا أنّك تستطيع العثور على برامج محاكية له تعمل على حواسيب أخرى أو حتى ضمن مُتصفحات الويب. يستطيع محاكٍ كهذا تنفيذ برامج الحاسوب C64 عبر العمل كمفسّر للغة آلة C64.
</p>

<p>
	اختار مصممو جافا استخدام مزيج بين التّصريف والتّفسير. تُصرّف البرامج المكتوبة بلغة جافا إلى لغة آلة، لكنها لغة آلة لحاسوبٍ غير موجود في الواقع. يُعرف هذا الحاسوب الافتراضي المزعوم بآلة جافا الافتراضيّة (Java Virtual Machine)، أو JVM. تُدعى لغة الآلة الخاصّة بآلة جافا الافتراضيّة بشيفرة جافا الثُّمانيّة أو جافا بايتكود (Java bytecode). لا يوجد سببٌ يمنع استخدام شيفرة جافا الثُّمانيَّة أو لغة البايتكود كلغة آلة لحاسوبٍ حقيقيٍّ بدلًا من الحاسوب الافتراضي. إلّا أنّ استخدام الآلة الافتراضيّة يفتح الطريق أمام أهم نقاط قوّة وشعبيّة جافا ألا وهي إمكانيّة استخدام هذه الشّيفرة على أي حاسوب. جلّ ما سيحتاجه هذا الحاسوب هو مفسّر لشيفرة جافا الثُّمانيَّة. يُحاكي مفسّر كهذا آلة جافا الافتراضيّة كما يُحاكي محاكي C64 حاسوبَ Commodore 64 الأصلي.
</p>

<p>
	يُستخدم مصطلح آلة جافا الافتراضيّة أيضًا للإشارة إلى برنامج مفسّر شيفرة البايتكود الذي سيقوم بعمليّة المحاكاة، لذا نقول أنّ الحاسوب سيحتاج إلى آلة جافا الافتراضيّة لكي يُنفّذ برامج جافا. من الأدقّ – تقنيًّا – القول أنّ المفسّر يعمل على تحقيق أو تنفيذ (implement) آلة جافا الافتراضيّة بدلًا من القول أنّ المفسّر هو آلة جافا الافتراضيّة.
</p>

<p>
	نحتاج بالطّبع إلى مفسّر مختلف لشيفرة جافا بايتكود من أجل كل نوعٍ من الحواسيب، لكن ما أن يتوفّر مفسّر شيفرة جافا بايتكود على حاسوبٍ ما حتّى يتسنّى له تنفيذ أيّ برنامج مكتوب بلغة جافا بايتكود، ويمكن تنفيذ هذا البرنامج نفسه على أيّ حاسوبٍ يمتلك مفسّرًا مشابهًا. هذه واحدةٌ من أهم ميّزات جافا: يمكن تنفيذ البرنامج المُصرّف ذاته على عدّة أنواعٍ مختلفةٍ من الحواسيب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_08/overview-fig3.png.6ed51304aef1d9f529f835ad92056e79.png" data-fileid="50181" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="50181" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_08/overview-fig3.thumb.png.5aeba201ac33550ebc7c623e0489d947.png" alt="overview-fig3.png"></a>
</p>

<p>
	قد تتساءل الآن، لم استخدام شيفرة جافا بايتكود من الأصل؟ لم لا نقوم فقط بتوزيع برنامج جافا الأصلي وندعُ كل مستخدمٍ يُصرّفه إلى لغة الحاسوب الذي يريد تشغيل البرنامج عليه؟ هناك عدّة أسبابٍ. بادئ ذي بدء، على المُصرّف أن يفهم جافا، والتي هي لغةٌ معقّدةٌ عالية المستوى. المُصرّف بحدِّ ذاته برنامج معقّد. بالمقابل، مُفسّر شيفرة جافا بايتكود هو برنامج بسيط صغيرٌ نسبيًّا. تجعل هذه الحقيقةُ كتابةَ مفسّر شيفرة بايتكود لأي حاسوب جديد أمرًا أكثر سهولةً؛ وما أن يتمّ ذلك حتى يصبح هذا الحاسوب قادرًا على تنفيذ أي برنامج جافا مُصرّف. بينما تكون كتابة مُصرّف جافا لذلك الحاسوب نفسه أمرًا أصعب بكثير.
</p>

<p>
	علاوةً على ذلك، يُفترض أنّ بعض برامج جافا سيتمّ تنزيلها عبر شبكة. يؤدي هذا إلى مخاوف أمنيّة بديهية: أنت لا ترغب بالتأكيد بتنزيل وتنفيذ برنامج قد يتسبب بأذية لحاسوبك أو ملفاتك. يؤدي مُفسّر الشّيفرة بايتكود دور مخزنٍ مؤقّت (buffer) بينك وبين البرنامج الذي قمت بتنزيله. أنت في الحقيقة تُنفّذ برنامج المُفسّر، الأمر الذي يُنفّذ البرنامج المُحمّل على نحوٍ غير مباشر. يُمكن للمُفسّر أن يحميك من الأنشطة الخطرة المُحتملة من طرف هذا البرنامج.
</p>

<p>
	انتُقِدت جافا عندما كانت لغةً حديثةً العهد لأنها بطيئة: نظرًا لأن شيفرة جافا بايتكود تُنفّذ من قبل مُفسّر، كان يبدو أنّ برامج شيفرة جافا بايتكود لا يمكن لها أبدًا أن تُنفّذ بسرعة البرامج المُصرّفة إلى لغة آلة أصيلة (يُقصد بها لغة الآلة الحقيقيّة للحاسوب الذي يُنفّذ البرنامج عليه). مع ذلك، حُلّت هذه المشكلة إلى حدٍّ كبير باستخدام المُصرّفات في الوقت المُناسب (Just-in-time compilers) لتنفيذ شيفرة جافا بايتكود. يترجم المُصرّف في الوقت المناسب شيفرة جافا بايتكود إلى لغة آلة أصيلة وذلك أثناء تنفيذ البرنامج. يكون دخل المُصرّف في الوقت المناسب – كما أيّ مُفسّر عادي- عبارةً عن برنامج شيفرة جافا بايتكود ومهمّته هي تنفيذ هذا البرنامج. إلّا أنه أثناء تنفيذ البرنامج، يترجم أيضًا أجزاء منه إلى لغة الآلة. يُمكن عندئذٍ للأجزاء المترجمة من البرنامج أن تُنفّذ على نحو أسرع بكثيرٍ من الزمن اللازم لتفسيرها. نظرًا لأنّ بعض أجزاء البرنامج تُنفّذ عادةً مرّاتٍ كثيرة أثناء تنفيذ البرنامج، يُمكن للمصرف في الوقت المناسب أن يزيد من سرعة زمن التنفيذ الكلّي.
</p>

<p>
	يجدرُ بالذكر أنّ لا يوجد رابطٌ بالضرورة بين جافا وشيفرة جافا بايتكود. يمكن بالتأكيد تصريف برنامج مكتوب بلغة جافا إلى لغة الآلة لحاسوب حقيقيّ. ويمكن تصريف البرامج المكتوبة بلغات أخرى إلى شيفرة جافا بايتكود. بيد أنّ اتحاد جافا وشيفرة جافا الثمانيّة مستقلٌّ عن المنصة، آمن، ومتوافق مع الشبكة ويسمح لك في الوقت ذااته بالبرمجة بلغة حديثة عالية المستوى وكائنيّة التّوجّه.
</p>

<p>
	في السنوات الأخيرة الماضية، غدا شائعًا إحداثُ لغات برمجة جديدة أو إصدارات من لغات قديمة تُصرّف إلى شيفرة جافا بايتكود. يمكن لبرامج الشيفرة الثمانية المُصرّفة أن تُنفّذ على آلة جافا الافتراضيّة المعياريّة. من اللغات الحديثة التي طُوّرت خصيصًا لبرمجة آلة جافا الافتراضيّة نذكرُ: Scala، و Groovy، و Clojure و Processing. بينما Jython وJRuby هما الإصداران من لغتين قديمتين هما Python و Ruby اللذان يستهدفان آلة جافا الافتراضية. تسمح هذه اللغات بالاستفادة من مزايا آلة جافا الافتراضية وفي الوقت ذاته تجنّب بعض التفاصيل التقنية للغة جافا. في الحقيقة، إنّ استخدام لغات أخرى مع آلة جافا الافتراضيّة أصبح مهمًا للدرجة التي استدعت إضافة عدّة ميزات جديدة إلى آلة جافا الافتراضيّة خصيصًا لإضافة دعم أفضل لبعض هذه اللغات. بدورها، فتحت هذه التحسينات في آلة جافا الافتراضيّة المجال أمام ميزات جديدة في جافا.
</p>

<p>
	يجدر أيضًا أن نذكر أنّ الجزء الأصعب بحقٍّ في الاستقلالية عن المنصة هو تأمين "واجهة مستخدم رسوميّة" (Graphical User Interface) تتضمن نوافذ، وأزرارًا وغيرها يمكنها العمل على جميع المنصات التي تدعم جافا. سنتطرق للمزيد حول هذا لاحقًا.
</p>

<p>
	ترجمة -وبتصرف- للفصل <a href="http://math.hws.edu/javanotes/c1/s3.html" rel="external nofollow">The Java Virtual Machine</a> من الكتاب Introduction to Programming Using Java
</p>
]]></description><guid isPermaLink="false">964</guid><pubDate>Fri, 14 Aug 2020 18:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x623;&#x62D;&#x62F;&#x627;&#x62B; &#x63A;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x62A;&#x632;&#x627;&#x645;&#x646;&#x629;: &#x62D;&#x644;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x62C;&#x633; Polling Loops &#x648;&#x627;&#x644;&#x645;&#x642;&#x627;&#x637;&#x639;&#x627;&#x62A; Interrupts &#x641;&#x64A; &#x627;&#x644;&#x645;&#x639;&#x627;&#x644;&#x62C;</title><link>https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D8%A3%D8%AD%D8%AF%D8%A7%D8%AB-%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D8%B2%D8%A7%D9%85%D9%86%D8%A9-%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%B3-polling-loops-%D9%88%D8%A7%D9%84%D9%85%D9%82%D8%A7%D8%B7%D8%B9%D8%A7%D8%AA-interrupts-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-r963/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_08/2.png.c8b1a95e0e049ace0bfa93f0099ce5ee.png" /></p>

<p>
	تقضي وحدة المعالجة المركزيّة أغلب وقتها في جلب التّعليمات من الذّاكرة وتنفيذها. بيد أنّ <a href="https://academy.hsoub.com/certificates/comptia/%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-r58/" rel="">وحدة المعالجة المركزيّة</a> و<a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-r59/" rel="">الذّاكرة الرّئيسيّة</a> هما اثنان فقط من مكوّنات النّظام الحاسوبي الحقيقي. يتألّف النّظام الكامل من أجهزة أخرى مثل:
</p>

<ul>
<li>
		<strong><a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D9%82%D8%B1%D8%B5-%D8%A7%D9%84%D8%B5%D9%84%D8%A8-%D8%A7%D9%84%D9%87%D9%8A%D9%83%D9%84%D8%A9%D8%8C-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-r60/" rel="">القرص الصّلب</a></strong> (<strong>hard disk</strong>) أو <strong>وسيط التّخزين ذو الحالة الثابتة</strong> (<strong>solid state drive</strong> أو SSD) لتخزين ملفّات البرامج والبيانات. لاحظ أن الذّاكرة الرّئيسيّة تحتفظ بكميّة صغيرة نسبيًّا من المعلومات وتحتفظ بها طالما هناك تغذية كهربائيّة. يُستخدم القرص الصّلب أو وسيط التّخزين ذو الحالة الثّابتة للتّخزين الدّائم لكميّات ضخمة من المعلومات لكن يجب تحميل البرامج منه إلى الذّاكرة الرّئيسيّة قبل أن يتمّ تنفيذها فعليًّا. يُخزّن القرص الصّلب البيانات على قرص مغناطيسي دوّار، بينما يُمثّل وسيط التّخزين ذو الحالة الثّابتة ssd جهازًا إلكترونيًّا صرفًا بدون أيّ أجزاء متحرّكة.
	</li>
	<li>
		<strong>لوحة المفاتيح</strong> <strong>والفأرة</strong> لدخل المستخدم.
	</li>
	<li>
		<strong>الشّاشة</strong> <strong>والطّابعة</strong> لعرض خرج الحاسوب.
	</li>
	<li>
		<strong>جهاز إخراج صوت</strong> للسّماح للحاسوب بتشغيل أصوات.
	</li>
	<li>
		<strong>واجهة شبكة</strong> للسماح للحاسوب بالتّواصل مع الحواسيب الأخرى المتّصلة به على الشبكة، سواء سلكيًّا أو لاسلكيًّا.
	</li>
	<li>
		<strong>الماسحة</strong> لتحويل الصور إلى أرقام ثنائيّة مُرمّزة يمكن تخزينها وتعديلها على الحاسوب.
	</li>
</ul>
<p>
	قائمة الأجهزة هذه لا نهاية لها وتُبنى الأنظمة الحاسوبية على نحوٍ يجعل توسعتها بإضافة أجهزة جديدةٍ أمرًا سهلًا. يتوجّب على وحدة المعالجة المركزيّة بطريقةٍ ما التّواصل مع جميع هذه الأجهزة والتّحكم بها وتقوم بذلك من خلال تنفيذ تعليمات لغة الآلة فقط – في الواقع، إنّ تنفيذ تعليمات لغة الآلة هو الأمر الوحيد الذي تستطيع وحدة المعالجة المركزيّة فعله. يسير الأمر على النّحو الآتي: لكل جهازٍ في النّظام هناك <strong>تعريفٌ</strong> (<strong>device driver</strong>) خاصّ به هو عبارةٌ عن برمجيّة تُنفّذها وحدة المعالجة المركزيّة عندما تتعامل مع هذا الجهاز. عادةً ما تكون هناك خطوتان عند تركيب جهازٍ جديد على النظام: توصيل الجهاز فيزيائيًّا مع الحاسوب وتثبيت برمجية التّعريف الخاصّة بهذا الجهاز. يكون الجهاز عديم الجدوى بدون هذا التّعريف نظرًا لأنّ وحدة المعالجة المركزيّة غير قادرةٍ على التّواصل معه بدونه.
</p>

<p>
	يُنظّم النّظام الحاسوبي عادةً بوصل تلك الأجهزة مع <strong>ناقلٍ</strong> (<strong>Bus</strong>) أو أكثر. يُمثّل النّاقل مجموعةً من الأسلاك التي تنقل أنواعًا مختلفةً من المعلومات بين الأجهزة المتّصلة بها. تنقلُ تلك الأسلاك البيانات، والعناوين، وإشارات التّحكم. يُوجّه العنوان البيانات إلى جهازٍ معيّن وربّما إلى تسجيلةٍ أو موضع بعينه ضمن ذلك الجهاز. تستخدم الأجهزةُ، على سبيل المثال، إشارات التّحكم لتنبيه بعضها إلى توفّر بيانات جاهزةٍ لها على ناقل البيانات. يمكن تمثيل نظام حاسوبي بسيط كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50180" href="https://academy.hsoub.com/uploads/monthly_2020_08/001OverviewAsy.jpg.02113c297a72f9569a655a70c32a9f0e.jpg" rel=""><img alt="001OverviewAsy.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="50180" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_08/001OverviewAsy.thumb.jpg.39f587bd6f712d6b618b29da0124c908.jpg"></a>
</p>

<p>
	تستطيع الأجهزة مثل لوحة المفاتيح، الفأرة، وواجهة الشّبكة أن تُنتج الدّخل الذي ستعالجه وحدة المعالجة المركزيّة. كيف تعرف وحدة المعالجة المركزيّة أنّ البيانات قد وصلت؟ من خلال فكرةٍ بسيطةٍ – وإن كانت غير مُرضِية – وهي أن تقوم وحدة المعالجة المركزيّة بالتّفحص المستمر لوجود بيانات واردة؛ وحالما تجد البيانات، تُعالجها فورًا. ولمّا كانت وحدة المعالجة المركزيّة "تجسّ" أجهزة الدّخل باستمرار لتفقّد ما إذا كان لديها بيانات دخلٍ تريد الإبلاغ عنها، فقد دُعيت هذه العمليّة <strong>بالجسّ</strong> (<strong>polling</strong>). لسوء الحظّ، رغم بساطة عمليّة الجسّ إلّا أنّها غير فعالّةٍ أبدًا حيث تُضيع وحدة المعالجة المركزيّة الكثير الكثير من الوقت في انتظار الدّخل فقط.
</p>

<p>
	لتجنّب عدم الفعاليّة بهذه العملية، تُستخدَم <strong>المُقاطعات</strong> (<strong>Interrupts</strong>) بدلًا من الجسّ. المقاطعة هي إشارةٌ من جهازٍ ما إلى وحدة المعالجة المركزيّة. تستجيب وحدة المعالجة المركزيّة لإشارة المقاطعة بوضع ما تفعله جانبًا للرّد على المقاطعة. تعود وحدة المعالجة المركزيّة لإتمام ما كانت تقوم به قبل حدوث المقاطعة بعد أن تنتهي من معالجتها. على سبيل المثال، عندما تضغط مفتاحًا على لوحة مفاتيح حاسوبك، تُرسل مقاطعة لوحة مفاتيح إلى وحدة المعالجة المركزيّة. تستجيب وحدة المعالجة المركزيّة إلى هذه الإشارة بمقاطعة ما تفعله، وقراءة المفتاح الذي قمت بضغطه، ومعالجته ومن ثمّ العودة إلى المهمّة التي كانت تقوم بأدائها قبل ضغطك للمفتاح.
</p>

<p>
	عليك أن تفهم أنّ هذه العمليّة آليّة بالكامل. يُرسل الجهاز إشارة مقاطعة من خلال تمرير تيّار كهربائي في السلك. تُبنى وحدة المعالجة المركزيّة بحيث تحفظ قدرًا كافيًا من المعلومات حول ما تقوم به عندما يُمرّر تيّار كهربائي في ذاك السّلك لتستطيع العودة إلى المرحلة نفسها لاحقًا. تشمل هذه المعلومات محتويات التّسجيلات الدّاخليّة المهمّة مثل عدّاد البرنامج. تقوم عندها وحدة المعالجة المركزيّة بالقفز إلى موقعٍ مُحدّدٍ مسبقًا في الذاكرة وتبدأ بتنفيذ التّعليمات المُخزّنة هناك. تُشكّل هذه التّعليمات <strong>مُعالج المُقاطعة</strong> <strong>(interrupt handler)</strong> الذي يقوم بالمعالجة الضّروريّة للاستجابة للمقاطعة. معالج المقاطعة هو جزءٌ من برمجية تعريف الجهاز الذي أرسل إشارة المقاطعة. في نهاية معالج المقاطعة، هناك تعليمة تخبر وحدة المعالجة المركزيّة بالعودة إلى مهمّتها السّابقة قبل المقاطعة، تقوم وحدة المعالجة المركزيّة بذلك من خلال استعادة حالتها السّابقة التي قامت بحفظها.
</p>

<p>
	تسمح المقاطعات لوحدة المعالجة المركزيّة بالتعامل مع <strong>الأحداث غير المتزامنة</strong>. في دورة الجلب والتّنفيذ المُنتظمة، تحدث الأشياء بترتيب مُسبق التّحديد؛ كل ما يجري تنفيذه "مُتزامنٌ" مع كل شيء آخر. تُمكّن المقاطعاتُ وحدةَ المعالجة المركزيّة من التعامل بفعاليّة مع الأحداث التي تحدث على نحوٍ "غير متزامن" أو – بكلمات أخرى – في أوقات يتعذّر التّنبؤ بها.
</p>

<p>
	كمثالٍ آخر عن كيفيّة استخدام المقاطعات، تخيّل ماذا يحدث عندما تحتاج وحدة المعالجة المركزيّة النّفاذ إلى بيانات مُخزّنة على القرص الصّلب. لا تستطيع وحدة المعالجة المركزيّة النّفاذ مباشرةً للبيانات إلّا إذا كانت الأخيرة في الذّاكرة الرّئيسيّة. يجب نسخ البيانات من القرص إلى الذّاكرة الرّئيسيّة قبل أن يتسنّى النّفاذ إليها.
</p>

<p>
	لسوء الحظ، فالقرص الصّلب بطيء للغاية مقارنةً بسرعة عمل وحدة المعالجة المركزيّة. عندما تحتاج وحدة المعالجة المركزيّة بياناتٍ من القرص، تُرسل إشارةً إلى القرص الصلب تخبره ليُحدّد موضع البيانات ويقوم بتجهيزها. تُرسل هذه الإشارة على نحوٍ متزامن تحت إشراف برنامجٍ عاديٍّ. تقوم وحدة المعالجة المركزيّة بعد ذلك بتنفيذ مهمّة أخرى عوضًا عن انتظار القرص الصّلب لوقتٍ طويل يتعذّر تقديره بدقّة. ما أن ينتهي القرص الصّلب من تجهيز البيانات المطلوبة، يُرسل إشارة مقاطعةٍ لوحدة المعالجة المركزيّة. يستطيع عندئذ معالج المقاطعة قراءةَ البيانات المطلوبة.
</p>

<p>
	قد تلاحظ أنّ هذا كلّه منطقيّ فقط عندما يكون لدى وحدة المعالجة المركزيّة عدة مهامٍ تنتظر تأديتها. فلا ضير إن قضت وحدة المعالجة المركزيّة وقتها تجسّ تفحصًّا لوجود دخلٍ أو بانتظار انتهاء عمليات محرك القرص الصلب إن لم يكن لديها شيء أفضل للقيام به. تعتمد جميع الحواسيب الحديثة على <strong>تعدّد المهام</strong> (<strong>multitasking</strong>) لأداء عدّة مهامٍ في آن واحد. قد يستخدمُ عدّة مستخدمين نفس الحاسوب. لمّا كانت وحدة المعالجة المركزيّة سريعةً للغاية، يمكنها بسهولةٍ وفعاليّة التّنقل بين المستخدمين مُكرّسة جزءًا من الثّانية لكلٍّ منهم في دوره. يُدعى تطبيق تعدّد المهام هذا <strong>بالمشاركة الزّمنيّة</strong> (<strong>timesharing</strong>). لكنّ هذا لا يمنع حاسوبًا حديثًا بمستخدم واحدٍ من استخدام تعدّد المهام. على سبيل المثال، قد يقوم المستخدم بقراءة مستندٍ بينما تعرض السّاعة الوقت على الشّاشة باستمرار أو يتمّ تحميل ملفٍ عبر الشّبكة.
</p>

<p>
	تُدعى كلُّ مهمةٍ فريدة من المهام التي تعمل عليها وحدة المعالجة المركزيّة <strong>بالخيط</strong> (<strong>thread</strong> أو <strong>العمليّة</strong> [<strong>Process</strong>]) – هناك فروق تقنيّة بين الخيوط والعمليّات لكنّها ليست ذات أهمية هنا على نظرًا لأنّ الخيوط فقط هي المُعتمدة في لغة جافا. تستطيع العديد من وحدات المعالجة المركزيّة تنفيذ أكثر من خيط في آن واحد حقًا. تحتوي وحدات المعالجة المركزيّة كهذه عدّة أنوية (core) تُنفّذ كلّ واحدة منها خيطًا مع العلم أنّ هناك حدًّا عدد الخيوط التي يمكن تنفيذها في آن واحد. ولمّا كان المُرجّح وجود خيوط أكثر ممّا يمكن تنفيذه في آن واحد، ينبغي على الحاسوب نقل التّنفيذ من خيط لآخر تمامًا كما يقوم حاسوب المشاركة الزّمنية بنقل التّنفيذ من مستخدمٍ لآخر. في الحالة العامّة، يستمرُّ الخيط الذي يجري تنفيذه بالعمل حتى يحدث أحد الأمور التّالية:
</p>

<ul>
<li>
		قد <strong>يتنازل</strong> الخيط طوعًا عن سيطرته على النّواة ليمنح الخيوط الأخرى فرصةَ تنفيذ.
	</li>
	<li>
		قد يضطر الخيط لانتظار حصول حدثٍ غير متزامن. على سبيل المثال، قد يطلب الخيط بعض البيانات من القرص الصّلب أو يضطّر لانتظار أن يضغط المستخدم مفتاحًا. يُقال عن الخيط أثناء انتظاره أنّه <strong>محجوب</strong> (<strong>blocked</strong>) وتستطيع الخيوط الأخرى، في حال وجودها، أن تدخل التّنفيذ. عند حصول الحدث، تقوم مقاطعةٌ بإيقاظ الخيط لاستئناف تنفيذه.
	</li>
	<li>
		قد يستنفذ الخيط حصّته الزّمنية المخصّصة ويُعلّق مؤقتًا للسّماح بتنفيذ الخيوط الأخرى. تستطيع معظم الحواسيب تعليق خيطٍ قسريًّا بهذه الطريقة، يقال عندئذٍ أنّ هذه الحواسيب تستخدم <strong>تعدّد المهام الاستباقي (preemptive multitasking).</strong> يحتاج الحاسوب للقيام بتعدّد المهام الاستباقي إلى جهاز مؤقّت زمنيٍ خاص يُولّد مقاطعةً عند فواصل زمنيّة مُنتظمة، 100 مرةٍ في الثّانية مثلًا. عندما تحدث مقاطعة المؤقّت، يتسنّى لوحدة المعالجة المركزيّة الانتقال من خيطٍ إلى آخر بغضّ النّظر عن حالة أو حاجة الخيط الذي يجري تنفيذه. تستخدم جميع الحواسيب الحديثة المكتبيّة منها والمحمولة وحتّى الهواتف الذكيّة والأجهزة اللّوحية تعددَ المهام الاستباقي.
	</li>
</ul>
<p>
	لا حاجةَ للمستخدم العاديّ، بل وللمبرمج العاديّ أيضًا، للتّعامل مع المقاطعات ومعالجات المقاطعات. يمكن لهما التّركيز على المهام المختلفة التي يريدان للحاسوب أن يقوم بأدائها بصرف النّظر عن تفاصيل إدارة الحاسوب لعمليّة تنفيذ كل هذه المهام. في الحقيقة، يستطيع معظم المستخدمين – وبعض المبرمجين – تجاهل الخيوط وتعدد المهام كليًّا.
</p>

<p>
	على أيّة حال، فقد ازدادت أهميّة الخيوط مع ازدياد قدرة الحواسيب واستثمارها لمفهومي تعدد المهام وتعدد المعالجات. وفي واقع الأمر، أصبحت القدرة على العمل مع الخيوط مهارةً مهنيّةً أساسيّة للمبرمجين. لحسن الحظ، تُقدم جافا دعمًا جيّدًا للخيوط، إذ ضُمّنت الأخيرة في لغة البرمجة جافا على أنّها مفهومٌ برمجيٌّ أساسي. سنتناول البرمجة باستخدام الخيوط في الفصل 12.
</p>

<p>
	وعلى نفس المقدار من الأهميّة، في جافا والبرمجة الحديثة على حدٍّ سواء، نجد مفهوم الأحداث غير المتزامنة. وفي حين لا يضطّر المبرمجون للتّعامل مع المقاطعات مباشرةً، يجدون أنفسهم باستمرار وهم يكتبون <strong>معالجات أحداث</strong> (<strong>Event Handler</strong>). تُستدعى معالجات الأحداث، كما معالجات المقاطعات، على نحو غير متزامن عند حصول أحداث معينة. تختلف البرمجة المقادة بالأحداث (event-driven programming) هذه كليًّا عن البرمجة التّزامنيّة المباشرة التّقليديّة. سنبدأ أولًا بالبرمجة التقليدية التي لا تزال مستخدمة في برمجة المهام المفردة، ثمّ سنعود إلى الخيوط والأحداث لاحقًا بدءًا من الفصل 6.
</p>

<p>
	ولأن الشّيء بالشّيء يُذكر، فالبرمجيّة التي تقوم بجميع عمليّات معالجة المقاطعات وتتولّى التّواصل مع المستخدم وأجهزة العتاديّات، كما تضبط أيّ خيط يُسمح بتنفيذه تُدعى <strong>بنظام التّشغيل</strong> (<strong>Operating System</strong>). نظام التّشغيل هو البرمجيّة الجوهريّة الأساسيّة التي لا يستطيع الحاسوب أن يعمل بدونها. أمّا البرامج الأخرى، كمعالجات النّصوص ومتصفّحات الويب، فهي معتمدةٌ كليًّا ومنوطةٌ بنظام التشغيل. نذكر من أنظمة التّشغيل الشّائعة للحواسيب لينوكس (Linux)، ويندوز (Windows)، وماك (Mac OS) ومن أنظمة تشغيل الهواتف الذكية والأجهزة اللّوحية آندرويد (Android) و iOS.
</p>

<p>
	ترجمة -وبتصرف- للفصل <a href="http://math.hws.edu/javanotes8/c1/s2.html" rel="external nofollow">Asynchronous Events: Polling Loops and Interrupts</a> من الكتاب Introduction to Programming Using Java
</p>
]]></description><guid isPermaLink="false">963</guid><pubDate>Fri, 07 Aug 2020 18:00:00 +0000</pubDate></item><item><title>&#x62F;&#x648;&#x631;&#x629; &#x627;&#x644;&#x62C;&#x644;&#x628; &#x648;&#x627;&#x644;&#x62A;&#x646;&#x641;&#x64A;&#x630;: &#x644;&#x63A;&#x629; &#x627;&#x644;&#x622;&#x644;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x62D;&#x627;&#x633;&#x648;&#x628;</title><link>https://academy.hsoub.com/programming/java/%D8%AF%D9%88%D8%B1%D8%A9-%D8%A7%D9%84%D8%AC%D9%84%D8%A8-%D9%88%D8%A7%D9%84%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r962/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_08/1.png.611b227741eda1ba6dc9c9253a9807db.png" /></p>

<p>
	الحاسوب نظامٌ مُعقّد مؤلّفٌ من العديد من المُكوّنات المختلفة. إلّا أنَّ هناك مُكوّنًًا فريدًا يقوم بالحوسبةِ الفعليّة، هذا المُكوّن هو <strong><a href="https://academy.hsoub.com/certificates/comptia/%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-r58/" rel="">وحدة المعالجة المركزيّة</a> (Central Processing Unit)</strong> أو (CPU) وهو للحاسوب كالدّماغ للإنسان. في الحواسيب المكتبيّة الحديثة، تكون وحدة المعالجة المركزيّة عبارةً عن "رقاقةٍ" (Chip) لا يتجاوز حجمها إنشًا مُربّعًا (7 سنتيمترات مُربّعةً). مهمّةُ وحدة المعالجة المركزيّة هي تنفيذ البرامج.
</p>

<p>
	يتألّف <strong>البرنامج (Program)</strong> من قائمةٍ من تعليماتٍ واضحة لا لبس فيها يجبُ على الحاسوب اتّباعها آليًّا. صُمّم الحاسوب لتنفيذ التّعليمات المكتوبة بنوعٍ بسيطٍ من اللغات تدعى <strong>لغةَ الآلة</strong> (Machine Language). يملك كلُّ نوعٍ من الحواسيب لغة آلة خاصة به، ويستطيع الحاسوب تنفيذ البرنامج مباشرةً فقط إذا كان هذا البرنامج مكتوبًا بلغة الآلة المذكورة. يستطيع الحاسوب تنفيذ البرامج المكتوبة باستخدام لغاتٍ أخرى بعد أن تُترجم تلك البرامج إلى لغة الآلة حصرًا.
</p>

<p>
	عندما تُنفّذ وحدة المعالجة المركزيّة برنامجاً ما، يُخزّن هذا البرنامج في <strong>ذاكرة الحاسوب الرّئيسيّة</strong> (تدعى أيضًا <strong><a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-r59/" rel="">ذاكرة الوصول العشوائي</a> [Random Access Memory]</strong> أو RAM). بالإضافة إلى البرنامج الذي يجري تنفيذه، تحتفظ الذّاكرة أيضًا بالبيانات التي يقوم هذا البرنامج باستخدمها أو معالجتها. تتألّف الذّاكرة الرّئيسية من مُتتالية من <strong>المواقع</strong> (<strong>Location</strong>)؛ هذه المواقع مُرقّمةٌ ويُعبّر الرقم التّسلسليّ للموقع عن <strong>عنوانه</strong> (<strong>Address</strong>). يسمح العنوان بانتقاء معلومةٍ بعينها من بين ملايين المعلومات المُخزّنة في الذّاكرة. عندما تحتاج وحدة المعالجة المركزيّة إلى الوصول إلى تعليمة برنامج ما أو جزء من بياناته في موقع معيّن من الذّاكرة، تُرسل عنوان تلك المعلومة على شكلِ إشارةٍ إلى الذّاكرة. تستجيب الذّاكرة بإرسال القيمة المحتواة في ذاك العنوان. تُخزّن وحدة المعالجة المركزيّة المعلومات في الذّاكرة من خلال تحديد المعلومة المُراد تخزينها وعنوان الموقع المُراد تخزينها فيه.
</p>

<p>
	أمّا على مستوى لغة الآلة، فإنّ عمل وحدة المعالجة المركزيّة واضحٌ وبسيط إلى حدٍّ كبير على الرّغم من تعقيد تفاصيله. تُنفّذ وحدة المعالجة المركزيّة البرنامجَ المُخزّن على شكل متتاليةٍ من تعليمات لغة الآلة المُخزَّنة في الذّاكرة الرّئيسيّة وذلك بقراءة التّعليمة، أو <strong>جلبها (Fetch)</strong>، ومن ثُمّ <strong>تنفيذها (Execute)</strong>، مرارًا وتكرارًا. تُدعى العمليّة المُتمثّلة بجلب التّعليمة وتنفيذها، ثم جلب تعليمة أخرى وتنفيذها وهكذا إلى ما لا نهاية <strong>بدورة الجلب والتّنفيذ</strong> (fetch-and-execute cycle). هذه العمليّة هي جُلّ ما تقوم به وحدة المعالجة المركزيّة باستثناءٍ وحيد سنتناوله في القسم التّالي.
</p>

<p>
	يُصبح هذا الأمر أكثر تعقيدّا في الحواسيب الحديثة حيث تتألّف رقاقة المعالجة هذه الأيام من عدّة "<strong>أنوية</strong>" (<strong>core</strong>) تسمح بتنفيذ عدة تعليمات في آنٍ معًا. كما سُرّع الوصول للذّاكرة الرّئيسيّة من خلال <strong>الذّاكرة المخبئيّة</strong> (<strong>cache</strong>) التي صُمّمت للاحتفاظ بالبيانات والتّعليمات التي من المُرجّح أن تحتاجها وحدة المعالجة المركزيّة في وقتٍ قريب. على أيّة حال، لا تُغيّر هذه التّعقيدات من الوظيفة الأساسيّة لوحدة المعالجة المركزيّة.
</p>

<p>
	تنطوي وحدة المعالجة المركزيّة على <strong>وحدة الحساب والمنطق</strong> (<strong>Arithmetic Logic Unit</strong> أو ALU) والتي تُمثّل الجزء الذي يقوم بالعمليّات الرّياضيّة كالجمع والطّرح. كما تحتفظ وحدة المعالجة المركزيّة بعدد صغير من <strong>المسجّلات</strong> (<strong>register</strong>) تُمثّل هذه الأخيرة وحدات ذاكرة صغيرة قادرة على تخزين رقم واحد. قد تتوفّر وحدة المعالجة المركزيّة النموذجيّةُ على 16 أو 32 مسجلًا مُتعدّد الأغراض (general purpose)، وهي أحد أنواع الذاكرة، إذ تحتفظ هذه المسجلات بقيم البيانات المُتاحة للمعالجة مباشرةً وتُشير العديد من تعليمات لغة الآلة إلى هذه المسجلات. على سبيل المثال، قد تكون هناك تعليمة تأخذ رقمين من مسجلين مُحدّدين، تجمع هذين الرقمين (باستخدام وحدة الحساب والمنطق)، وتُخزّن النّتيجة في مسجل جديد. وقد تكون هناك تعليمات لنسخ قيم البيانات من الذّاكرة الرّئيسيّة إلى مسجل ما أو من مسجل إلى الذّاكرة الرّئيسيّة.
</p>

<p>
	كما تحتوي وحدة المعالجة المركزيّة على مُسجلات ذات أغراض خاصة (special purpose). أهمّ هذه المسجلات هو <strong>عدّاد البرنامج</strong> (<strong>program counter</strong> أو PC). تعتمد وحدة المعالجة المركزيّة على عدّاد البرنامج لتعقّب التّعليمة التي تُنفّذها من البرنامج. يُخزّن عدّاد البرنامج عنوان الذّاكرة للتّعليمة التّالية التي يتوجّب على وحدة المعالجة المركزيّة تنفيذها. تفحص وحدةُ المعالجة المركزيّة عدّادَ البرنامج في بداية كل دورة جلب وتنفيذ لمعرفة التّعليمة الواجب جلبها. يُحدَّث عدّادُ البرنامج خلال كل دورة جلب وتنفيذ للإشارة إلى التّعليمة الواجب تنفيذها في الدّورة التّالية والتي - عادةً ولكن ليس دائمًا - ما تكون التّعليمة التي تعقب التّعليمة الحاليّة في البرنامج. تُعدّل بعض لغات الآلة القيم المُخزّنة في عدّاد البرنامج على نحوٍ يسمح للحاسوب أن "يقفز" (jump) من نقطةٍ ما من البرنامج إلى نقطةٍ أخرى؛ هذا الأمر جوهريّ لتطبيق ميّزات برمجية تُعرف بالحلقات والفروع ستُناقَش في الجزء 1.4.
</p>

<p>
	يُنفّذ الحاسوب برامج لغة الآلة آليًّا دون الحاجة إلى فهمها أو التّفكير فيها ويعود هذا الأمر ببساطةٍ إلى طريقة التّركيب الفعليّة لهذه البرامج. هذا المفهوم ليس سهلًا. الحاسوبُ آلةٌ مبنيّة من ملايين المُبدّلات الصّغيرة والتي تدعى <strong>ترانزستورات (Transistor)</strong>. تتميّز الترانزستورات بإمكانية توصيلها على نحوٍ يسمح أن يتحكّم خرج أحد هذه التّرانزستورات بترانزستور آخر (تشغيله أو إيقافه). بينما يقوم الحاسوب بالحوسبة، تقوم هذه المُبدّلات بتشغيل وإيقاف تشغيل بعضها بعضًا وفق نمطٍ تُمليه كلٍّ من طريقة وصلها ببعضها بعضًا من جهة والبرنامج الذي ينفذّه الحاسوب من جهة أخرى.
</p>

<p>
	تُمثّل تعليمات لغة الآلة على شكل أرقام ثنائيّة. يتألّف الرّقم الثّنائيّ من حالتين لا ثالث لهما: صفر وواحد. يُطلق على كلِّ صفر أو واحد تسمية <strong>بت</strong> (<strong>Bit</strong>). إذًا فلغة الآلة ما هي إلّا متتالية من الأصفار والواحدات. تُرمّز كل متتالية محدّدة تعليمة مُحدّدةً بعينها. تُرمّز البيانات التي يُعالجها الحاسوب أيضًا كأرقام ثنائيّة. في الحواسيب الحديثة، يحتفظ كل موقعٍ في الذّاكرة <strong>ببايت</strong> (<strong>Byte</strong>) والذي يُمثّل متتاليةً من ثمانية بتّات. عادةً ما تتألّف البيانات أو تعليمة لغة الآلة من عدّة بايتات مُخزّنة في مواضع متعاقبة من الذاكرة. على سبيل المثال، قد يقرأ الحاسوب فعليّا أربعة أو ثمانية بايتات عند قراءته تعليمةً واحدةً من الذّاكرة؛ ويكون عنوان الذّاكرة للتّعليمة هو عنوان أول بايت من تلك البايتات.
</p>

<p>
	يستطيع الحاسوب العمل مباشرةً مع الأرقام الثنائيّة لأن المبدّلات قادرةٌ على تمثيل هكذا أرقامٍ بسهولة: تشغيل التّرانزستور لتمثيل الرقم واحد؛ وإيقافه لتمثيل الرقم صفر. تُخزّن تعليمات لغة الآلة في الذّاكرة على شكل أنماطٍ من المبدّلات المُشغّلة أو المتوقّفة. عندما تُحمّل تعليمة لغة الآلة إلى وحدة المعالجة المركزيّة، فإنّ ما يحصل في الحقيقة هو تشغيل أو إيقاف مُبدّلات معينة وفقًا للنّمط الذي يُرمّز تلك التّعليمة. بُنيَت وحدة المعالجة المركزيّة للاستجابة لهذا النّمط بتنفيذ التّعليمة التي يُرمّزها ويُمكّنها من ذلك كونُ جميع المبدّلات في وحدة المعالجة المركزيّة موصولةً معًا.
</p>

<p>
	إذًا، عليك فهم ما يلي حول كيفيّة عمل الحاسوب: تحتفظ الذّاكرة الرّئيسيّة ببرامج وبيانات لغة الآلة. تُرمَّز كلٌّ من هاتين الأخيرتين كأرقام ثنائيّة. تجلب وحدة المعالجة المركزيّة تعليمات لغة الآلة من الذّاكرة واحدةً تلو الأخرى وتُنفّذها. تُؤدّي وحدة المعالجة المركزيّة مهامًّا صغيرةً جدًا وفقًا لكل تعليمة، مثل جمع عددين أو نقل البيانات من وإلى الذاكرة. تقوم وحدة المعالجة المركزيّة بكلّ هذا آليًّا بدون التّفكير فيه أو فهم الهدف منه لهذا يتوّجب على البرنامج الذي سيُنفّذ أن يكون مُتقنًا، كاملًا بكل تفاصيله، وخاليًا من أيّ لبس لأن وحدة المعالجة المركزيّة عاجزةٌ إلّا عن تنفيذه تمامًا كما هو مكتوب. إليك رؤيةً تخطيطيّة لهذه المرحلة من فهمنا للحاسوب:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50179" href="https://academy.hsoub.com/uploads/monthly_2020_08/001Overview.jpg.7a4590bad843438f5f12d06c581b97f7.jpg" rel=""><img alt="001Overview.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="50179" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_08/001Overview.thumb.jpg.e6ba0cd9742ff71d0003c44a2d97d9af.jpg"></a>
</p>

<p>
	ترجمة -وبتصرف- للقسم <a href="http://math.hws.edu/javanotes8/c1/s1.html" rel="external nofollow">The Fetch and Execute Cycle: Machine Language</a> من الكتاب Introduction to Programming Using Java
</p>
]]></description><guid isPermaLink="false">962</guid><pubDate>Sat, 01 Aug 2020 18:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x633;&#x631;&#x64A;&#x639; &#x644;&#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; Java</title><link>https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D9%84%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-java-r599/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_01/15-2.png.ec0b275ea90330d04e101597d6111a89.png" /></p>
<p>
	جافا هي لغة برمجة حاسوبية للأغراض العامة، المتزامنة، المعتمدة على الصفوف، وغرضية التوجه
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><span class="com">// يبدأ التعليق المكتوب على خط واحد ب  .//  </span><span class="pln">

</span><span class="com">/*
يبدو التعليق المكتوب على عدة سطور بهذا الشكل. 
*/</span><span class="pln">

</span><span class="com">/**
*تبدو التعليقات في ملفات لغة البرمجة جافا بهذا الشكل
*و تستخدم لوصف الصف أو الصفات المختلفة لكائن معين.  
*:الصفات  الرئيسية
*
*@author-  اسم مؤلف الكود.
*ويحتوي على معلومات الاتصال كالبريد الالكتروني لمؤلف الكود أو  للمؤلفين. 
*@version- النسخة الحالية من البرنامج.
*@since -الوقت الذي تم فيه إضافة هذا الجزء من البرنامج. 
*@param     -من أجل وصف البارامترات المختلفة للمنهج (method). 
*@return   -لوصف القيمة التي يرجعها المنهج.
*@deprecated -لإظهار انتهاء صلاحية الكود أو عدم وجوب استخدامه.
*@see    - روابط إلى جزء آخر من المستندات
*/</span></pre>

<p>
	استورد الصف ArrayList بدلاً من استيراد الرزمة <code>java.util</code> كلّها
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>import java.util.ArrayList;
</code></pre>

<p>
	استورد جميع الصفوف الموجود داخل الرزمة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>import java.security.*;
</code></pre>

<p>
	يحوي أي ملف جافا على صف عام، على المستوى الخارجي، له نفس اسم الملف
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public class LearnJava {
</code></pre>

<p>
	ليعمل برنامج جافا يجب أن يحوي على تابع رئيسي بمثابة نقطة البدء
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public static void main(String[] args) {
</code></pre>

<h2 id="الدخلالخرج">
	الدخل/الخرج
</h2>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h3>
	الخرج
</h3>

<p>
	استخدم <code>()System.out.println</code> لطباعة السطور النصيّة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("Hello World!");
System.out.println(
     "Integer: " + 10 +
     " Double: " + 3.14 +
     " Boolean: " + true);
</code></pre>

<p>
	استخدم <code>()System.out.print</code> للطباعة بدون سطر جديد
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.print("Hello ");
System.out.print("World");
</code></pre>

<p>
	استخدم <code>()System.out.printf</code> لتنسيق الطباعة بسهولة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.printf("pi = %.5f", Math.PI); // =&gt; pi = 3.14159
</code></pre>

<h3>
	الدخل
</h3>

<p>
	استخدم <code>scanner</code> لقراءة الدخل، يجب استيراد الصف <code>;java.util.Scanner</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>Scanner scanner = new Scanner(System.in);
</code></pre>

<p>
	لقراءة السلاسل المحرفية المُدخلة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>String name = scanner.next();
</code></pre>

<p>
	لقراءة البايتات المُدخلة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>byte numByte = scanner.nextByte();
</code></pre>

<p>
	لقراءة العدد الصحيح المُدخل
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int numInt = scanner.nextInt();
</code></pre>

<p>
	لقراءة العدد الحقيقي المٌدخل
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>float numFloat = scanner.nextFloat();
</code></pre>

<p>
	لقراءة العدد الحقيقي مضاعف الدقة المُدخل
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>double numDouble = scanner.nextDouble();
</code></pre>

<p>
	لقراءة القيمة المنطقية المُدخلة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>boolean bool = scanner.nextBoolean();
</code></pre>

<h2 id="المتغيرات">
	المتغيرات
</h2>

<h3>
	التصريح عن المتغيرات
</h3>

<p>
	يتم التصريح عن متغير باستخدام
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_16" style=""><span class="com">// &lt;type&gt; &lt;name&gt;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> fooInt</span><span class="pun">;</span></pre>

<p>
	يتم التصريح عن مجموعة من المتغيرات من نفس النوع
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_14" style=""><span class="com">// &lt;type&gt; &lt;name1&gt;, &lt;name2&gt;, &lt;name3&gt;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> fooInt1</span><span class="pun">,</span><span class="pln"> fooInt2</span><span class="pun">,</span><span class="pln"> fooInt3</span><span class="pun">;</span></pre>

<h3 id="تهيئة-المتغير">
	تهيئة المتغير
</h3>

<p>
	يتم تهيئة متغير باستخدام
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_12" style=""><span class="com">// &lt;type&gt; &lt;name&gt; = &lt;val&gt;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> barInt </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span></pre>

<p>
	يتم تهيئة مجموعة من المتغيرات من نفس النوع بنفس القيمة باستخدام
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_9" style=""><span class="com">// &lt;type&gt; &lt;name1&gt;, &lt;name2&gt;, &lt;name3&gt;</span><span class="pln">
</span><span class="com">// &lt;name1&gt; = &lt;name2&gt; = &lt;name3&gt; = &lt;val&gt;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> barInt1</span><span class="pun">,</span><span class="pln"> barInt2</span><span class="pun">,</span><span class="pln"> barInt3</span><span class="pun">;</span><span class="pln">
barInt1 </span><span class="pun">=</span><span class="pln"> barInt2 </span><span class="pun">=</span><span class="pln"> barInt3 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span></pre>

<h3 id="أنواع-المتغير">
	أنواع المتغير
</h3>

<p>
	<strong>البايت (<code>Byte</code>)</strong> : وهو  8bit ويستخدم لترميز الأعداد الصحيحة بين -128 و 127
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_13" style=""><span class="pln">byte fooByte </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span></pre>

<p>
	إذ كنت ترغب بتفسير البايت كعدد صحيح موجب (بدون إشارة). فإن هذه العملية البسيطة من الممكن أن تساعد
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int unsignedIntLessThan256 = 0xff &amp; fooByte;
</code></pre>

<p>
	هذا يناقض عمل cast الذي من الممكن أن يعطي عدد سالب
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int signedInt = (int) fooByte;
</code></pre>

<p>
	<strong>القصير (<code>Short</code>)</strong>: وهو 16bit ويستخدم لترميز الأعداد الصحيحة بين -32,768 و 32,767<br>
	 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>short fooShort = 10000;
</code></pre>

<p>
	<strong>الصحيح (<code>Integer</code>)</strong>: وهو 32bit ويستخدم لترميز الأعداد الصحيحة بين -2,147,483,648 و 2,147,483,647
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int bazInt = 1;
</code></pre>

<p>
	<strong>الطويل (<code>Long</code>)</strong>: وهو 64bit ويستخدم لترميز الأعداد الصحيحة بين -9,223,372,036,854,775,808 و 9,223,372,036,854,775,807
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>long fooLong = 100000L;
</code></pre>

<p>
	يستخدم المحرف <code>L</code> للدلالة على أن قيمة المتحول هي من النوع Long. و أي قيمة مُسندة للمتحول بدون استخدام <code>L</code> هي عبارة عن عدد صحيح <code>int</code> بشكل افتراضي.
</p>

<p>
	<strong>ملاحظة</strong>: إن الأنواع <code>byte</code>، <code>short</code>، <code>int</code>، <code>long</code>، هي أنواع ذات إشارة signed. أي من الممكن أن تحوي على قيم موجبة أو قيم سالبة.
</p>

<p>
	لا يوجد متغيرات بقيمة موجبة فحسب. ولكن المحارف تعتبر من نوعية unsigned ذات القيمة الموجبة فقط ذات 16bit.
</p>

<p>
	<strong>العائم (<code>Float</code>)</strong>: وهو ذو دقة أحادية 32 bit IEEE 754 ويستخدم لترميز الأعداد الحقيقية ذات الفاصلة العائمة بين 149-^2 و 127^2 - (23-^2-2)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>float fooFloat = 234.5f;
</code></pre>

<p>
	يستخدم المحرف <code>f</code> أو <code>F</code> للدلالة على أن قيمة المتحول هي من النوع <code>Float</code>.
</p>

<p>
	و إلا سيعتبر المتغير من النوع الحقيقي المضاعف.
</p>

<p>
	<strong>المضاعف (<code>Double</code>)</strong>: وهو ذو دقة مضاعفة 64 bit IEEE 754 ويستخدم لترميز الأعداد الحقيقية ذات الفاصلة العائمة بين 1074-^2 و 1023^2 - (52-^2-2)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>double fooDouble = 123.4;
</code></pre>

<p>
	<strong>القيم المنطقية (<code>Boolean</code>)</strong> ذات القيمة: <code>true</code> و <code>false</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>boolean fooBoolean = true;
boolean barBoolean = false;
</code></pre>

<p>
	<code>Char</code> هو محرف يونيكود 16بت أحادي
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>char fooChar = 'A';
</code></pre>

<p>
	لا يمكن أعادة تهيئة المعطيات من النوع <code>final</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>final int HOURS_I_WORK_PER_WEEK = 9001;
</code></pre>

<p>
	ولكن من الممكن تهيئتها بعد عملية التصريح عنها
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>final double E;
E = 2.71828;
</code></pre>

<p>
	<code>BigInteger</code> -عبارة عن نوع الأعداد الصحيحة الثابتة بمستويات دقّة مختلفة.<br>
	يستخدم نوع المعطيات <code>BigInteger</code> للسماح للمبرمج بالتعامل مع الأعداد الصحيحة التي هي أكبر من 64-بت. حيث تُخزّن الأعداد الصحيحة في مصفوفة من البايتات، التي يمكن التلاعب بها باستخدام التوابع المبنيّة في الصف <code>BigInteger</code> .
</p>

<p>
	يمكن تهيئة المتغير من النوع <code>BigInteger</code> بمصفوفة من البايتات أو بمصفوفة من السلاسل المحرفية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>BigInteger fooBigInteger = new BigInteger(fooByteArray);
</code></pre>

<p>
	<code>BigDecimal</code> عبارة عن نوع الأعداد الحقيقية الثابتة بمستويات دقة مختلفة. ويأخذ المتغير من النوع <code>BigDecimal</code> معاملين: عدد صحيح ذو حجم غير مقّيّد، يمثل مستوى الدقّة، وعدد صحيح أخر بحجم 32 بت.
</p>

<p>
	يسمح النوع <code>BigDecimal</code> بالتحكم بتقريب الأعداد الحقيقية. عندما يكون مطلوب مستوى دقة محدد للعدد الحقيقي يُنصح باستخدام <code>BigDecimal</code> .
</p>

<p>
	من الممكن تهيئة المتغير من النوع <code>BigDecimal</code> بأحد الأنواع التالية: <code>int</code> ،<code>long</code> ،<code>double</code> ،<code>String</code> ،<code>BigInteger</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>BigDecimal fooBigDecimal = new BigDecimal(fooBigInteger, fooInt);
</code></pre>

<p>
	كُن حذرًا عند استخدامك للأنواع float ,double لأن عدم الدقّة في تحديد النوع سوف تُنسخ في الـ <code>BigDecimal</code> ويُفضل استخدام سلسلة محرفية ثابتة عندما تحتاج إلى قيمة دقيقة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>BigDecimal tenCents = new BigDecimal("0.1");
</code></pre>

<h3 id="string--السلاسل-المحرفية">
	String -السلاسل المحرفية
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>String fooString = "My String Is Here!";
</code></pre>

<p>
	الحرف الخاص <code>n\</code> يُعرف بحرف السطر الجديد الذي يحرك مؤشر الكتابة إلى بداية السطر التالي.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>String barString = "Printing on a new line?\nNo Problem!";
</code></pre>

<p>
	الحرف الخاص <code>t\</code> يُعرف بالمسافة الأفقية، يقوم بتحريك مؤشر الكتابة مسافة معينة إلى النقطة التالية في السطر.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>String bazString = "Do you want to add a tab?\tNo Problem!";
System.out.println(fooString);
System.out.println(barString);
System.out.println(bazString);
</code></pre>

<h3 id="بناء-السلاسل-المحرفية">
	بناء السلاسل المحرفية:
</h3>

<ol>
	<li>
		<p>
			باستخدام عامل الجمع (+) تُعتبر الطريقة الأساسية (الأمثل) للقيام ببناء السلاسل المحرفية.
		</p>

		<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8500_8" style=""><span class="typ">String</span><span class="pln"> plusConcatenated </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Strings can "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"be concatenated "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">“</span><span class="pln">via </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">operator</span><span class="pun">.”;</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">plusConcatenated</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Output: Strings can be concatenated via + operator.</span></pre>
	</li>
	<li>
		<p>
			باستخدام الصف <code>StringBuilder</code> لا تشكل هذه الطريقة أية سلاسل محرفية وسيطة، فقط تقوم بتخزين قطع السلاسل المحرفية و ربطها مع بعضها عندما يتم استدعاء التابع <code>()toString</code>. <strong>تلميح</strong>: لا يعتبر الصف <code>StringBuilder</code> إجرائية آمنة. يوجد صف بديل آمن <code>StringBuffer</code> (مع تأثير بسيط على الأداء).
		</p>
	</li>
</ol>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8500_14" style=""><span class="typ">StringBuilder</span><span class="pln"> builderConcatenated </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StringBuilder</span><span class="pun">();</span><span class="pln">
builderConcatenated</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="str">"You "</span><span class="pun">);</span><span class="pln">
builderConcatenated</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="str">"can use "</span><span class="pun">);</span><span class="pln">
builderConcatenated</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="str">"the StringBuilder class."</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">builderConcatenated</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln"> </span><span class="com">// فقط الآن تمّ بناء السلسة المحرفية</span><span class="pln">
</span><span class="com">// Output: You can use the StringBuilder class.</span></pre>

<p>
	تكون <code>StringBuilder</code> فعاله عندما السلسلة المحرفية الكاملة المبنيّة مطلوبة في نهاية عملية ما.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>StringBuilder stringBuilder = new StringBuilder();
String inefficientString = "";
for (int i = 0 ; i &lt; 10; i++) {
    stringBuilder.append(i).append(" ");
    inefficientString += i + " ";
}
System.out.println(inefficientString);
System.out.println(stringBuilder.toString());
</code></pre>

<p>
	تتطلب <code>inefficientString</code> عمل أكثر، حيث أنها تنتج سلسلة محرفية عند كل دورة للحلقة. يتم ترجمة تجميع السلاسل المحرفية البسيطة بالعامل (+) إلى: <code>toString()</code> و <code>StringBuilder</code><br>
	تجنب استخدام تجميع السلاسل المحرفية داخل الحلقات.
</p>

<ol start="3">
	<li>
		<p>
			لاستخدام منسق السلاسل المحرفية طريقة أخرى بديلة لتوليد السلاسل المحرفية سريعة و قابلة للقراءة.
		</p>
	</li>
</ol>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8500_16" style=""><span class="typ">String</span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="str">"%s may prefer %s."</span><span class="pun">,</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Or</span><span class="pln"> you</span><span class="pun">”,</span><span class="pln"> </span><span class="pun">“</span><span class="typ">String</span><span class="pun">.</span><span class="pln">format</span><span class="pun">()”);</span><span class="pln">
</span><span class="com">// Output: Or you may prefer String.format().</span></pre>

<h3>
	المصفوفات
</h3>

<p>
	يجب تحديد حجم المصفوفة بشكل فوري بمجرد التصريح عنها. تستخدم الصيغة التالية للتصريح عن مصفوفة. 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_18" style=""><span class="com">// &lt;datatype&gt;[] &lt;var name&gt; = new &lt;datatype&gt;[&lt;array size&gt;];</span><span class="pln">
</span><span class="com">// &lt;datatype&gt; &lt;var name&gt;[] = new &lt;datatype&gt;[&lt;array size&gt;];</span></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int[] intArray = new int[10];
String[] stringArray = new String[1];
boolean boolArray[] = new boolean[100];
</code></pre>

<p>
	طريقة أخرى للتصريح عن مصفوفة و تهيئتها
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int[] y = {9000, 1000, 1337};
String names[] = {"Bob", "John", "Fred", "Juan Pedro"};
boolean bools[] = {true, false, false};
</code></pre>

<p>
	فهرسة المصفوفة - الوصول إلى عنصر فيها
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("intArray @ 0: " + intArray[0]);
</code></pre>

<p>
	تبدأ المصفوفات بالفهرس (0)، و هي قابله للتغيير .
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>intArray[1] = 1;
System.out.println("intArray @ 1: " + intArray[1]) ArrayLists; // =&gt; 1
</code></pre>

<p>
	مجموعة من أنواع المعطيات الأخرى، التي تستحق التدقيق فيها:
</p>

<p>
	<strong>ArrayLists</strong> : مشابهة للمصفوفات، إلا أنها تحوي على وظائف إضافية، وحجمها قابل للتعديل.
</p>

<p>
	<strong>LinkedLists</strong> : عبارة عن تنفيذ لقائمة مترابطة بشكل مضاعف، التي تنفذ جميع العمليات التي من المتوقع لقائمة مترابطة بشكل مضاعف أن تنفذها.
</p>

<p>
	<strong>Maps</strong> : عبارة عن وصل كائنات المفتاح إلى كائنات القيمة. وهي عبارة عن واجهة، و بالتالي لا يمكن أن يتم تشكيل كائنات منها. يجب أن يتم تحديد نوع المفاتيح و القيم بناءً على الكائن المُشكل من الصف.<br>
	من الممكن ان يُربط كل مفتاح إلى قيمة واحدة فقط، ومن الممكن أن يظهر كل مفتاح مرة واحدة فقط. (لا يوجد نسخ) لتنفيذ الخريطة/الواجهة Map
</p>

<p>
	<strong>hashtable </strong>: يُستخدم هذا الصف الجدول ، <code>HashMaps</code> وينفذ الخريطة Map ، هذا يسمح بتثبيت زمن العمليات الأساسية، مثل الحصول على عنصر أو إدخال عنصر، حتى في المجموعات الكبيرة.
</p>

<p>
	<strong>TreeMap</strong>: عبارة عن Map ، مصنفة حسب مفاتيحها. يُحافظ كل تعديل على ترتيبه، إما باستخدام المقارن المزود عند عملية توليد الكائن، أو باستخدام المقارنات لكل كائن، اذا كان ينفذ واجهة قابلة للمقارنة. سوف يؤدي الفشل المدمج في تنفيذ واجهة قابلة للمقارنة، مع الفشل في تزويد مقارن إلى رمي <code>ClassCastExceptions</code><br>
	تأخذ عمليات إدخال و حذف عناصر زمن من الدرجة ((O(log(n ، لذلك تجنب استخدام بنى المعطيات هذه، إلا أذا كنت ترغب من الاستفادة من ميزة الترتيب.
</p>

<h2 id="العمليات">
	العمليات
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("\n-&gt;Operators");
</code></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8500_22" style=""><span class="typ">int</span><span class="pln"> i1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> i2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// الطريقة المختصرة للتصريح عن عدة متغيرات في نفس الوقت</span><span class="pln">
</span></pre>

<p>
	العمليات الحسابية بسيطة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("1+2 = " + (i1 + i2)); // =&gt; 3
System.out.println("2-1 = " + (i2 - i1)); // =&gt; 1
System.out.println("2*1 = " + (i2 * i1)); // =&gt; 2
System.out.println("1/2 = " + (i1 / i2)); // =&gt; 0 (int  يعيد  int/int)
System.out.println("1/2.0 = " + (i1 / (double)i2)); // =&gt; 0.5
</code></pre>

<p>
	باقي القسمة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("11%3 = "+(11 % 3)); // =&gt; 2
</code></pre>

<p>
	عمليات المقارنة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("3 == 2? " + (3 == 2)); // =&gt; false
System.out.println("3 != 2? " + (3 != 2)); // =&gt; true
System.out.println("3 &gt; 2? " + (3 &gt; 2)); // =&gt; true
System.out.println("3 &lt; 2? " + (3 &lt; 2)); // =&gt; false
System.out.println("2 &lt;= 2? " + (2 &lt;= 2)); // =&gt; true
System.out.println("2 &gt;= 2? " + (2 &gt;= 2)); // =&gt; true
</code></pre>

<p>
	العمليات المنطقية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("3 &gt; 2 &amp;&amp; 2 &gt; 3? " + ((3 &gt; 2) &amp;&amp; (2 &gt; 3))); // =&gt; false
System.out.println("3 &gt; 2 || 2 &gt; 3? " + ((3 &gt; 2) || (2 &gt; 3))); // =&gt; true
System.out.println("!(3 == 2)? " + (!(3 == 2))); // =&gt; true
</code></pre>

<dl>
	<dt>
		العمليات على مستوى البت<code> </code>
	</dt>
</dl>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8500_26" style=""><span class="pun">~</span><span class="pln">	</span><span class="pun">عامل</span><span class="pln"> </span><span class="pun">إيجاد</span><span class="pln"> </span><span class="pun">المتمم</span><span class="pln"> </span><span class="pun">على</span><span class="pln"> </span><span class="pun">مستولى</span><span class="pln"> </span><span class="pun">البتات.</span><span class="pln">
</span><span class="pun">&lt;&lt;</span><span class="pln">  	</span><span class="pun">عامل</span><span class="pln"> </span><span class="pun">الإزاحة</span><span class="pln"> </span><span class="pun">الحسابية</span><span class="pln"> </span><span class="pun">نحو</span><span class="pln"> </span><span class="pun">اليسار</span><span class="pln"> </span><span class="pun">(مع</span><span class="pln"> </span><span class="pun">الأخذ</span><span class="pln"> </span><span class="pun">بعين</span><span class="pln"> </span><span class="pun">الاعتبار</span><span class="pln"> </span><span class="pun">بت</span><span class="pln"> </span><span class="pun">الإشارة).</span><span class="pln">
</span><span class="pun">&gt;&gt;</span><span class="pln">      </span><span class="pun">عامل</span><span class="pln"> </span><span class="pun">الإزاحة</span><span class="pln"> </span><span class="pun">الحسابية</span><span class="pln"> </span><span class="pun">نحو</span><span class="pln"> </span><span class="pun">اليمين</span><span class="pln"> </span><span class="pun">(مع</span><span class="pln"> </span><span class="pun">الأخذ</span><span class="pln"> </span><span class="pun">بعين</span><span class="pln"> </span><span class="pun">الاعتبار</span><span class="pln"> </span><span class="pun">بت</span><span class="pln"> </span><span class="pun">الإشارة).</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln">     </span><span class="pun">عامل</span><span class="pln"> </span><span class="pun">الإزاحة</span><span class="pln"> </span><span class="pun">المنطقية</span><span class="pln"> </span><span class="pun">نحو</span><span class="pln"> </span><span class="pun">اليمين</span><span class="pln"> </span><span class="pun">(بدون</span><span class="pln"> </span><span class="pun">الأخذ</span><span class="pln"> </span><span class="pun">بعين</span><span class="pln"> </span><span class="pun">الاعتبار</span><span class="pln"> </span><span class="pun">بت</span><span class="pln"> </span><span class="pun">الإشارة).</span><span class="pln">
</span><span class="pun">&amp;</span><span class="pln"> 	</span><span class="pun">على</span><span class="pln"> </span><span class="pun">مستوى</span><span class="pln"> </span><span class="pun">البتّات</span><span class="pln"> and </span><span class="pun">العملية</span><span class="pln"> </span><span class="pun">المنطقية</span><span class="pln">
</span><span class="pun">^</span><span class="pln">   	</span><span class="pun">على</span><span class="pln"> </span><span class="pun">مستوى</span><span class="pln"> </span><span class="pun">البتّات</span><span class="pln"> xor </span><span class="pun">العملية</span><span class="pln"> </span><span class="pun">المنطقية</span><span class="pln">
</span><span class="pun">|</span><span class="pln">    	</span><span class="pun">على</span><span class="pln"> </span><span class="pun">مستوى</span><span class="pln"> </span><span class="pun">البتّات</span><span class="pln"> or </span><span class="pun">العملية</span><span class="pln"> </span><span class="pun">المنطقية</span></pre>

<p>
	عمليات الزيادة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int i = 0;
System.out.println("\n-&gt;Inc/Dec-rementation");
</code></pre>

<p>
	العامل ++ يقوم بالزيادة بمقدار واحد. العامل – يقوم بالإنقاص بمقدار واحد. إذا تم وضع هذين العاملين قبل المتغير، فإنهن يقومان بالزيادة أو الإنقاص، ومن ثم يعيدان قيمة المتحول الجديدة. أما إذا تم وضع هذين العاملين بعد المتغير، فإنهما يقومان بإعادة قيمة المتحول، ومن ثم يقومان بالزيادة أو الإنقاص.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println(i++); // i = 1, يطبع 0 (زياده لاحقة).
System.out.println(++i); // i = 2, يطبع 2 (زيادة سابقة).
System.out.println(i--); // i = 1, يطبع 2 (إنقاص لاحق)
System.out.println(--i); // i = 0, يطبع 0 (إنقاص سابق)
</code></pre>

<h2 id="بنى-التحكم">
	بنى التحكم
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("\n-&gt;Control Structures");
</code></pre>

<p>
	عبارة <code>if</code>  مشابهة لتلك الموجودة في لغة البرمجة C
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int j = 10;
if (j == 10) {
   System.out.println("I get printed");
} else if (j &gt; 10) {
   System.out.println("I don't");
} else {
   System.out.println("I also don't");
}
</code></pre>

<p>
	حلقة <code>While</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int fooWhile = 0;
while(fooWhile &lt; 100) {
    System.out.println(fooWhile);
    //زيادة العدّاد
    //(في المجال (0،1،..99  foowhile مكررة 100 مرة ، حيث أن قيم المتغير  
    fooWhile++;
}
System.out.println("fooWhile Value: " + fooWhile);
</code></pre>

<p>
	حلقة <code>Do While</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int fooDoWhile = 0;
do {
     System.out.println(fooDoWhile);
     //زيادة العدّاد
     //في المجال 0-99 foowhile مكررة 99 مرة ، حيث أن قيم المتغير 

           fooDoWhile++;
} while(fooDoWhile &lt; 100);
     System.out.println("fooDoWhile Value: " + fooDoWhile);
</code></pre>

<p>
	حلقة <code>For</code> : هيكلية الحلقة على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8500_28" style=""><span class="kwd">for</span><span class="pun">(&lt;</span><span class="pln">start_statement</span><span class="pun">&gt;;</span><span class="pln"> </span><span class="str">&lt;conditional&gt;</span><span class="pun">;</span><span class="pln"> </span><span class="str">&lt;step&gt;</span><span class="pun">)</span></pre>

<p>
	مثال
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>for (int fooFor = 0; fooFor &lt; 10; fooFor++) {
     System.out.println(fooFor);
//  fooFor 0-&gt;9 مكررة 10 مرات، حيث   
}
     System.out.println("fooFor Value: " + fooFor);

//outerيتم الخروج من الحلقة الداخلية باستخدام جملة الهروب المعنونّة بـ 
     outer:
     for (int i = 0; i &lt; 10; i++) {
        for (int j = 0; j &lt; 10; j++) {
          if (i == 5 &amp;&amp; j ==5) {
             break outer;
//يخرج من الحلقة الخارجية أيضا، بدلاً من الخروج فقط من الحلقة الداخلية
           }
         }
       }
</code></pre>

<p>
	حلقة <code>For Each</code> : قادرة على العمل مع المصفوفات و الكائنات <code>for</code> إن حلقة التي تنفذ الواجهات القابلة للتكرار.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int[] fooList = {1, 2, 3, 4, 5, 6, 7, 8, 9};
</code></pre>

<p>
	هيكلية الحلقة على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8500_30" style=""><span class="kwd">for</span><span class="pln"> </span><span class="pun">(&lt;</span><span class="pln">object</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">&lt;iterable&gt;</span><span class="pun">)</span></pre>

<p>
	تقرأ هكذا: لكل عنصر في ال <code>iterable</code>
</p>

<p>
	<strong>ملاحظة</strong>: يجب أن يتطابق نوع الكائن مع نوع عناصر ال <code>iterable</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>for (int bar : fooList) {
    System.out.println(bar);
  //سوف تتكرر 9 مرات و يطبع 1-9 على سطور جديدة.
}
</code></pre>

<h3 id="switch">
	Switch
</h3>

<p>
	تعمل <code>Switch</code> مع أنواع المعطيات: <code>int</code>، <code>char</code>، <code>short</code> ،<code>byte</code> وأيضًا من الممكن أن تعمل مع النوع <code>Enum</code> و <code>String</code> و مجموعة من الصفوف الخاصة التي تجمع الأنواع البدائية: <code>Character</code>, <code>Byte</code>, <code>Short</code>, <code>Integer</code>. بدءًا من جافا 7، من الممكن استخدام النوع <code>String</code>. <strong>ملاحظة</strong>: تذكر عدم استخدام التعليمة "<code>break</code>" في نهاية حالة جزئية إذا كان هناك يوجد حالة أخرى تستوفي الشرط أيضًا.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int month = 3;
String monthString;
switch (month) {
   case 1: monthString = "January";
           break;
   case 2: monthString = "February";
           break;
   case 3: monthString = "March";
           break;
   default: monthString = "Some other month";
            break;
}
System.out.println("Switch Case Result: " + monthString);
</code></pre>

<h3>
	عبارة (<code>Try-with-resources</code>) في Java الإصدار +7
</h3>

<p>
	تُستخدم في جافا عبارات <code>Try-catch-finally</code>، و لكن في جافا +7 أيضا ً مُتاح استخدام <code>try-with-resources</code>
</p>

<p>
	إن عبارات <code>try-with-resources</code> تُبسط عمل عبارات <code>try-catch-finally</code> عن طريق إغلاق المصادر بشكل أتوماتيكي. لاستخدام <code>try-with-resources</code> ضمّن كائن من صف في تعليمة try.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8500_34" style=""><span class="kwd">try</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BufferedReader</span><span class="pln"> br </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">BufferedReader</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FileReader</span><span class="pun">(</span><span class="str">"foo.txt"</span><span class="pun">)))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="com">// يمكنك أن تجرّب شيئًا يحتاج إلى استثناء</span><span class="pln">
            </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">br</span><span class="pun">.</span><span class="pln">readLine</span><span class="pun">());</span><span class="pln">
            </span><span class="com">// في جافا 7 المصادر مغلقة دومًا حتى لو كان هناك استثناء</span><span class="pln">
        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> ex</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//catch سوف يتم إغلاق المصدر قبل أن تنفذ عبارة</span><span class="pln">
            </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"readLine() failed."</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span></pre>

<p>
	في هذه الحالة، لا يوجد حاجة إلى عبارة <code>finally</code> حيث أن <code>BufferedReader</code> تم إغلاقه للتو. يتم استخدام هذا لتجنب الحالات الحرجة، عندما عبارة <code>finally</code> لا يمكن استدعاءها.
</p>

<h3 id="الاختزال-الشرطي">
	الاختزال الشرطي
</h3>

<p>
	يمكنك استخدام العامل "<code>?</code>" لسرعة الأسناد . تُقرأ كما يلي: "إذا كانت العبارة صحيحة ، استخدم &lt;أول قيمة&gt; و إلا استخدم &lt;القيمة الثانية&gt;
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>int foo = 5;
String bar = (foo &lt; 10) ? "A" : "B";
System.out.println("bar : " + bar); // "bar : A"تطبع  
// صحيحة (foo &lt; 10) لأن العبارة 
//أو بشكل مبسط:
System.out.println("bar : " + (foo &lt; 10 ? "A" : "B"));
</code></pre>

<h2 id="التحويل-بين-أنواع-المعطيات">
	التحويل بين أنواع المعطيات
</h2>

<h3 id="تحويل-المعطيات">
	تحويل المعطيات
</h3>

<p>
	تحويل السلاسل المحرفية إلى عدد صحيح
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>Integer.parseInt("123");//يعيد نسخة العدد الصحيح من السلسة المحرفية "123"
</code></pre>

<p>
	تحويل العدد الصحيح إلى سلسلة محرفية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>Integer.toString(123);//يعيد النسخة المحرفية من العدد الصحيح 123
</code></pre>

<p>
	راجع تحويل المعطيات للأنواع التالية من الصفوف: Double Long String
</p>

<h2 id="الصفوف-و-التوابع">
	الصفوف و التوابع
</h2>

<p>
	للتصريح عن كائن من الصف <code>Bicycle</code> استخدم الكلمة المفتاحية <code>new</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>Bicycle trek = new Bicycle();
</code></pre>

<p>
	استدعاء توابع الكائن
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>trek.speedUp(3); // setter , getter  يجب عليك استخدام توابع الواضع و الآخذ 
trek.setCadence(100);
</code></pre>

<p>
	يُعيد التابع <code>()toString</code> التمثيل النصي للكائن.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>System.out.println("trek info: " + trek.toString());
</code></pre>

<p>
	التهيئة مزدوجة الأقواس لا تملك جافا تراكيب لتشكيل مجموعات ساكنة من المعطيات بطريقة سهلة عادةً يتم استخدام الطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>private static final Set&lt;String&gt; COUNTRIES = new HashSet&lt;String&gt;();
static {
    COUNTRIES.add("DENMARK");
    COUNTRIES.add("SWEDEN");
    COUNTRIES.add("FINLAND");
}
</code></pre>

<p>
	ولكن يوجد طريقة أنيقة لإنجاز الشيء نفسه بشكل أسهل، تُدعى هذه الطريقة مزدوجة الأقواس
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>private static final Set&lt;String&gt; COUNTRIES = new HashSet&lt;String&gt;() {{
    add("DENMARK");
    add("SWEDEN");
    add("FINLAND");
}}
</code></pre>

<p>
	يولد القوس الاول { } صف داخلي بدون اسم <code>AnonymousInnerClass</code> ويعرّف القوس الثاني{ } كتلة مهيئ الحالة instance. يتم استدعاء هذه الكتلة، عندما يتم توليد الصف الداخلي لا يعمل هذا فقط للمجموعات، إنما يعمل أيضًا لكل الصفوف غير النهائي <code>non-final</code>
</p>

<p>
	يمكنك تضمين صفوف أخرى خارجية غير عامة في ملف جافا ، ولكنها ليست بممارسة جيدة. بدلاً من ذلك يفضّل فصل الصفوف في ملفات جافا منفصلة
</p>

<h2 id="صيغة-التصريح-عن-صف">
	صيغة التصريح عن صف:
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_27" style=""><span class="com">// &lt;public/private/protected&gt; class &lt;class name&gt; {</span><span class="pln">
</span><span class="com">// }</span></pre>

<p>
	حقول البيانات, أنماط الباني, الوظائف كلها في الداخل
</p>

<p>
	تستدعى الوظائف كالدوال في جافا
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_29" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">Bicycle</span><span class="pln"> </span><span class="pun">{</span></pre>

<p>
	حقول و متغيرات الصف <code>Bicycle</code>
</p>

<p>
	<code>Public</code>: يمكن الوصول إليه من أي مكان
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_33" style=""><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> cadence</span><span class="pun">;</span></pre>

<p>
	<code>Private</code>: يمكن الوصول إليه فقط من داخل الصف
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_37" style=""><span class="kwd">private</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> speed</span><span class="pun">;</span></pre>

<p>
	<code>Protected</code>: يمكن الوصول إليه فقط من داخل الصف و الصفوف الفرعية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_41" style=""><span class="kwd">protected</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> gear</span><span class="pun">;</span></pre>

<p>
	<code>default</code>: يمكن الوصول إليه فقط من داخل الرزمة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_46" style=""><span class="typ">String</span><span class="pln"> name</span><span class="pun">;</span></pre>

<p>
	<code>Static</code> متغير صف ساكن
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_48" style=""><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> className</span><span class="pun">;</span></pre>

<h3>
	البلوك الساكن Static
</h3>

<p>
	لا تملك جافا تنفيذ للبواني الساكنة، ولكن جافا تملك كتل برمجية لتعريف متغيرات الصف (المتغيرات لساكنة) سيتم استدعاء هذا البلوك عند تحميل الصف.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>static {
    className = "Bicycle";
}
</code></pre>

<p>
	الباني هي الطريقة التي يتم فيها توليد الصفوف. هذا هو الباني
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>    public Bicycle() {
  //يمكنك أيضا استدعاء باني آخر:
        // this(1, 50, 5, "Bontrager");
        gear = 1;
        cadence = 50;
        speed = 5;
        name = "Bontrager";
    }
</code></pre>

<p>
	هذا عبارة عن باني ذو معاملات
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public Bicycle(int startCadence, int startSpeed, int startGear,
    String name) {
    this.gear = startGear;
    this.cadence = startCadence;
    this.speed = startSpeed;
    this.name = name;
}
</code></pre>

<h3 id="صيغة-المنهج--method-">
	صيغة الدالة
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2339_50" style=""><span class="com">// &lt;public/private/protected&gt; &lt;return type&gt; &lt;function name&gt;(&lt;args&gt;)</span></pre>

<p>
	أصناف الجافا غالبًا ما تنفّذ getters وsetters في حقولها
</p>

<p>
	صيغة التصريح عن الدالة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_17" style=""><span class="com">// &lt;access modifier&gt; &lt;return type&gt; &lt;method name&gt;(&lt;args&gt;)</span></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public int getCadence() {
     return cadence;
}
</code></pre>

<p>
	دوال <code>void</code> لا تحتاج تصريح عودة 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public void setCadence(int newValue) {
     cadence = newValue;
}
public void setGear(int newValue) {
     gear = newValue;
}
public void speedUp(int increment) {
     speed += increment;
}
public void slowDown(int decrement) {
     speed -= decrement;
}
public void setName(String newName) {
     name = newName;
}
public String getName() {
     return name;
}
</code></pre>

<p>
	دالة لتوليد قيم الصفات لهذا الكائن
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>@Override // موروثة من الصف لهذا الكائن.
public String toString() {
    return "gear: " + gear + " cadence: " + cadence + " speed: " + speed +
        " name: " + name;
}
</code></pre>

<p>
	الصف <code>PennyFarthing</code> عبارة عن صنف فرعي من Bicycle
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>class PennyFarthing extends Bicycle {
    -Penny Farthings //هي عباره عن نوع من الدراجات بعجلات أمامية كبيرة.
    public PennyFarthing(int startCadence, int startSpeed) {
    // super استدعي الباني الأب باستخدام الكلمة المفتاحية 
        super(startCadence, startSpeed, 0, "PennyFarthing");
    }
</code></pre>

<p>
	يجب عليك تعليم المنهج الذي تُعيد كتابته بـ <code>annotation@</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>@Override
public void setGear(int gear) {
    this.gear = 0;
}
</code></pre>

<h2 id="object-casting">
	Object casting
</h2>

<p>
	بما أن الصف <code>PennyFarthing</code> يرث الصف <code>Bicycle</code> : فمن الممكن القول أن: <code>Bicycle</code> هو <code>PennyFarthing</code>، و يمكن أن نكتب:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_19" style=""><span class="com">// Bicycle bicycle = new PennyFarthing();</span></pre>

<p>
	هذا يُدعى"<code>object casting</code>" حيث يتم تشكيل كائن من كائن آخر.
</p>

<h2 id="الواجهات">
	الواجهات
</h2>

<p>
	صيغة التصريح عن واجهة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_21" style=""><span class="com">// &lt;access-level&gt; interface &lt;interface-name&gt; extends &lt;super-interfaces&gt; {</span><span class="pln">
</span><span class="com">//     // Constants</span><span class="pln">
</span><span class="com">//     // Method declarations</span><span class="pln">
</span><span class="com">// }</span></pre>

<p>
	مثال - الطعام:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_23" style=""><span class="kwd">public</span><span class="pln"> interface </span><span class="typ">Edible</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> eat</span><span class="pun">();</span><span class="pln"> </span><span class="com">//يجب على أي صف ينفذ هذه الواجهة</span><span class="pln">
                       </span><span class="com">// ان ينفذ هذه الدالة</span><span class="pln">
</span><span class="pun">}</span><span class="pln">  </span></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_25" style=""><span class="kwd">public</span><span class="pln"> interface </span><span class="typ">Digestible</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> digest</span><span class="pun">();</span><span class="pln">
</span><span class="com">// منذ جافا 8، من الممكن أن تملك الواجهات دالة افتراضية.</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> defaultMethod</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Hi from default method ..."</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الآن يمكنك تشكيل صف يُنفذ كلا من هاتين الواجهتين.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public class Fruit implements Edible, Digestible {
    @Override
    public void eat() {
        // ...
    }
    @Override
    public void digest() {
        // ...
    }
}
</code></pre>

<p>
	في جافا، يمكنك أن تمدد(ترث) صف واحد فقط، ولكن يمكنك أن تنفذ عدّة واجهات . على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public class ExampleClass extends ExampleClassParent implements InterfaceOne,
    InterfaceTwo {
    @Override
    public void InterfaceOneMethod() {
    }

    @Override
    public void InterfaceTwoMethod() {
    }

}
</code></pre>

<h2 id="الصفوف-التجريدية">
	الصفوف التجريدية
</h2>

<p>
	صيغة التصريح عن صف تجريدي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_27" style=""><span class="com">// &lt;access-level&gt; abstract class &lt;abstract-class-name&gt; extends</span><span class="pln">
</span><span class="com">// &lt;super-abstract-classes&gt; {</span><span class="pln">
</span><span class="com">//     // Constants and variables</span><span class="pln">
</span><span class="com">//     // Method declarations</span><span class="pln">
</span><span class="com">// }</span></pre>

<p>
	لا يمكن تشكيل كائنات من الصفوف المجردة (تمثيل الصفوف المجردة)
</p>

<p>
	يمكن للصفوف المجردة أن تعرف عن دوال مجرّدة. المناهج المجردة لا تحوي على جسم ويجب تعليمها بالكلمة المفتاحية <code>abstract</code> . يجب على الصفوف الأبناء غير المجردة أن تعيد كتابة <code>Override@</code> جميع الدوال المجردة في صفوفها العليا.<br>
	من الممكن أن تكون الصفوف المجرّدة مفيدة عند الجمع بين منطق التكرار و السلوك المخصص، ولكن بما أن الصف المجرد يتطلب الوراثة، فإن الصفوف المجردة تنتهك منطق "التركيب عبر الوراثة". لذلك خُذ بعين الاعتبار الطرق الأخرى التي تستخدم هذا التركيب
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public abstract class Animal
{
    private int age;

    public abstract void makeSound();
</code></pre>

<p>
	من الممكن أن يحوي المنهج جسم
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public void eat()
{
    System.out.println("I am an animal and I am Eating.");

//(private)ملاحظة: من الممكن هنا الوصول للمتغيرات الخاصة  
        age = 30;
    }

    public void printAge()
    {
        System.out.println(age);
    }
</code></pre>

<p>
	يمكن أن تحوي الصفوف المجردة على دالة رئيسية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>    public static void main(String[] args)
    {
        System.out.println("I am abstract");
    }
}
</code></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_29" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">Dog</span><span class="pln"> extends </span><span class="typ">Animal</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="pun">لاحظ</span><span class="pln"> </span><span class="pun">بأنه</span><span class="pln"> </span><span class="pun">لا</span><span class="pln"> </span><span class="pun">يزال</span><span class="pln"> </span><span class="pun">هناك</span><span class="pln"> </span><span class="pun">حاجة</span><span class="pln"> </span><span class="pun">لإعادة</span><span class="pln"> </span><span class="pun">كتابة</span><span class="pln"> </span><span class="pun">الدوال</span><span class="pln"> </span><span class="pun">التجريدية</span><span class="pln"> </span><span class="pun">في</span><span class="pln"> </span><span class="pun">الصف</span><span class="pln"> </span><span class="pun">التجريدي</span><span class="pln"> </span><span class="com">//</span><span class="pln">
    </span><span class="lit">@Override</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> makeSound</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Bark"</span><span class="pun">);</span><span class="pln">
        </span><span class="com">// age = 30;    ==&gt; ERROR! </span><span class="pln">
</span><span class="com">// Animal خاص بالنسبة للصف age خطأ- و ذلك لأن المتغير</span><span class="pln">
 
    </span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: من الممكن أن تحصل على خطأ إذا قمت هنا باستخدام <code>Override@</code> لأن جافا لا تسمح لك بإعادة كتابة الدوال الساكنة. ما يحدث هنا يُدعى إخفاء الدالة METHOD HIDING
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public static void main(String[] args)
{
    Dog pluto = new Dog();
    pluto.makeSound();
    pluto.eat();
    pluto.printAge();
}
</code></pre>

<h2 id="الصفوف-النهائية-final-class">
	الصفوف النهائية final class
</h2>

<p>
	صيغة التصريح عن الصفوف النهائية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_31" style=""><span class="com">// &lt;access-level&gt; final &lt;final-class-name&gt; {</span><span class="pln">
</span><span class="com">//     // Constants and variables</span><span class="pln">
</span><span class="com">//     // Method declarations</span><span class="pln">
</span><span class="com">// }</span></pre>

<p>
	الصفوف النهائية هي عبارة عن الصفوف التي لا يمكن وراثتها، (أي هي الولد النهائي). بطريقة ما، تُعد الصفوف النهائية معاكس الصفوف المجردة. لأنه يجب توسيع (وراثة) الصفوف المجردة، أما الصفوف النهائية لا يمكن توسيعها.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_33" style=""><span class="kwd">public</span><span class="pln"> final </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">SaberToothedCat</span><span class="pln"> extends </span><span class="typ">Animal</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="pun">لاحظ</span><span class="pln"> </span><span class="pun">بأنه</span><span class="pln"> </span><span class="pun">ما</span><span class="pln"> </span><span class="pun">يزال</span><span class="pln"> </span><span class="pun">يوجد</span><span class="pln"> </span><span class="pun">حاجة</span><span class="pln"> </span><span class="pun">لإعادة</span><span class="pln"> </span><span class="pun">كتابة</span><span class="pln"> </span><span class="pun">الدوال</span><span class="pln"> </span><span class="pun">المجردة</span><span class="pln"> </span><span class="pun">في</span><span class="pln"> </span><span class="pun">الصف</span><span class="pln"> </span><span class="pun">المجرد.</span><span class="com">//</span><span class="pln">
    </span><span class="lit">@Override</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> makeSound</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Roar"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="المناهج-النهائية">
	الدوال النهائية
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8029_35" style=""><span class="kwd">public</span><span class="pln"> abstract </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Mammal</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
 </span><span class="com">// صيغة الدالة النهائية:</span><span class="pln">
 </span><span class="com">// &lt;access modifier&gt; final &lt;return type&gt; &lt;function name&gt;(&lt;args&gt;)</span><span class="pln">
 </span><span class="com">// لا يمكن إعادة كتابة الدوال النهائية بواسطة صف ابن، </span><span class="pln">
 </span><span class="com">// وبالتالي الدالة النهائية هو أخر تنفيذ للدالة . </span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> final boolean isWarmBlooded</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="النوع-enum">
	النوع Enum
</h2>

<p>
	<code>еnum</code>  هي طريقة تنظيمية للثوابت (Constants) في الكود بحيث تجمع الثوابت التي لها علاقة ببعضها تحت فئة واحدة بطريقة تنظم الوصول إليها .بما أن هذه القيم هي عبارة عن ثوابت، لذلك فإن أسماء الحقول من النوع <code>enum</code> يجب أن تكتب بحروف كبيرة. في لغة جافا يتم تعريف هذا النوع باستخدام الكلمة المفتاحية <code>enum</code>. لتعريف متحول عن يوم من أيام الأسبوع، باستخدام النوع <code>enum</code> :
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY
}
</code></pre>

<p>
	من الممكن استخدام متغيرنا Day من النوع <code>enum</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6889_11" style=""><code>public class EnumTest {
 //Enumالمتغير من النوع   
    Day day;

    public EnumTest(Day day) {
        this.day = day;
    }

    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println("Mondays are bad.");
                break;
            case FRIDAY:
                System.out.println("Fridays are better.");
                break;
            case SATURDAY:
            case SUNDAY:
                System.out.println("Weekends are best.");
                break;
            default:
                System.out.println("Midweek days are so-so.");
                break;
        }
    }

    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs(); // =&gt; Mondays are bad.
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs(); // =&gt; Midweek days are so-so.
    }
}
</code></pre>

<p>
	الأنواع <code>enum</code> هي فعالة بشكل أكبر مما تم توضيحه فوق. من الممكن أن يحتوي جسم المتغير <code>enum</code> على دوال و حقول أخرى.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://learnxinyminutes.com/docs/java/" rel="external nofollow">Learn Java in Y Minutes</a>
</p>
]]></description><guid isPermaLink="false">599</guid><pubDate>Mon, 15 Jan 2018 07:04:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x645;&#x62F;&#x62E;&#x644;&#x627;&#x62A; &#x648;&#x625;&#x638;&#x647;&#x627;&#x631; &#x627;&#x644;&#x645;&#x62E;&#x631;&#x62C;&#x627;&#x62A; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AF%D8%AE%D9%84%D8%A7%D8%AA-%D9%88%D8%A5%D8%B8%D9%87%D8%A7%D8%B1-%D8%A7%D9%84%D9%85%D8%AE%D8%B1%D8%AC%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-r383/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_10/java-input-output.png.416d58de3e8b379d0aa910e5ade086d9.png" /></p>

<p>
	كانت <a href="https://academy.hsoub.com/search/?tags=%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA+%D9%84%D8%BA%D8%A9+%D8%AC%D8%A7%D9%81%D8%A7" rel="">البرامج التي اطلعنا عليها لحد الآن</a> تعرض رسائل على الشاشة فقط، الذي لا يشتمل على حسابات حقيقية كثيرة. سيبين لك هذا الفصل طريقة قراءة الدخل من لوحة المفاتيح، واستخدام ذلك الدخل لحساب نتائج معينة، ثم تنسيق تلك النتائج وعرضها على الخرج.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="19324" data-unique="rsjq961n9" src="https://academy.hsoub.com/uploads/monthly_2016_10/java-input-output.png.a20f043b7a6b8fc96da220a47a959c08.png" alt="java-input-output.png"></p>

<h2>
	صنف System
</h2>

<p>
	لقد استخدمنا <span style="font-family:courier new,courier,monospace;">System.out.println</span> كثيرًا، لكن ربما لم تنتبه لمعناها. <span style="font-family:courier new,courier,monospace;">System</span> هو صنف يوفر توابع متعلقة "بالنظام" (system) أو البيئة التي تعمل فيها البرامج. كما أنه يوفر أيضًا<span style="font-family:courier new,courier,monospace;"> System.out</span>، وهي قيمة خاصة توفر توابع لعرض الخرج، ومنها تابع <span style="font-family:courier new,courier,monospace;">println</span>.
</p>

<p>
	في الواقع، يمكنك استخدام <span style="font-family:courier new,courier,monospace;">System.out.println</span> لعرض قيمة <span style="font-family:courier new,courier,monospace;">System.out</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_9">
<span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">);</span></pre>

<p>
	النتيجة هي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6044_11">
<span class="pln">java.io.PrintStream@685d72cd</span></pre>

<p>
	يدل هذا الخرج على أن <span style="font-family:courier new,courier,monospace;">System.out</span> هو <span style="font-family:courier new,courier,monospace;">PrintStream</span>، معرف ضمن حزمة تدعى <span style="font-family:courier new,courier,monospace;">java.io</span>. الحزمة (package) هي مجموعة من الأصناف المتعلقة ببعضها؛ تحوي حزمة <span style="font-family:courier new,courier,monospace;">java.io</span> الأصناف المتعلقة بالدخل والخرج اللذان يرمز لهما بالحرفين I/O والتي تعني Input and Output.
</p>

<p>
	أما الأرقام والأحرف بعد علامة @ فهي تمثل عنوان (address) الكائن <span style="font-family:courier new,courier,monospace;">System.out</span> بشكل رقم ست عشري (في الأساس 16). عنوان القيمة هو موقعها في ذاكرة الحاسوب، وهذا الموقع قد يختلف بين الحواسيب المختلفة (أو عند تشغيل البرنامج في المرات التالية). كان العنوان في هذا المثال 685d72cd، لكن إذا شغلت البرنامج نفسه ثانية فقد تحصل على عنوان مختلف.
</p>

<p>
	كما يبين الشكل التالي، الصنف <span style="font-family:courier new,courier,monospace;">System</span> معرفٌ في ملف اسمه <span style="font-family:courier new,courier,monospace;">System.java</span>، وهناك ملف آخر يعرف فيه الصنف <span style="font-family:courier new,courier,monospace;">PrintStream</span> اسمه <span style="font-family:courier new,courier,monospace;">PrintStream.java</span>. هذه الملفات تابعة لمكتبة (library) لغة Java، وهي عبارة عن مجموعة ضخمة من الأصناف التي تستطيع استخدامها في برامجك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19322" href="https://academy.hsoub.com/uploads/monthly_2016_10/figure3.1.jpg.73c6c310c0d59a562700c80b5c539e34.jpg" rel="external"><img alt="figure3.1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="19322" data-unique="9e57hqhub" src="https://academy.hsoub.com/uploads/monthly_2016_10/figure3.1.thumb.jpg.32ffc80220fca6f4fc7b12133d408a6b.jpg"></a>
</p>

<p>
	تشير تعليمة<span style="font-family:courier new,courier,monospace;"> System.out.println</span> إلى المتغير <span style="font-family:courier new,courier,monospace;">out</span> ضمن الصنف <span style="font-family:courier new,courier,monospace;">System</span>، وهو كائن من النوع <span style="font-family:courier new,courier,monospace;">PrintStream</span> يوفر تابعًا يدعى <span style="font-family:courier new,courier,monospace;">println</span>.
</p>

<h2>
	صنف Scanner
</h2>

<p>
	يحوي الصنف <span style="font-family:courier new,courier,monospace;">System</span> أيضًا القيمة الخاصة<span style="font-family:courier new,courier,monospace;"> System.in</span>، وهي <span style="font-family:courier new,courier,monospace;">InputStream</span> يوفر توابع لقراءة الدخل من لوحة المفاتيح. استخدام هذه التوابع ليس سهلًا؛ لكن لحسن الحظ أن Java توفر أصنافًا أخرى تسهل مهام الإدخال الشائعة.
</p>

<p>
	مثلًا، يوفر الصنف <span style="font-family:courier new,courier,monospace;">Scanner</span> توابع لإدخال الكلمات، والأرقام، وغيرها من البيانات. يتوفر <span style="font-family:courier new,courier,monospace;">Scanner</span> في الحزمة <span style="font-family:courier new,courier,monospace;">java.util</span>، التي تحوي أصنافًا مفيدة جدًا تدعى "utility classes" (أصناف المرافق). قبل أن تتمكن من استخدام <span style="font-family:courier new,courier,monospace;">Scanner</span>، عليك استيراده كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_13">
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Scanner</span><span class="pun">;</span></pre>

<p>
	توضح تعليمة الاستيراد (import statement) للمترجم أنك عندما تقول <span style="font-family:courier new,courier,monospace;">Scanner</span> فأنت تقصد أحد الأصناف المعرفة في<span style="font-family:courier new,courier,monospace;"> java.util</span>. هذه التعليمة ضرورية لأنه يحتمل وجود أصناف أخرى اسمها <span style="font-family:courier new,courier,monospace;">Scanner</span> في حزم أخرى. استخدام تعليمة الاستيراد يجعل الكود واضحًا.
</p>

<p>
	لا يمكن استخدام تعليمات الاستيراد داخل تعريف صنف. تقليديًا، توضع تعليمات الاستيراد في بداية الملف.
</p>

<p>
	بعد ذلك عليك إنشاء <span style="font-family:courier new,courier,monospace;">Scanner</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_15">
<span class="typ">Scanner</span><span class="pln"> in </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Scanner</span><span class="pun">(</span><span class="typ">System</span><span class="pun">.</span><span class="pln">in</span><span class="pun">);</span></pre>

<p>
	يصرح هذا السطر عن متغير من نوع <span style="font-family:courier new,courier,monospace;">Scanner</span> ويسميه <span style="font-family:courier new,courier,monospace;">in</span> وينشئ كائنًا جديدًا من نوع <span style="font-family:courier new,courier,monospace;">Scanner</span> الذي يستقبل المدخلات من<span style="font-family:courier new,courier,monospace;"> System.in</span>.
</p>

<p>
	يوفر <span style="font-family:courier new,courier,monospace;">Scanner</span> تابعًا يدعى <span style="font-family:courier new,courier,monospace;">nextLine</span> الذي يقرأ الدخل من لوحة المفاتيح وترجع <span style="font-family:courier new,courier,monospace;">String</span>. في المثال التالي نقرأ سطرين ونعيد إخراجهما للمستخدم:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_17">
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Scanner</span><span class="pun">;</span><span class="pln"> 

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Echo</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
  
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="typ">String</span><span class="pln"> line</span><span class="pun">;</span><span class="pln"> 
    </span><span class="typ">Scanner</span><span class="pln"> in </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Scanner</span><span class="pun">(</span><span class="typ">System</span><span class="pun">.</span><span class="pln">in</span><span class="pun">);</span><span class="pln"> 
    
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Type something: "</span><span class="pun">);</span><span class="pln"> 
    line </span><span class="pun">=</span><span class="pln"> in</span><span class="pun">.</span><span class="pln">nextLine</span><span class="pun">();</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"You said: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> line</span><span class="pun">);</span><span class="pln"> 
    
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Type something else: "</span><span class="pun">);</span><span class="pln"> 
    line </span><span class="pun">=</span><span class="pln"> in</span><span class="pun">.</span><span class="pln">nextLine</span><span class="pun">();</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"You also said: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> line</span><span class="pun">);</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	إذا أغفلت تعليمة الاستيراد ثم استخدمت <span style="font-family:courier new,courier,monospace;">Scanner</span> سوف يعطي المترجم خطأ يشبه "Cannot find symbol" (لا يمكن العثور على الرمز). هذا يعني أن المترجم لا يعرف ماذا تعني عندما تقول <span style="font-family:courier new,courier,monospace;">Scanner</span>.
</p>

<p>
	لعلك تتساءل لم يمكننا استخدام الصنف <span style="font-family:courier new,courier,monospace;">System</span> دون استيراده؟ السبب هو أن الصنف <span style="font-family:courier new,courier,monospace;">System</span> ينتمي لحزمة <span style="font-family:courier new,courier,monospace;">java.lang</span>، التي تستورد آليًا في جميع البرامج. حسب وثائق اللغة فإن <span style="font-family:courier new,courier,monospace;">java.lang </span>"توفر أصنافًا جوهرية في تصميم لغة البرمجة Java". صنف <span style="font-family:courier new,courier,monospace;">String</span> ينتمي أيضًا لحزمة <span style="font-family:courier new,courier,monospace;">java.lang</span>.
</p>

<h2>
	بنية البرنامج
</h2>

<p>
	لقد تعرفنا الآن على كافة العناصر التي تتكون منها برامج Java. يوضح الشكل التالي هذه العناصر التنظيمية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19323" href="https://academy.hsoub.com/uploads/monthly_2016_10/figure3.2.jpg.bd8f8ec1bffaa63511010104cd8ace83.jpg" rel="external"><img alt="figure3.2.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="19323" data-unique="gobytmyeu" src="https://academy.hsoub.com/uploads/monthly_2016_10/figure3.2.thumb.jpg.7a3b3d849617c71bcfbc34c470e1ee49.jpg"></a>
</p>

<p style="text-align: center;">
	<strong>عناصر لغة Java، من الأكبر إلى الأصغر</strong>
</p>

<p>
	كمراجعة سريعة، الحزمة هي مجموعة أصناف، والأصناف تعرف فيها توابع. التوابع تحوي تعليمات، والتعليمات قد تحوي تعابير. تتكون التعابير من علامات (tokens)، وهي العناصر الأساسية للبرنامج، وتشمل الأرقام، وأسماء المتغيرات، والعوامل الحسابية، والكلمات المفتاحية، والرموز مثل الأقواس والفواصل المنقوطة.
</p>

<p>
	تأتي النسخة القياسية من Java مزودة بعدة آلاف من الأصناف التي يمكنك استيرادها، وهذا مثير جدًا ومخيف في نفس الوقت. يمكنك تصفح <a href="http://docs.oracle.com/javase/8/docs/api/" rel="external nofollow">مكتبة جافا</a> حيث أنها نفسها مكتوبة بلغة Java.
</p>

<p>
	لاحظ أن هناك فرق كبير بين لغة Java، التي تُعرّف التراكيب النحوية ومعاني العناصر المبينة في الشكل السابق، وبين مكتبة Java، التي توفر الأصناف المرفقة مع اللغة.
</p>

<h2>
	التحويل من إنش إلى سنتيمتر
</h2>

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

<p>
	يمكننا كتابة برنامج يساعد في ذلك. سنستخدم <span style="font-family:courier new,courier,monospace;">Scanner</span> لإدخال القياسات بالإنش، ثم نحولها إلى سنتيمتر، ثم نعرض النتائج. تصرح السطور التالية عن المتغيرات وتنشئ <span style="font-family:courier new,courier,monospace;">Scanner</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_24">
<span class="kwd">int</span><span class="pln"> inch</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">double</span><span class="pln"> cm</span><span class="pun">;</span><span class="pln"> 

</span><span class="typ">Scanner</span><span class="pln"> in </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Scanner</span><span class="pun">(</span><span class="typ">System</span><span class="pun">.</span><span class="pln">in</span><span class="pun">);</span></pre>

<p>
	الخطوة التالية هي طلب المدخلات من المستخدم. سنستخدم تعليمة <span style="font-family:courier new,courier,monospace;">print</span> بدلًا من <span style="font-family:courier new,courier,monospace;">println</span> حتى يتمكن من كتابة المدخلات على نفس السطر. وسنستخدم تابع <span style="font-family:courier new,courier,monospace;">nextInt</span> من الصنف <span style="font-family:courier new,courier,monospace;">Scanner</span>، التي تقرأ الدخل من لوحة المفاتيح وتحوله إلى عدد صحيح:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_26">
<span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"How many inches? "</span><span class="pun">);</span><span class="pln"> 
inch </span><span class="pun">=</span><span class="pln"> in</span><span class="pun">.</span><span class="pln">nextInt</span><span class="pun">();</span></pre>

<p>
	بعد ذلك، سوف نضرب الرقم المدخل بالقيمة 2.54، بما أننا نعرف أن كل إنش هو 2.54 سنتيمتر، ثم نعرض النتيجة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_28">
<span class="pln">cm </span><span class="pun">=</span><span class="pln"> inch </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2.54</span><span class="pun">;</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="pln">inch </span><span class="pun">+</span><span class="pln"> </span><span class="str">" in = "</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">cm </span><span class="pun">+</span><span class="pln"> </span><span class="str">" cm"</span><span class="pun">);</span></pre>

<p>
	هذه الأكواد تعمل بشكل صحيح، لكن هناك مشكلة صغيرة. إذا قرأ مبرمج آخر هذا الكود، فقد يتساءل من أين أتت القيمة 2.54. من أجل مصلحة الآخرين (ومصلحتك المستقبلية) يفضل إسناد هذه القيمة إلى متغير له اسم واضح. سنوضح ذلك في القسم التالي.
</p>

<h2>
	القيم الحرفية والثوابت
</h2>

<p>
	تدعى القيم التي تكتب في البرنامج، مثل 2.54، بالقيم الحرفية (literals). بشكل عام، ليس هناك مشكلة باستخدام القيم الحرفية. لكن عندما تظهر أرقام مثل 2.54 في التعابير دون أي تفسير، سوف تجعل الكود أصعب على القراءة. وإذا ظهرت القيمة نفسها مرات عديدة، وكانت هناك احتمال أن تتغير هذه القيمة في المستقبل، فهذا يجعل الكود أصعب على الصيانة والتجديد.
</p>

<p>
	هذه القيم تدعى أحيانًا الأرقام السحرية (magic numbers) (مع العلم أن الأشياء "السحرية" ليست جيدة هنا). من الممارسات الجيدة إسناد هذه القيم السحرية إلى متغيرات لها أسماء معبرة، كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_21">
<span class="kwd">double</span><span class="pln"> cmPerInch </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2.54</span><span class="pun">;</span><span class="pln"> 
cm </span><span class="pun">=</span><span class="pln"> inch </span><span class="pun">*</span><span class="pln"> cmPerInch</span><span class="pun">;</span></pre>

<p>
	هذه النسخة أسهل للقراءة وأقل عرضة للخطأ، لكن لا يزال هناك مشكلة. المتغيرات تتغير، لكن عدد السنتيمترات في الإنش الواحد لا يتغير. يجب ألا تتغير قيمة <span style="font-family:courier new,courier,monospace;">cmPerInch</span> بعد إسناد قيمته أول مرة. توفر Java الكلمة المفتاحية <span style="font-family:courier new,courier,monospace;">final</span> لفرض هذا الشرط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6044_19">
<span class="pln">final </span><span class="kwd">double</span><span class="pln"> CM_PER_INCH </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2.54</span><span class="pun">;</span></pre>

<p>
	التصريح عن متغير بكلمة <span style="font-family:courier new,courier,monospace;">final</span> يعني أنه لا يمكن إسناد قيم جديدة له بعد نهيئته أول مرة. إذا حاولت تغيير قيمته، سوف يعطيك المترجم خطأ. تدعى المتغيرات التي يصرح عنها بكلمة <span style="font-family:courier new,courier,monospace;">final</span> بالثوابت (constants). حسب التقاليد، تكتب أسماء الثوابت بحروف كبيرة، وتستخدم الشرطة المنخفضة (_) للفصل بين الكلمات.
</p>

<p>
	ترجمة -وبتصرف- للفصل <a href="http://greenteapress.com/thinkjava6/html/thinkjava6004.html" rel="external nofollow">Input and output</a> من كتاب <a href="http://greenteapress.com/thinkjava6/html/index.html" rel="external nofollow">Think Java: How to Think Like a Computer Scientist</a> لكاتبيه Allen B. Downey و Chris Mayfield.
</p>
]]></description><guid isPermaLink="false">383</guid><pubDate>Sun, 09 Oct 2016 06:46:28 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x639;&#x648;&#x627;&#x645;&#x644; &#x648;&#x627;&#x644;&#x623;&#x62E;&#x637;&#x627;&#x621; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%B9%D9%88%D8%A7%D9%85%D9%84-%D9%88%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-r380/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_10/java-variables-errors.png.322d28745607b20870c30ca1f1717206.png" /></p>
<p>
	يشرح هذا المقال طريقة كتابة تعليمات تحوي متغيرات تخزن فيها قيمًا مختلفة، كالأرقام والكلمات، وتحوي أيضًا عوامل حسابية (operators)، وهي رموز تمثل عمليات حسابية. 
</p>

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

<p style="text-align: center;">
	<img alt="java-variables-errors.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19246" data-unique="xm8j93v02" src="https://academy.hsoub.com/uploads/monthly_2016_10/java-variables-errors.png.55c0ebfb1d59395711d9dcdec2961ec7.png">
</p>

<h2>
	التصريح عن المتغيرات
</h2>

<p>
	أحد أقوى المزايا لأي لغة برمجة هي القدرة على تعريف ومعالجة المتغيرات (variables). المتغير هو منطقة ذات اسم تخزّن قيمة (value). قد تكون القيم أرقامًا، أو نصوصًا، أو صورًا، أو مقاطع صوتية، وغيرها من أنواع البيانات. عليك أولًا التصريح عن متغير ثم تخزين القيم فيه.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_8"><span class="typ">String</span><span class="pln"> message</span><span class="pun">;</span></pre>

<p>
	هذا النوع من التعليمات يدعى تصريح (declaration)، لأنها تصرح أن نوع المتغير المدعو <span style="font-family:courier new,courier,monospace;">message</span> هو <span style="font-family:courier new,courier,monospace;">String</span>. لكل متغير نوع (type) يحدد نوع القيم التي يمكنه تخزينها. مثلًا، النوع <span style="font-family:courier new,courier,monospace;">int</span> يخزن الأعداد الصحيحة، والنوع <span style="font-family:courier new,courier,monospace;">String</span> يخزن السلاسل المحرفية.
</p>

<p>
	بعض الأنواع تبدأ بحرف كبير وبعضها الآخر يبدأ بحرف صغير. سنعرف معنى هذا التمييز لاحقًا، لكن الآن عليك الانتباه لكتابتها بشكل صحيح. ليس هناك نوع <span style="font-family:courier new,courier,monospace;">Int</span> ولا <span style="font-family:courier new,courier,monospace;">string</span>.
</p>

<p>
	لإنشاء متغير من النوع الصحيح، التعليمة هي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_10"><span class="kwd">int</span><span class="pln"> x</span><span class="pun">;</span></pre>

<p>
	حيث <span style="font-family:courier new,courier,monospace;">x</span> هو اسم كيفي اخترناه للمتغير. بشكل عام، عليك اختيار أسماء المتغيرات بحيث تدل على دور المتغير في البرنامج. مثلًا، عندما ترى التصريحات التالية عن المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_12"><span class="typ">String</span><span class="pln"> firstName</span><span class="pun">;</span><span class="pln"> 
</span><span class="typ">String</span><span class="pln"> lastName</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">int</span><span class="pln"> hour</span><span class="pun">,</span><span class="pln"> minute</span><span class="pun">;</span></pre>

<p>
	هذا المثال يصرح عن متغيرين من نوع <span style="font-family:courier new,courier,monospace;">String</span> ومتغيرين من نوع <span style="font-family:courier new,courier,monospace;">int</span>. عندما يتكون اسم المتغير من كلمتين أو أكثر، مثل المتغير <span style="font-family:courier new,courier,monospace;">firstName</span>، جرت العادة على جعل الحرف الأول من كل كلمة حرفًا كبيرًا عدا الكلمة الأولى. أسماء المتغيرات حساسة لحالة الأحرف، ولذلك فالمتغير <span style="font-family:courier new,courier,monospace;">firstName</span> مختلف عن المتغير <span style="font-family:courier new,courier,monospace;">firstName</span> أو <span style="font-family:courier new,courier,monospace;">FirstName</span>.
</p>

<p>
	يوضح هذا المثال أيضًا صيغة التصريح عن عدة متغيرات من نفس النوع في سطر واحد: كلًا من <span style="font-family:courier new,courier,monospace;">hour</span> و <span style="font-family:courier new,courier,monospace;">minute</span> هو عدد صحيح (متغير من النوع <span style="font-family:courier new,courier,monospace;">int</span>). لاحظ أن كل تعليمة تصريح تنتهي بفاصلة منقوطة.
</p>

<p>
	يمكنك تسمية متغيراتك كما تشاء. لكن هناك حوالي 50 كلمة محجوزة، تدعى الكلمات المفتاحية (keywords)، ولا يسمح لك باستخدامها كأسماء لمتغيراتك. هذه الكلمات تشمل <span style="font-family:courier new,courier,monospace;">public</span>، و<span style="font-family:courier new,courier,monospace;">class</span>، و<span style="font-family:courier new,courier,monospace;">static</span>، و<span style="font-family:courier new,courier,monospace;">void</span>، و<span style="font-family:courier new,courier,monospace;">int</span>، التي يستخدمها المترجم لتحليل بنية البرنامج.
</p>

<p>
	هناك <a href="http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html" rel="external nofollow">قائمة كاملة بالكلمات المفتاحية</a> موجودة، لكن لا حاجة لحفظها. معظم المحررات المستخدمة في البرمجة توفر ميزة "تلوين الشفرة" (syntax highlighting)، التي تجعل الأجزاء المختلفة من البرنامج تظهر بألوان مختلفة.
</p>

<h3>
	الإسناد
</h3>

<p>
	بعد أن صرحنا عن بعض المتغيرات، سنستخدمها لتخزين بعض القيم فيها. يمكننا عمل ذلك باستخدام تعليمة الإسناد (assignment).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_19"><span class="pln">message </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello!"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// give message the value "Hello!" </span><span class="pln">

hour </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln"> </span><span class="com">// assign the value 11 to hour </span><span class="pln">

minute </span><span class="pun">=</span><span class="pln"> </span><span class="lit">59</span><span class="pun">;</span><span class="pln"> </span><span class="com">// set minute to 59</span></pre>

<p>
	يبين هذا المثال ثلاث تعليمات إسناد، والتعليقات تظهر ثلاثة أساليب يستخدمها الناس أحيانًا عندما يقرؤون تعليمات الإسناد. قد تكون المفردات مربكة هنا، لكن الفكرة واضحة :
</p>

<ul>
	<li>
		عندما تصرح عن متغير، أنت تنشئ منطقة تخزينية لها اسم.
	</li>
	<li>
		عندما تطبق تعليمة الإسناد على متغير، فأنت تغير القيمة التي يحويها.
	</li>
</ul>

<p>
	كقاعدة عامة، يجب أن يكون نوع المتغير من نفس نوع القيمة التي تسندها إليه. مثلًا، لا يمكنك تخزين سلسلة محرفية في المتغير <span style="font-family:courier new,courier,monospace;">minute</span> أو عددًا صحيحًا في <span style="font-family:courier new,courier,monospace;">message</span>.
</p>

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

<p>
	أحد مصادر الإرباك هو أن بعض السلاسل المحرفية تبدو مثل الأرقام، لكنها ليست كذلك. مثلًا، يمكن أن يخزن المتغير <span style="font-family:courier new,courier,monospace;">message</span> السلسلة المحرفية "123"، المكونة من المحارف '1' و '2' و '3'، لكنها ليست مثل العدد الصحيح 123.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_17"><span class="pln">message </span><span class="pun">=</span><span class="pln"> </span><span class="str">"123"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// legal </span><span class="pln">

message </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123</span><span class="pun">;</span><span class="pln"> </span><span class="com">// not legal</span></pre>

<p>
	يجب تهيئة المتغيرات (initialize)، أي إسناد قيمة لها أول مرة، قبل أن تستخدمها. يمكنك التصريح عن متغير ثم إسناد قيمة له لاحقًا، كما في المثال السابق. كما يمكنك أيضًا التصريح عن المتغير وتهيئته بسطر واحد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_21"><span class="typ">String</span><span class="pln"> message </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello!"</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">int</span><span class="pln"> hour </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">int</span><span class="pln"> minute </span><span class="pun">=</span><span class="pln"> </span><span class="lit">59</span><span class="pun">;</span></pre>

<h3>
	مخططات الحالة
</h3>

<p>
	قد تظن أن تعليمة <span style="font-family:courier new,courier,monospace;">a = b</span> هي تعليمة مساواة لأن Java تستخدم الرمز = لعملية الإسناد. لكنها ليست مساواة!
</p>

<p>
	المساواة عملية تبديلية، أما الإسناد فلا. على سبيل المثال، في الرياضيات إذا كان<span style="font-family:courier new,courier,monospace;"> a = 7</span> إذًا<span style="font-family:courier new,courier,monospace;"> 7 = a</span>. لكن في Java<span style="font-family:courier new,courier,monospace;"> ‏a = 7;‎</span> تعليمة إسناد مشروعة، لكن <span style="font-family:courier new,courier,monospace;">7 = a‎</span> غير مشروعة. يجب أن يكون الطرف الأيسر من تعليمة الإسناد متغيرًا (اسمًا لموقع تخزيني).
</p>

<p>
	في الرياضيات أيضًا، جملة المساواة صحيحة دائمًا. إذا كان <span style="font-family:courier new,courier,monospace;">a = b </span>الآن، فإن <span style="font-family:courier new,courier,monospace;">a</span> سيبقى مساويًا لـ <span style="font-family:courier new,courier,monospace;">b</span> دائمًا. أما في Java، فتعليمة الإسناد قد تجعل قيمتي متغيرين متساويتان، لكن قد لا يستمران على هذه الحال.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_23"><span class="kwd">int</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">int</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">;</span><span class="pln"> </span><span class="com">// a and b are now equal </span><span class="pln">

a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"> </span><span class="com">// a and b are no longer equal</span></pre>

<p>
	في السطر الثالث تغيرت قيمة <span style="font-family:courier new,courier,monospace;">a</span>، لكن قيمة <span style="font-family:courier new,courier,monospace;">b</span> لم تتغير، وبالتالي لم يبق المتغيران متساويان.
</p>

<p style="text-align: center;">
	<img alt="figure2.1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="19245" data-unique="7z8ic5ywi" src="https://academy.hsoub.com/uploads/monthly_2016_10/figure2.1.jpg.a361664eb048f02de4d369427b9691a4.jpg">
</p>

<p>
	المتغيرات في البرنامج مع قيمها الحالية تشكل حالة البرنامج (state). يُظهِر الشكل 2.1 حالة البرنامج بعد تنفيذ هذه التعليمات.
</p>

<p>
	تدعى هذه المخططات التي تظهر حالة البرنامج بمخططات الحالة (state diagrams). يُمثَّل كل متغير بصندوق يظهر اسم المتغير خارجه وقيمة المتغير داخله. أثناء تنفيذ البرنامج تتغير الحالة، لذلك عليك اعتبار مخططات الحالة كتمثيل لحظي لنقطة محددة في مسار التنفيذ.
</p>

<h3>
	طباعة المتغيرات
</h3>

<p>
	يمكنك عرض قيمة متغير باستخدام <span style="font-family:courier new,courier,monospace;">println</span> أو <span style="font-family:courier new,courier,monospace;">print</span>. في التعليمات التالية صرحنا عن متغير اسمه <span style="font-family:courier new,courier,monospace;">firstLine</span>، وأسندنا له القيمة "!Hello, again"، وعرضنا تلك القيمة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_25"><span class="typ">String</span><span class="pln"> firstLine </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello, again!"</span><span class="pun">;</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">firstLine</span><span class="pun">);</span></pre>

<p>
	عندما نتحدث عن عرض متغير فنحن نقصد قيمة المتغير عمومًا. أما لعرض اسمالمتغير، فعليك أن تضعه بين علامتي اقتباس. مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_28"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"The value of firstLine is "</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">firstLine</span><span class="pun">);</span></pre>

<p>
	خرج هذا البرنامج هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_30"><span class="pln">The value of firstLine is Hello, again!</span></pre>

<p>
	بنية تعليمة عرض المتغير هي نفسها بغض النظر عن نوع المتغير. مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_33"><span class="kwd">int</span><span class="pln"> hour </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">int</span><span class="pln"> minute </span><span class="pun">=</span><span class="pln"> </span><span class="lit">59</span><span class="pun">;</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"The current time is "</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="pln">hour</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">":"</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="pln">minute</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"."</span><span class="pun">);</span></pre>

<p>
	خرج هذا البرنامج هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_35"><span class="pln">The current time is 11:59.</span></pre>

<p>
	لوضع عدة قيم على نفس السطر، من الشائع استخدام عدة تعليمات <span style="font-family:courier new,courier,monospace;">print</span> ثم تتبعها تعليمة <span style="font-family:courier new,courier,monospace;">println</span> في النهاية. لكن لا تنسَ تعليمة <span style="font-family:courier new,courier,monospace;">println</span> على العديد من الحواسيب، يتم تخزين خرج تعليمات <span style="font-family:courier new,courier,monospace;">print</span> دون عرضه على الشاشة حتى استدعاء <span style="font-family:courier new,courier,monospace;">println</span>؛ وعندها يظهر السطر كله دفعة واحدة. إذا أغفلت تعليمة <span style="font-family:courier new,courier,monospace;">println</span>، فقد يعرض البرنامج الخرج المخزن في أوقات غير متوقعة أو ربما انتهى البرنامج دون طباعة أي شيء.
</p>

<h2>
	العوامل الحسابية
</h2>

<p>
	العوامل (operators) هي رموز تمثل حسابات بسيطة. مثلًا، عامل الجمع هو +، وعامل لطرح -، والضرب *، والقسمة /.
</p>

<p>
	يحول البرنامج التالي الوقت إلى دقائق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_37"><span class="kwd">int</span><span class="pln"> hour </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">int</span><span class="pln"> minute </span><span class="pun">=</span><span class="pln"> </span><span class="lit">59</span><span class="pun">;</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Number of minutes since midnight: "</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">hour </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> minute</span><span class="pun">);</span></pre>

<p>
	في هذا المثال، لدينا التعبير (expression) التالي: <span style="font-family:courier new,courier,monospace;">hour * 60 + minute</span>، الذي يمثل قيمة وحيدة بعد الحساب. عند تنفيذ البرنامج، يستبدل كل متغير بقيمته الحالية، ثم تطبق العوامل عليها. تدعى القيم التي تعمل العوامل عليها بالمعاملات (operands).
</p>

<p>
	نتيجة المثال السابق هي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_39"><span class="pln">Number of minutes since midnight: 719</span></pre>

<p>
	التعابير هي تراكيب تتألف بشكل عام من أرقام، ومتغيرات، وعوامل. عند ترجمة وتنفيذ التعابير ستنتج لدينا قيمة وحيدة.
</p>

<p>
	مثلًا، التعبير 1 + 1 قيمته 2. وفي التعبير<span style="font-family:courier new,courier,monospace;"> hour - 1</span> تستبدل Java المتغير بقيمته، وبذلك ينتج ‎11 - 1، الذي قيمته 1. أما في التعبير <span style="font-family:courier new,courier,monospace;">hour * 60 + minute</span> فيستبدل المتغيران بقيمتيهما، وهذا يعطي ‎11 * 60 + 59. تنفذ عملية الضرب أولًا، معطية التعبير ‎660 + 59. بعد ذلك تجرى عملية الجمع التي تنتج 719.
</p>

<p>
	عمليات الجمع والطرح والضرب كلها تعمل كما تتوقع منها تمامًا، لكن عملية القسمة قد تفاجئك. مثلًا، نحاول في التعليمتين التاليتين حساب الجزء الذي مضى من الساعة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_41"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Fraction of the hour that has passed: "</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">minute </span><span class="pun">/</span><span class="pln"> </span><span class="lit">60</span><span class="pun">);</span></pre>

<p>
	الخرج هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_43"><span class="pln">Fraction of the hour that has passed: 0</span></pre>

<p>
	هذه النتيجة تحير الناس عادة. قيمة <span style="font-family:courier new,courier,monospace;">minute</span> هي 59، وناتج قسمة 59 على 60 هو 0.98333، وليس 0. المشكلة هي أن Java تنفذ عملية "القسمة الصحيحة" عندما يكون المعاملين عددين صحيحين. عملية القسمة الصحيحة تقرب الناتج دومًا إلى العدد الصحيح السابق، حتى في الحالات التي يكون العدد الصحيح التالي أقرب مثل حالتنا هذه. يمكننا كحل بديل حساب النسبة المئوية بدلًا من العدد العشري:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_45"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Percent of the hour that has passed: "</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">minute </span><span class="pun">*</span><span class="pln"> </span><span class="lit">100</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">60</span><span class="pun">);</span></pre>

<p>
	الخرج الجديد هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_47"><span class="pln">Percent of the hour that has passed: 98</span></pre>

<p>
	لقد قربت النتيجة للأسفل هنا أيضًا، لكن النتيجة الآن صحيحة تقريبًا على الأقل.
</p>

<h3>
	النقطة العائمة
</h3>

<p>
	هناك حل مناسب أكثر وهو استخدام أعداد النقطة العائمة (floating-point)، التي تمثل الأعداد العشرية كما تمثل الأعداد الصحيحة أيضًا. في Java، يستخدم النوع <span style="font-family:courier new,courier,monospace;">double</span> (اختصارًا لعبارة double-precision) افتراضيًا لأعداد النقطة العائمة. يمكنك إنشاء المتغيرات من نوع <span style="font-family:courier new,courier,monospace;">double </span>وإسناد القيم لها باستخدام نفس الصيغ التي استخدمناها للأنواع الأخرى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_49"><span class="kwd">double</span><span class="pln"> pi</span><span class="pun">;</span><span class="pln"> 
pi </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3.14159</span><span class="pun">;</span></pre>

<p>
	تنفذ Java عملية "قسمة النقطة العائمة" (floating-point division) إذا كان أحد المعاملات أو كلاهما من النوع <span style="font-family:courier new,courier,monospace;">double</span>. وهكذا يمكننا حل المشكلة التي واجهتنا في القسم السابق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_51"><span class="kwd">double</span><span class="pln"> minute </span><span class="pun">=</span><span class="pln"> </span><span class="lit">59.0</span><span class="pun">;</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Fraction of the hour that has passed: "</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">minute </span><span class="pun">/</span><span class="pln"> </span><span class="lit">60.0</span><span class="pun">);</span></pre>

<p>
	الخرج هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_53"><span class="pln">Fraction of the hour that has passed: 0.9833333333333333</span></pre>

<p>
	ورغم فائدة أعداد النقطة العائمة، إلا أنها قد تسبب الإرباك. مثلًا، Java تفرّق بين القيمة الصحيحة 1 وبين القيمة العشرية 1.0، حتى لو بدا أنهما نفس العدد، فهما يختلفان بالنوع، وعلى وجه الدقة، لا يسمح لك بتنفيذ عمليات إسناد بين النوعين. مثلًا، ما يلي ليس مسموحًا لأن المتغير على الطرف الأيسر من النوع <span style="font-family:courier new,courier,monospace;">int</span> أما القيمة المسندة له على الطرف الأيمن هي <span style="font-family:courier new,courier,monospace;">double</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_55"><span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// compiler error</span></pre>

<p>
	من السهل نسيان هذه القاعدة لأن هناك حالات عديدة تحول فيها Java أحد الأنواع إلى النوع الآخر تلقائيًا. مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_57"><span class="kwd">double</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// legal, but bad style</span></pre>

<p>
	من المفترض ألا تكون التعليمة السابقة مشروعة، لكن Java تسمح بها عن طريق التحويل القيمة الصحيحة 1 إلى القيمة العشرية 1.0 تلقائيًا. هذا التساهل مريح، لكنه يسبب المشاكل للمبتدئين غالبًا. مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_59"><span class="kwd">double</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"> </span><span class="com">// common mistake</span></pre>

<p>
	قد تتوقع أن يعطى المتغير <span style="font-family:courier new,courier,monospace;">y</span> القيمة 0.333333، وهي قيمة عشرية مشروعة، لكنه في الواقع سيعطى القيمة 0.0. السبب هو أن العبارة على اليمين هي نسبة بين عددين صحيحين، لذلك تجري Java عملية قسمة صحيحة، والتي تنتج القيمة الصحيحة 0. ثم يتم تحويلها إلى قيمة عشرية، الناتج هو 0.0. إحدى الطرق لحل هذه المشكلة (بعد أن تكتشف أن هذه هي المشكلة) هو جعل الطرف الأيمن عبارة عشرية. التعليمة التالية ستعطي <span style="font-family:courier new,courier,monospace;">y</span> القيمة 0.333333، كما هو متوقع.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_61"><span class="kwd">double</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.0</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">3.0</span><span class="pun">;</span></pre>

<p>
	عليك دائمًا إسناد قيم عشرية لمتغيرات النقطة العائمة في كتابتك. لن يجبرك المترجم على ذلك، لكنك لا تعرف أبدًا متى تظهر لك غلطة بسيطة وتعود عليك وبالًا.
</p>

<h3>
	أخطاء التقريب
</h3>

<p>
	معظم أرقام النقطة العائمة صحيحة تقريبيًا. يمكن تمثيل بعض الأرقام بدقة، مثل القيم الصحيحة ذات الأحجام المعقولة. أما الكسور الدورية، مثل 1/3، أو الأرقام غير النسبية، مثل π، فلا يمكن تمثيلها بدقة. الفرق بين العدد الذي نريد والعدد الذي نحصل عليه يدعى خطأ التقريب (rounding error). مثلًا، يجب أن تكون التعليمتان التاليتان متكافئتين:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_77"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">10</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">);</span></pre>

<p>
	لكن الخرج سيكون كما يلي على معظم الحواسيب:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_79"><span class="pln">1.0 
0.9999999999999999</span></pre>

<p>
	المشكلة هي أن 0.1، وهو عدد عشري منته في الأساس 10، هو كسر دوري في الأساس 2، ولذلك يكون تمثيله في النقطة العائمة تقريبي حتمًا. وعندما نجمع الأعداد التقريبية معًا تتراكم أخطاء التقريب. الحساب بالنقطة العائمة له مزايا تفوق عيوبه في العديد من التطبيقات، كالرسوميات الحاسوبية، والتشفير، والتحليل الإحصائي، وإظهار (rendering) الوسائط المتعددة. لكن إذا أردت دقة مطلقة، عليك استخدام الأعداد الصحيحة بدلًا منها. خذ على سبيل المثال حساب بنك فيه رصيد قيمته 123.45$:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_81"><span class="kwd">double</span><span class="pln"> balance </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123.45</span><span class="pun">;</span><span class="pln"> </span><span class="com">// potential rounding error</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_83"><span class="kwd">int</span><span class="pln"> balance </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12345</span><span class="pun">;</span><span class="pln"> </span><span class="com">// total number of cents</span></pre>

<p>
	هذا الحل صحيح طالما أن عدد السنتات لا يتجاوز أكبر قيمة صحيحة يمكن تخزينها، وهي حوالي 2 مليار.
</p>

<h3>
	العمليات على السلاسل المحرفية
</h3>

<p>
	بشكل عام، لا يمكنك تطبيق العمليات الرياضية على السلاسل المحرفية، حتى لو كانت السلاسل المحرفية تبدو وكأنها أرقام. التعابير التالية غير مشروعة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_85"><span class="str">"Hello"</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> 
</span><span class="str">"World"</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">123</span><span class="pln"> 
</span><span class="str">"Hello"</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="str">"World"</span></pre>

<p>
	العامل + يعمل مع السلاسل المحرفية، لكنه قد لا ينتج ما تتوقعه. يجري عامل + عملية ربط السلاسل (concatenation) أي دمج المعاملين بوصلهما معًا.
</p>

<p>
	وهكذا فإن <span style="font-family:courier new,courier,monospace;">"Hello" + "World"</span> ستعطي السلسلة  <span style="font-family:courier new,courier,monospace;">"Hello World"</span>. أو إذا كان لديك متغير اسمه <span style="font-family:courier new,courier,monospace;">name</span> من النوع <span style="font-family:courier new,courier,monospace;">String</span>، فسوف يدمج التعبير <span style="font-family:courier new,courier,monospace;">"Hello" + "Name"</span> قيمة <span style="font-family:courier new,courier,monospace;">name</span> مع كلمة الترحيب. بما أن عملية الجمع معرفة للأرقام والسلاسل المحرفية أيضًا، فإن Java تجري عمليات تحويل تلقائية قد لا تتوقعها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_87"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"Hello"</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// the output is 3Hello</span><span class="pln">

</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Hello"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// the output is Hello12</span></pre>

<p>
	تنفذ Java هذه العمليات من اليسار إلى اليمين. في السطر الأول، 1 + 2 يساوي 3، و 3 + "Hello" يساوي "3Hello".
</p>

<p>
	أما في السطر الثاني، Hello" + 1" يساوي "Hello1"، و Hello1" + 2" يعطي "Hello12".
</p>

<h3>
	ترتيب الحساب
</h3>

<p>
	عندما يظهر أكثر من عامل في تعبير حسابي فسوف تنفذ حسب ترتيب العمليات (order of operation). بشكل عام، تنفذ Java العمليات حسب ترتيب ورودها من اليسار إلى اليمين (كما رأينا في القسم السابق). لكن Java تتبع قواعد الرياضيات في العمليات الحسابية:
</p>

<ul>
	<li>
		عمليتي الضرب والقسمة لهما ”أولوية“ (precedence) على الجمع والطرح. لذا فإن 3 * 2 + 1 سيعطي 7، وليس 9، كما أن 2 / 4 + 2 تعطي 4، وليس 3.
	</li>
	<li>
		إذا كان للعوامل نفس الأولوية فسوف تنفذ بالترتيب من اليسار إلى اليمين. ففي التعبير الحسابي minute * 100 / 60، يتم تنفيذ عملية الضرب أولًا، وإذا كانت قيمة minute هي 59 فسوف ينتج لدينا 60 / 5900، والذي بدوره يعطي 98. لو أن تنفيذ العملية الحسابية جرى من اليمين لليسار، ستكون النتيجة 1 * 59 والذي هو 59، وهو جواب خاطئ.
	</li>
	<li>
		في أي وقت ترغب فيه بتجاوز قواعد الأولوية (أو أنك لم تكن واثقًا من تلك القواعد) يمكنك استعمال الأقواس. يتم تنفيذ العمليات ضمن الأقواس أولًا، لهذا فإن 3 * (2 + 1) يعطي 9. يمكنك استعمال الأقواس أيضًا لجعل العبارات الحسابية أسهل للقراءة، كما في 60 / (minute * 100)، مع أنها لا تغير النتيجة. لا تجهد نفسك في حفظ ترتيب تنفيذ العمليات، خصوصًا مع العوامل الأخرى. إذا لم يكن ترتيب التنفيذ واضحًا عند النظر إلى التعبير، فاستخدم الأقواس لجعله واضحًا.
	</li>
</ul>

<h2>
	التركيب
</h2>

<p>
	في الأجزاء السابقة كنا نتعرف على مكونات لغة البرمجة: المتغيرات، والتعابير، والتعليمات بشكل مستقل، دون أن نناقش طريقة استخدامها معاً. أحد أهم ميزات لغات البرمجة هي قدرتها على تركيب (compose) الأجزاء الصغيرة مع بعضها. مثلاً، نحن نعرف كيف نضرب الأرقام ونعرف كيف نعرض القيم. يمكننا دمج هاتين العمليتين في تعليمة واحدة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_89"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="lit">17</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span></pre>

<p>
	يمكن استخدام أي تعبير حسابي داخل تعليمات الطباعة. لقد شاهدنا مثالاً على هذا من قبل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_91"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">hour </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> minute</span><span class="pun">);</span></pre>

<p>
	يمكنك أيضاً وضع تعابير حسابية متنوعة على الطرف الأيمن لعملية الإسناد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_93"><span class="kwd">int</span><span class="pln"> percentage</span><span class="pun">;</span><span class="pln"> 
percentage </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">minute </span><span class="pun">*</span><span class="pln"> </span><span class="lit">100</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">60</span><span class="pun">;</span></pre>

<p>
	لكن الطرف الأيسر لا بد أن يكون اسم متغير، وليس تعبيراً. ذلك لأن الطرف الأيسر يدل على موقع تخزين النتيجة، والتعابير لا تمثل مواقع تخزينية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_75"><span class="pln">hour </span><span class="pun">=</span><span class="pln"> minute </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// correct </span><span class="pln">
minute </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> hour</span><span class="pun">;</span><span class="pln"> </span><span class="com">// compiler error</span></pre>

<p>
	قد لا تبهرك القدرة على تركيب العمليات الآن، لكننا سنرى لاحقاً أمثلة تسمح لنا بكتابة حسابات معقدة بشكل مرتب وأنيق. لكن لا تبالغ كثيراً، فالتعابير الكبيرة المعقدة قد تصعب قراءتها وتنقيحها من الأخطاء.
</p>

<h2>
	أنواع الأخطاء
</h2>

<p>
	هناك ثلاثة أنواع يحتمل أن تحدث في البرنامج:
</p>

<ul>
	<li>
		أخطاء الترجمة.
	</li>
	<li>
		أخطاء التنفيذ.
	</li>
	<li>
		الأخطاء المنطقية.
	</li>
</ul>

<p>
	من المفيد التمييز بينها في سبيل تتبعها بشكل أسرع، وقبل أن نتحدث عنها واحدة واحدة، يمكنك الاطلاع على الفيديو الآتي الذي يشرحها بالتفصيل:
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" src="https://academy.hsoub.com/applications/core/interface/index.html" title="كيفية التعامل مع الأخطاء البرمجية" width="1072" data-embed-src="https://www.youtube.com/embed/Pgje6nWuDkg"></iframe>
</p>

<p>
	تحدث <strong>أخطاء الترجمة (compile-time errors)</strong> عندما تخالف التراكيب النحوية (syntax) للغة Java. مثلاً، يجب أن تكون أزواج الأقواس متناظرة. ولذلك فإن (2 + 1) صيغة مقبولة أما (8 ليست كذلك. في الحالة الثانية، لن تتمكن من ترجمة البرنامج، وسيعرض المترجم رسالة خطأ. تدل رسائل الخطأ التي يعرضها المترجم على موقع حدوث الخطأ في البرنامج عادة، وأحياناً تخبرك بطبيعة الخطأ بدقة. على سبيل المثال، لنعد إلى برنامج <span style="font-family:courier new,courier,monospace;">hello world</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_73"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Hello</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  
  	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
      	</span><span class="com">// generate some simple output </span><span class="pln">
      	</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">);</span><span class="pln"> 
    </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	إذا نسيت الفاصلة المنقوطة في نهاية تعليمة الطباعة، فقد تظهر لك رسالة خطأ كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_71"><span class="pln">File: Hello.java [line: 5] 
Error: ‘;’ expected</span></pre>

<p>
	هذا جيد جداً: موقع الخطأ صحيح، ورسالة الخطأ تخبرك بالمشكلة. لكن رسائل الأخطاء ليست يسيرة الفهم دوماً. أحياناً يعطي المترجم مكان اكتشاف الخطأ في البرنامج، وليس مكان حدوثه حقاً. وأحياناً يكون وصف المشكلة محيراً أكثر مما هو مفيد. مثلاً، إذا نسيت قوس الإغلاق المعقوف في نهاية <span style="font-family:courier new,courier,monospace;">main</span> (سطر 6)، قد تحصل على رسالة تشبة الرسالة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_69"><span class="pln">File: Hello.java [line: 7] 
Error: reached end of file while parsing</span></pre>

<p>
	هناك مشكلتان هنا. أولاً، رسالة الخطأ مكتوبة من وجهة نظر المترجم، وليس وجهة نظرك أنت. عملية<strong> الإعراب (parsing)</strong> هي عملية قراءة البرنامج قبل الترجمة؛ فإذا وصل المترجم لنهاية الملف قبل انتهاء الإعراب، فهذا يدل على نقصان شيء ما. لكن المترجم لا يعرف ما هو. كما أنه لا يعرف أين. يكتشف المترجم الخطأ عند نهاية البرنامج (سطر 7)، لكن القوس الناقص يجب أن يكون على السطر السابق. تحوي رسائل الأخطاء معلومات مفيدة، لذلك عليك محاولة قراءتها وفهمها. لكن لا تأخذها بشكل حرفي تماماً. ستمضي غالباً وقتاً طويلاً خلال الأسابيع الأولى في سيرتك البرمجية وأنت تتابع أخطاء الترجمة. لكن مع زيادة خبرتك، سوف ترتكب أخطاءً أقل وستعثر عليها أسرع. النوع الثاني من الأخطاء هي <strong>أخطاء التنفيذ (run-time errors)</strong>، وقد سمّيت كذلك لأنها لا تظهر قبل تنفيذ البرنامج.
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_67"><span class="pln">Exception in thread “main” java.lang.ArithmeticException: / by zero 
at Hello.main(Hello.java:5)</span></pre>

<p>
	بعض هذه المعلومات مفيد في تنقيح البرنامج من الأخطاء. يتضمن السطر الأول اسم الاستثناء <span style="font-family:courier new,courier,monospace;">java.lang.ArithmeticException</span> ورسالة تبين ما حدث بدقة أكبر  "<strong>by zero /</strong>". يظهر السطر التالي العملية التي حدث فيها الخطأ؛ حيث يقصد بعبارة <span style="font-family:courier new,courier,monospace;">Hello.main</span> العملية <span style="font-family:courier new,courier,monospace;">main</span> في الصنف <span style="font-family:courier new,courier,monospace;">Hello</span>. كما أنه يذكر أيضاً اسم الملف الذي عرفت فيه العملية (<span style="font-family:courier new,courier,monospace;">Hello.java</span>) ورقم السطر الذي حدث فيه الخطأ (5).
</p>

<p>
	أحياناً تحوي رسائل الأخطاء معلومات إضافية لن تفهم معناها الآن. لذلك سيكون أحد التحديات معرفة الأجزاء المفيدة دون أن تغرق بالمعلومات الإضافية. وعليك أن تنتبه أيضاً أن السطر الذي سبب انهيار تنفيذ البرنامج قد لا يكون السطر الذي يحتاج للتصحيح. النوع الثالث من الأخطاء هو <strong>الأخطاء المنطقية (logic error)</strong>. إذا كان هناك خطأ منطقي في برنامجك، فستتم ترجمته وتشغيله دون تولد أي رسالة خطأ، لكنه لن يعطي الناتج الصحيح المطلوب، بل سينفذ ما طلبته منه حرفياً. مثلاً، هذا برنامج <span style="font-family:courier new,courier,monospace;">hello world</span> فيه خطأ منطقي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_65"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Hello</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Hello, "</span><span class="pun">);</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"World!"</span><span class="pun">);</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	هذا البرنامج يترجم وينفذ بشكل سليم، لكن الخرج هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_63"><span class="pln">Hello, 
World! </span></pre>

<p>
	على فرض أننا أردنا أن يكون الخرج على سطر واحد، فهذا الناتج غير صحيح. المشكلة هي أن السطر الأول يستخدم <span style="font-family:courier new,courier,monospace;">println</span>، بينما نحن أرنا غالباً استخدام <span style="font-family:courier new,courier,monospace;">print</span>.
</p>

<p>
	قد يصعب التعرف على الأخطاء المنطقية لأنك ستضطر للعمل بالمقلوب: تنظر إلى مخرجات البرنامج وتحاول استنتاج السبب الذي يجعله يعطي هذه النتائج الخاطئة، وكيف تجعله يعطي النتائج الصحيحة. عادة لا يستطيع المترجم ولا المفسر مساعدتك هنا، لأنهما لا يعرفان ما هو الشيء الصحيح المطلوب.
</p>

<p>
	ترجمة -وبتصرف- للفصل <a href="http://greenteapress.com/thinkjava6/html/thinkjava6003.html" rel="external nofollow">Variables and operators</a> من كتاب <a href="http://greenteapress.com/thinkjava6/html/index.html" rel="external nofollow">Think Java: How to Think Like a Computer Scientist</a> لكاتبيه Allen B. Downey و Chris Mayfield.
</p>
]]></description><guid isPermaLink="false">380</guid><pubDate>Thu, 06 Oct 2016 08:02:00 +0000</pubDate></item><item><title>&#x627;&#x643;&#x62A;&#x628; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C;&#x643; &#x627;&#x644;&#x623;&#x648;&#x644; &#x628;&#x644;&#x63A;&#x629; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/java/%D8%A7%D9%83%D8%AA%D8%A8-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%A8%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-r372/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_09/java-hello-world.png.736ae559d0c62317f1c1bcaaec141851.png" /></p>
<p style="text-align: center;">
	<img alt="java-hello-world.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19018" data-unique="j89cbyokq" src="https://academy.hsoub.com/uploads/monthly_2016_09/java-hello-world.png.c366a9ba817bb413b6190a82cd670275.png">
</p>

<p>
	تقليديًا، البرنامج الأول الذي يكتبه الناس عندما يتعلمون لغة برمجة جديدة يسمى برنامج hello world (مرحبًا بالعالم). كل ما يفعله هذا البرنامج هو طباعة العبارة "!Hello, World" على الشاشة. في لغة Java، يبدو هذا البرنامج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9922_7"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Hello</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="com">// generate some simple output</span><span class="pln">
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">);</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	عند تشغيل هذا البرنامج سيعرض ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6893_10"><span class="pln">Hello, World!</span></pre>

<p>
	لاحظ أن الخرج لا يحوي علامات الاقتباس.
</p>

<p>
	تتكون برامج Java من صنف (class) وتعريفات توابع (methods)، وتتكون التوابع منتعليمات (statements). التعليمة هي سطر من الكود ينفذ عملية بسيطة. في برنامج hello world، هذا السطر هو تعليمة طباعة التي تعرض رسالة على الشاشة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6893_12"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">);</span></pre>

<p>
	يعرض تابع<span style="font-family:courier new,courier,monospace;"> System.out.println</span> النتائج على الشاشة؛ يرمز اسم التّابع <span style="font-family:courier new,courier,monospace;">println</span> للعبارة "print line" (اطبع سطرًا). من المحيّر أن كلمة اطبع قد تعني "اعرضها على الشاشة" وقد تعني "أرسلها إلى الطابعة". في سلسلتنا هذه، سنحاول عندما نقصد الإخراج على الشاشة أن نقول: "عرض". تنتهي تعليمة الطباعة بفاصلة منقوطة (;) مثل معظم التعليمات.
</p>

<p>
	لغة Java "حساسة لحالة الأحرف" (case-sensitive)، وهذا يعني أن الحروف الكبيرة تعتبر مختلفة عن الحروف الصغيرة. في هذا المثال، يجب أن تبدأ كلمة <span style="font-family:courier new,courier,monospace;">System</span> بحرف كبير؛ وإذا كتبت system أو SYSTEM فلن يعمل.
</p>

<p>
	التّابع (method) هو سلسلة تعليمات تحمل اسمًا. هذا البرنامج يعرف تابعًا وحيدًا اسمه <span style="font-family:courier new,courier,monospace;">main</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6893_14"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span></pre>

<p>
	اسم التّابع <span style="font-family:courier new,courier,monospace;">main</span> وشكله خاصين: عند تشغيل البرنامج، يبدأ التنفيذ عند أول تعليمة في <span style="font-family:courier new,courier,monospace;">main</span> وينتهي عند إنهاء آخر تعليمة فيها. سنرى لاحقًا برامج تعرف فيها أكثر من تابع واحد.
</p>

<p>
	الصنف (class) هو مجموعة عمليات. يعرف هذا البرنامج صنفًا اسمه <span style="font-family:courier new,courier,monospace;">Hello</span>. يمكنك تسمية الصنف بأي اسم تشاء، لكن جرت العادة أن يبدأ اسم الصنف بحرف كبير. يجب أن يطابق اسم الصنف اسم الملف الذي يحويه، ولذلك يجب أن تحفظ هذا الصنف في ملف اسمه <span style="font-family:courier new,courier,monospace;">Hello.java</span>.
</p>

<p>
	تستخدم Java الحاضنات ( { و } ) لتجميع الأشياء مع بعضها. في ملف <span style="font-family:courier new,courier,monospace;">Hello.java</span>: تضم الحاضنات الخارجية تعريف الصنف، أما الحاضنات الداخلية فتضم تعريف التّابع.
</p>

<p>
	السطر الذي يبدأ بشرطتين مائلتين (//) هو تعليق (comment)، وهو عبارة عن نص يوضع لتوضيح الشفرة المصدرية. عندما يرى المترجم علامة // يتجاهل كل شي يليها حتى نهاية السطر. لا تؤثر التعليقات على تنفيذ البرنامج، لكنها تسهل فهم المقصود من التعليمات للمبرمجين الآخرين (ولك أنت في الأوقات اللاحقة).
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h2>
	عرض السلاسل المحرفية
</h2>

<p>
	يمكنك وضع أي عدد من التعليمات داخل <span style="font-family:courier new,courier,monospace;">main</span>. مثلًا، حتى تعرض أكثر من سطر واحد على الخرج:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9922_19"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Hello</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="com">// generate some simple output </span><span class="pln">
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// first line </span><span class="pln">
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"How are you?"</span><span class="pun">);</span><span class="pln">  </span><span class="com">// another line </span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	كما يبين هذا المثال، يمكنك وضع التعليقات في نهاية السطور كما يمكنك وضعها على سطور كاملة وحدها.
</p>

<p>
	تدعى العبارات التي تحيط بها علامات الاقتباس بالسلاسل المحرفية (strings)، لأنها تحوي سلسلة من "المحارف" (characters) المتتابعة. قد يكون المحرف رقمًا، أو حرفًا، أو علامة ترقيم، أو رمزًا، أو فراغًا (space)، أو علامة جدولة (tab)، الخ.
</p>

<p>
	تلحق تعليمة <span style="font-family:courier new,courier,monospace;">System.out.println</span> محرفًا خاصًا بالسلسلة المحرفية، وهو محرف السطر الجديد (newline)، الذي يحرك مؤشر الطباعة إلى بداية السطر التالي. إذا لم ترغب بمحرف السطر الجديد في نهاية العبارة، يمكنك استخدام <span style="font-family:courier new,courier,monospace;">print</span> بدلًا من <span style="font-family:courier new,courier,monospace;">println</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6893_20"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Goodbye</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Goodbye, "</span><span class="pun">);</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"cruel world"</span><span class="pun">);</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	في هذا المثال، لا تضيف التعليمة الأولى محرف السطر الجديد، لذلك يظهر الخرج على سطر واحد كالتالي: <strong>Goodbye, cruel world</strong>. لاحظ أن هناك فراغًا في نهاية السلسلة المحرفية الأولى، والذي يظهر في خرج البرنامج.
</p>

<h2>
	سلاسل الهروب
</h2>

<p>
	يمكنك أن تعرض عدة سطور على الخرج بسطر كود واحد. عليك فقط أن تخبر Java بمواضع فواصل السطور.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6893_16"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Hello</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Hello!\nHow are you doing?\n"</span><span class="pun">);</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	الخرج هنا سطرين، وكل منهما ينتهي بمحرف السطر الجديد:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6893_18"><span class="pln">Hello! How are you doing?</span></pre>

<p>
	المحرفين <span style="font-family:courier new,courier,monospace;">n\</span> هما سلسلة هروب (escape sequence)، وهذه السلاسل عبارة عن عدة محارف تعبر عن محرف خاص واحد. تسمح لك الشرطة الخلفية (\) بالهروب من التفسير الحرفي للسلسلة. لاحظ عدم وجود فراغ يفصل بين <span style="font-family:courier new,courier,monospace;">n\</span> وبين How. إذا أضفت فراغًا بينهما، سيظهر الفراغ في بداية السطر الثاني.
</p>

<p>
	تستخدم سلاسل الهروب أيضًا لطباعة علامات الاقتباس داخل السلاسل المحرفية. بما أن علامات الاقتباس تحدد بدايات السلاسل المحرفية ونهاياتها، فلا يمكنك وضعها في نص السلسلة دون استخدام علامة الشرطة الخلفية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5587_7"><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"She said \"Hello!\" to me."</span><span class="pun">);</span></pre>

<center>
	<table border="1">
		<tbody>
			<tr>
				<td style="background-color: #ecf0f1; padding: 5px 10px;">
					<strong>سلسلة الهروب</strong>
				</td>
				<td style="background-color: #ecf0f1; padding: 5px 10px;">
					<strong>المحرف الناتج</strong>
				</td>
			</tr>
			<tr>
				<td style="padding: 5px 10px;">
					n\
				</td>
				<td style="padding: 5px 10px;">
					سطر جديد
				</td>
			</tr>
			<tr>
				<td style="padding: 5px 10px;">
					t\
				</td>
				<td style="padding: 5px 10px;">
					علامة جدولة؛ تعادل ثمانية فراغات أفقية عادة
				</td>
			</tr>
			<tr>
				<td style="padding: 5px 10px;">
					"\
				</td>
				<td style="padding: 5px 10px;">
					علامة اقتباس
				</td>
			</tr>
			<tr>
				<td style="padding: 5px 10px;">
					\\
				</td>
				<td style="padding: 5px 10px;">
					شرطة مائلة خلفية
				</td>
			</tr>
		</tbody>
	</table>
</center>

<p style="text-align: center;">
	<strong>الجدول 1.1: بعض سلاسل الهروب الشائعة</strong>
</p>

<p>
	الناتج هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9922_9"><span class="pln">She said "Hello!" to me.</span></pre>

<h2>
	تنسيق الكود
</h2>

<p>
	بعض الفراغات إلزامية في برامج Java. فلا بد، على سبيل المثال، من فصل الكلمات عن بعضها بفراغ واحد على الأقل؛ أي أن البرنامج التالي غير صالح:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9922_12"><span class="pln">publicclassGoodbye</span><span class="pun">{</span><span class="pln"> 
  publicstaticvoidmain</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Goodbye, "</span><span class="pun">);</span><span class="pln"> 
    </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"cruel world"</span><span class="pun">);</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	لكن معظم الفراغات الأخرى اختيارية. مثلًا، هذا البرنامج صالح:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9922_21"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Goodbye</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Goodbye, "</span><span class="pun">);</span><span class="pln"> 
</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"cruel world"</span><span class="pun">);</span><span class="pln"> 
</span><span class="pun">}</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	كما أن فصل التعليمات على سطور مختلفة اختياري أيضًا. بالتالي يمكننا كتابة البرنامج السابق هكذا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9922_17"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Goodbye</span><span class="pun">{</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">){</span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Goodbye, "</span><span class="pun">);</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"cruel world"</span><span class="pun">);}}</span></pre>

<p>
	سيعمل البرنامج، لكن قراءته ازدادت صعوبة في كل مرة. استخدام الفراغات وتوزيع التعليمات على سطور منفصلة مهمان جدًا لتنظيم برنامجك بصريًا، لتسهيل فهمه وتسهيل العثور على الأخطاء فيه عند حدوثها.
</p>

<p>
	في العادة، تجد في المنظمات التي تعمل كثيرًا في تطوير البرمجيات شروطًا صارمة تحدد طريقة ترتيب الشفرات المصدرية. مثلًا، تنشر Google معاييرها الخاصة حول كتابة أكواد Java للاستخدام في المشاريع مفتوحة المصدر:http://google.github.io/styleguide/javaguide.html.
</p>

<p>
	قد لا تستوعب هذه المعايير الآن، لأنها تذكر بعض مزايا لغة Java التي لما تتعرف عليها. لكنك قد ترغب بزيارتها بين الحين والآخر أثناء قراءة هذه السلسلة.
</p>

<h2>
	تنقيح الكود
</h2>

<p>
	كلما أردت اختبار ميزة جديدة، عليك تجربة ارتكاب بعض الأخطاء عن عمد. على سبيل المثال، في برنامج hello world، ماذا يحدث لو أسقطت إحدى علامات الاقتباس؟ ماذا لو أسقطت العلامتين معًا؟ وماذا لو أخطأت بكتابة <span style="font-family:courier new,courier,monospace;">println</span>؟ هذه التجارب تساعدك على تذكر ما تقرؤه. كما تساعدك في تنقيح الكود، لأنك تتعلم معنى رسائل الأخطاء المختلفة. من الأفضل أن ترتكب الأخطاء الآن عمدًا بدلًا من أن تقع بها لاحقًا دون قصد.
</p>

<p>
	تصحيح الأخطاء يشبه العلوم التجريبية أيضًا: بمجرد أن تظن أنك عرفت ما هو الخطأ، تعدل برنامجك وتجرب ثانية. إذا كانت فرضيتك صحيحة، عندئذ ستتمكن من التنبؤ بنتيجة التعديل، وتقترب خطوة من البرنامج الصحيح المطلوب. أما إذا كانت فرضيتك خاطئة، عليك أن تجد حلًا آخر.
</p>

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

<p>
	من الأمثلة الممتازة على هذا المبدأ نظام التشغيل لينكس (Linux)، الذي يحوي ملايين السطور البرمجية. بدأ لينكس كبرنامج بسيط استعمله لينوس تورفالدز (Linus Torvalds) ليستكشف رقاقة إنتل 80386. وعلى حد قول لاري غرينفيلد (Larry Greenfield) في دليل مستخدم لينكس (The Linux Users’ Guide)، ”أحد أولى مشاريع لينوس كان برنامجًا يبدل بين طباعة AAAA و BBBB. ثم تطور هذا إلى لينكس“.
</p>

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

<h2>
	أدوات التطوير
</h2>

<p>
	تعتمد خطوات ترجمة وتنفيذ وتنقيح أكواد Java على بيئة التطوير لديك ونظام التشغيل الذي تستخدمه. الجزء التّالي هو مقدمة مختصرة لبيئة DrJava وهي بيئة تطوير متكاملة (Integrated Development Environment أو IDE اختصارًا) مناسبة للمبتدئين.
</p>

<h3>
	تثبيت DrJava
</h3>

<p>
	أسهل طريقة لبدء البرمجة بلغة Java هي استخدام موقع يترجم لك شفرات Java وينفذها في المتصفح. هناك على سبيل المثال <a href="https://www.jdoodle.com/" rel="external nofollow">jdoodle.com</a>، و <a href="https://www.compilejava.net/" rel="external nofollow">compilejava.net</a>، و <a href="http://tutorialspoint.com/" rel="external nofollow">tutorialspoint.com</a>، وغيرها.
</p>

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

<p>
	لكن إذا أردت ترجمة وتشغيل برامج Java على حاسوبك، سوف تحتاج:
</p>

<ul>
	<li>
		<strong>عدة تطوير Java</strong>‏ (Java Development Kit أو JDK)، التي تتضمن المترجم، وآلة Java الافتراضية (Java Virtual Machine أو JVM) التي تفسر شفرات بايت الناتجة عن الترجمة، وغيرها من الأدوات مثل Javadoc.
	</li>
	<li>
		<strong>محرر نصوص</strong> بسيط مثل Notepad++‎ أو Sublime Text، أو بيئة تطوير مثل DrJava، أو Eclipse، أو jGrasp، أو NetBeans.
	</li>
</ul>

<p>
	بالنسبة لعدة التطوير (JDK) ننصحك باستخدام Java SE (النسخة القياسية Standard Edition)، التي توفرها Oracle مجانًا. ننصحك أيضًا باستخدام DrJava، وهي بيئة تطوير متكاملة (IDE) مفتوحة المصدر ومكتوبة بلغة Java (انظر الشكل أ.1).
</p>

<p>
	لتثبيت JDK، ابحث في الوب عن "download JDK" ويجب أن توصلك النتائج إلى موقع Oracle. انزل لأسفل حتى تصل إلى"Java Platform, Standard Edition" وانقر زر تنزيل JDK. ثم اقبل اتفاقية الترخيص واختر المثبت المناسب لنظام تشغيلك. لا تنسَ تشغيل برنامج التثبيت بعد تنزيله!
</p>

<p>
	لثبيت DrJava، اذهب إلى <a href="http://drjava.org/" rel="external nofollow">http://drjava.org</a> ونزّل ملف JAR. ننصحك بحفظه على سطح المكتب أو مكان مناسب آخر. فقط انقر على ملف JAR نقرة مزدوجة لتشغيل DrJava.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19016" href="https://academy.hsoub.com/uploads/monthly_2016_09/A.1.jpg.da07a28e4779ef78734a477b74b12422.jpg" rel="" data-fileext="jpg"><img alt="A.1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="19016" data-unique="m6khlm3s3" src="https://academy.hsoub.com/uploads/monthly_2016_09/A.1.thumb.jpg.85cd5a17844f6d14c413fb6238253baf.jpg"></a>
</p>

<p>
	ننصحك عند تشغيل DrJava أول مرة بتغيير ثلاثة خيارات يمكنك الوصول إليها من قائمة:
</p>

<p style="text-align: center;">
	<strong>Edit &gt; Preferences </strong>
</p>

<p>
	في قسم <strong>Miscellaneous</strong>: عدل <strong>Indent Level </strong>(المسافة البادئة) إلى 4، وفعّل خيار <strong>Automatically Close Block Comments</strong>، وألغِ تفعيل خيار<strong> Keep Emacs-style Backup Files</strong>.
</p>

<h3>
	الوضع التفاعلي في DrJava
</h3>

<p>
	إحدى أهم ميزات DrJava هي "لوحة التفاعل" أسفل النافذة. يمكنك تجربة الشفرات فيها بسرعة، دون كتابة تعريف صنف ودون المرور بمراحل حفظ وترجمة وتنفيذ البرنامج. يظهر الشكل التالي مثالًا.
</p>

<p style="text-align: center;">
	<img alt="A.2.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="19017" data-unique="ddudxni3t" src="https://academy.hsoub.com/uploads/monthly_2016_09/A.2.jpg.dbadea209af304e75f15f8d17e1fa470.jpg">
</p>

<p>
	هناك ملاحظة دقيقة وحيدة عليك الانتباه لها عند استخدام ميزة التفاعل. إذا لم تضع فاصلة منقوطة في نهاية التعبير الحسابي أو التعليمة، سوف يعرض DrJava النتيجة تلقائيًا. لاحظ في الشكل السابق إنهاء سطور التصريح عن المتغيرات بفواصل منقوطة، بينما لا توجد فواصل في نهايات التعابير المنطقية في السطور التي تليها. توفر عليك هذه الميزة طباعة<span style="font-family:courier new,courier,monospace;"> System.out.println</span> كل مرة.
</p>

<p>
	الجميل في هذه الميزة هو أنك لا تحتاج لتعريف صنف جديد، ثم تعريف عملية <span style="font-family:courier new,courier,monospace;">main</span>، ثم كتابة تعابير عشوائية ضمن تعليمات<span style="font-family:courier new,courier,monospace;"> System.out.println</span>، ثم حفظ الملف المصدري، وبعدها ترجمة الشفرات المصدرية كلها بشكل سليم قبل رؤية النتائج. كما يمكنك أيضًا استخدام السهمين العلوي والسفلي من لوحة المفاتيح لتكرار الأوامر السابقة وتجربة اختلافات متعددة.
</p>

<p>
	ترجمة -وبتصرف- لجزء من الفصل الأول من كتاب <a href="http://greenteapress.com/thinkjava6/html/index.html" rel="external nofollow">Think Java: How to Think Like a Computer Scientist</a> لكاتبيه Allen B. Downey و Chris Mayfield.
</p>
]]></description><guid isPermaLink="false">372</guid><pubDate>Fri, 09 Sep 2016 11:38:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x628;&#x644;&#x63A;&#x629; Java: &#x645;&#x627; &#x647;&#x64A; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;&#x61F;</title><link>https://academy.hsoub.com/programming/java/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-java-%D9%85%D8%A7-%D9%87%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9%D8%9F-r371/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_08/java-programming.png.361add9b797d8b9640da51b72fe11bdb.png" /></p>

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

<p>
	إن مهارة حل المشكلات هي أهم مهارة لأي طالب <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم حاسوب</a>، وكما سنرى معًا، تعلم البرمجة سيفيد كثيرًا في تطوير هذه المهارة.
</p>

<p style="text-align: center;">
	<img alt="java-programming.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18653" data-unique="keuk8e26z" src="https://academy.hsoub.com/uploads/monthly_2016_08/java-programming.png.5e19f6f666b9bd24850e694f75f36ce4.png"></p>

<h2>
	ما هي البرمجة؟
</h2>

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

<ul>
<li>
		<strong>الإدخال (input)</strong>: تحصيل البيانات من لوحة المفاتيح، أو من ملف، أو من حساس، أو من جهاز آخر.
	</li>
	<li>
		<strong>الإخراج (output)</strong>: عرض البيانات على الشاشة، أو إرسالها إلى ملف أو إلى جهاز آخر.
	</li>
	<li>
		<strong>الحساب (math)</strong>: تنفيذ العمليات الحسابية الأساسية مثل الجمع والقسمة.
	</li>
	<li>
		<strong>اتخاذ القرارات (decisions)</strong>: التحقق من شروط معينة وتنفيذ التعليمات المناسبة لكل حالة.
	</li>
	<li>
		<strong>التكرار (repetition)</strong>: تنفيذ عمل ما بصورة متكررة، عادة مع وجود تغيير.
	</li>
</ul>
<p>
	صدق أو لا تصدق، هذا كل شيء تقريبًا. أيَّ برنامج استعملته من قبل، مهما كان معقدًا، بُنِيَ من تعليمات صغيرة تشبه هذه التعليمات. وهكذا يمكنك اعتبار البرمجةبأنها عملية تجزئة المهام الكبيرة والمعقدة إلى مهام جزئية أصغر وأصغر. وتستمر العملية حتى نصل إلى مهام جزئية بسيطة بما يكفي لتنفيذها بالتعليمات البسيطة التي يوفرها الحاسوب.
</p>

<p>
	ننصحك بالرجوع إلى مقال <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">تعلم البرمجة</a> لمزيد من التفاصيل حول البرمجة عمومًا وكيفية دخول المجال.
</p>

<h2>
	ما هي علوم الحاسوب؟
</h2>

<p>
	أحد أهم نواحي كتابة البرامج هو تحديد طريقة حل مشكلة ما، خصوصًا إذا تعددت الحلول. مثلًا، هناك طرق عديدة لترتيب قائمة من الأرقام، ولكل طريقة مزاياها. حتى نحدد أي طريقة هي الأفضل في وضع معين، نحتاج لتقنيات لتوصيف وتحليل الحلول بشكل صيغ منتظمة.
</p>

<p>
	علوم الحاسوب هي علوم الخوارزميات، وتشمل تحليل الخوارزميات واكتشاف خوارزميات جديدة. الخوارزمية هي سلسلة خطوات تحدد طريقة حل مشكلة ما. بعض الخوارزميات أسرع من غيرها، وبعضها تستهلك مساحة أقل في ذاكرة الحاسوب. سوف تتعلم كيف تفكر كعالم حاسوب أثناء تعلمك كيفية تطوير خوارزميات لحل مشكلات لم تحلها من قبل.
</p>

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

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

<p>
	ننصح بقراءة مقال <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">المدخل الشامل لتعلم علوم الحاسوب</a> للمزيد من التفاصيل.
</p>

<h2>
	لغات البرمجة
</h2>

<p>
	إن لغة البرمجة التي ستتعلمها هي Java، وهي <strong>لغة عالية المستوى</strong> <strong>(High-level language)</strong>. هناك لغات أخرى عالية المستوى لعلك سمعت بها مثل Python، أو C و C++‎، أو Ruby، أو Javascript.
</p>

<p>
	يجب ترجمة البرامج المكتوبة بلغات عالية المستوى إلى <strong>لغة منخفضة المستوى</strong> <strong>(low-level language)</strong> أو ما يدعى ”لغة الآلة“، قبل أن يستطيع الحاسوب تشغيلها. تحتاج هذه الترجمة وقتًا، لكن هذه سيئة بسيطة للغات عالية المستوى. في المقابل، للغات عالية المستوى حسنتين:
</p>

<ul>
<li>
		كتابة البرامج بلغة عالية المستوى أسهل بكثير. كتابة البرامج تأخذ وقتًا أقل، وتكون البرامج أقصر وأسهل للقراءة، ومن المرجح أكثر أن تكون صحيحة.
	</li>
	<li>
		اللغات عالية المستوى <strong>محمولة</strong> <strong>(portable)</strong>، بمعنى أنه يمكن تنفيذ البرامج المكتوبة بها على أنواع مختلفة من الحواسيب دون أي تعديلات أو بعد عمل تعديلات قليلة. أما البرامج المكتوبة بلغة منخفضة المستوى فلا يمكنها العمل إلا على نوع واحد فقط من الحواسيب، ويجب إعادة كتابتها قبل أن نتمكن من تشغيلها على جهاز آخر.
	</li>
</ul>
<p>
	هناك نوعين من البرامج التي تترجم اللغات عالية المستوى إلى لغات منخفضة المستوى: المفسرات والمترجمات.
</p>

<p>
	يقرأ <strong>المفسر (interpreter)</strong> البرامج المكتوبة بلغات عالية المستوى وينفذها، أي أنه ينفذ التعليمات التي يمليها البرنامج. يعالج المفسر البرنامج في أجزاء صغيرة، حيث يقرأ بعض السطور ثم ينفذ التعليمات ويعود لقراءة سطور أخرى وهكذا. يبين الشكل 1.1 بنية المفسر.
</p>

<p style="text-align: center;">
	<img alt="1.1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="18651" data-unique="nfx8dothb" src="https://academy.hsoub.com/uploads/monthly_2016_08/1.1.jpg.48181265f2cb9978f0ee174d14231395.jpg"></p>

<p>
	على صعيد آخر، يقرأ <strong>المترجم (compiler)</strong> البرنامج كله ويترجمه دفعة واحدة قبل بدء تنفيذ البرنامج. في هذه الحالة، يدعى البرنامج المكتوب بلغة عالية المستوىبالشفرة المصدرية (source code)، ويدعى البرنامج المترجم بالشفرة الهدف (object code) أو الملف التنفيذي (executable). بعد ترجمة البرنامج، يمكنك تنفيذه بشكل متكرر دون الحاجة لأي ترجمة أخرى. ونتيجة لذلك، تعمل البرامج المترجمة بصورة أسرع من البرامج المفسرة.
</p>

<p>
	لغة Java مجمّعة ومفسرة معًا. فبدلًا من ترجمة البرامج مباشرة إلى لغة الآلة، يولد مترجم Java بايت كود (byte code).
</p>

<p>
	شفرة بايت سهلة وسريعة التفسير مثل لغة الآلة، لكنها محمولة أيضًا، حيث يمكننا ترجمة برنامج Java على أحد الأجهزة، ثم ننقل شفرة بايت إلى جهاز آخر، ثم نشغل شفرة بايت على الجهاز الثاني. يدعى المفسر الذي ينفذ شفرة بايت "بآلة Java الافتراضية" (Java Virtual Machine أو اختصارًا JVM).
</p>

<p style="text-align: center;">
	<img alt="1.2.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="18652" data-unique="7b8y5m8o3" src="https://academy.hsoub.com/uploads/monthly_2016_08/1.2.jpg.13205c2ff7fbe7fec349d47fdac87a7c.jpg"></p>

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

<p>
	ترجمة -وبتصرف- لجزء من الفصل الأول من كتاب <a href="http://greenteapress.com/thinkjava6/html/index.html" rel="external nofollow">Think Java: How to Think Like a Computer Scientist</a> لكاتبيه Allen B. Downey و Chris Mayfield.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">تعلم البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">المدخل الشامل لتعلم علوم الحاسوب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">371</guid><pubDate>Thu, 11 Aug 2016 17:34:00 +0000</pubDate></item></channel></rss>
