مقدمـة

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

وجدنا نحن البشر طريقتين فعالتين في سد فجوة التواصل بيننا، وهما كوننا كائنات بيولوجية حية نشأت من الطين تتمتع بموهبة التفكير الاجتماعي و المكاني، والحواسيب، متلاعبين ببيانات لا معنى لها بدون شعور. أولها هو انجذابنا إلى إحساسنا بالعالم الفيزيائي وبناء واجهات تحاكي هذا العالم وتسمح لنا بالتلاعب بهذه المحاكاة على الشاشة بأصابعنا المجردة. هذا يعمل بشكل جيد للتفاعل مع الآلة بشكل عرَضِيّ.

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

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

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

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

في البرمجة

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

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

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

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

"مبرمج الحاسوب منشأ أكوان هو وحده المسؤول عنها. أكوان من تعقيد فعليٍ لا متناهي يمكن أن تنشأ على شكل برامج حاسوب." -Joseph Weizenbaum, Computer Power and Human Reason.

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

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

لبعض منا، كتابة برامج الحاسوب هو بمثابة لعبة جميلة. البرنامج هو بناء من الفكر. فهو غير مكلفٍ في البناء، ومن دون وزن، بل وينمو بسرعة وفق ما تكتبه أيدينا.

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

ويعتقد كثير من المبرمجين أن هذا التعقيد يمكن التحكم به عن طريق استخدام مجموعة صغيرة مفهومة من التقنيات في برامجهم. وقد ألّفوا قواعد صارمة , او ما يسمى بالـ ("الممارسات الأمثل") محددين البنية التي يجب على كل برنامج أن يمتلكها، والأكثر حماساً بين المبرمجين سيعتقد بأن من يخرج عن هذه المنطقة الصغير الآمنة سيكون مبرمجاً سيئاً.

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

لماذا اللغة شيء مهم؟.

في البداية، عند ولادة الحاسوب، لم يكن هناك لغات برمجة. والبرامج كانت تشبه شيئاً كهذا:

00110001 00000000 00000000
00110001 00000001 00000001
00110011 00000001 00000010
01010001 00001011 00000010
00100010 00000010 00001000
01000011 00000001 00000000
01000001 00000001 00000001
00010000 00000010 00000000
01100010 00000000 00000000 

يقوم هذا البرنامج بجمع الأرقام من 1 إلى 10 ويطبع الناتج 1 + 2 + ... + 10 = 55. يمكن تشغيل هذا البرنامج على آلة افتراضية بسيطة. لبرمجة الحواسيب الأولية، كان من الضروري وضع صفوف كبيرة من المفاتيح الكهربائية في مكان مناسب، أو إحداث ثقوب في شرائط من ورق مقوى، وإطعامها للحاسوب بطريقة ما. يمكنك تخيل مدى كون هذه العملية مملة ومعرضة للخطأ. حتى كتابة برنامج بسيط كانت تحتاج إلى كثير من الذكاء والتنظيم. وكانت البرامج المعقدة شبه مستحيلة.

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

كل سطر من البرنامج السابق يحتوي على عملية واحدة. ويمكن كتابتها باللغة العربية هكذا:

  1. خزّن الرقم 0 في الموضع 0 الذاكرة.
  2. خزّن الرقم 1 في الموضع 1 من الذاكرة.
  3. خزنّ قيمة الموضع 1 في الموضع 2 من الذاكرة.
  4. اطرح الرقم 11 من قيمة الموضع 2 من الذاكرة.
  5. اذا كانت القيمة في الموضع 2 تساوي 0، إقفز الى التعليمة التاسعة.
  6. أضف قيمة الموضع 1 الى الموضع 0 من الذاكرة.
  7. اضف رقم 1 الى قيمة الموضع 1 من الذاكرة.
  8. عد الى العملية الثالثة.
  9. أخرج قيمة الموضع 0 من الذاكرة.

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

  • ضع قيمة "المجموع" 0.
  • ضع قيمة "العد" 1.
  • [حلقة تكرار]
  • ضع قيمة "مقارنة" في "عد".
  • اطرح 11 من "مقارنة".
  • اذا كانت "مقارنة" صفراً، اذهب الى [نهاية].
  • أضف "عد" الى "المجموع".
  • أضف 1 الى "عد".
  • كرّر [حلقة تكرار].
  • [نهاية]
  • اطبع "المجموع".

أيمكنك رؤية كيف يعمل البرنامج في هذه المرحلة ؟ السطران الأولان يعطيان موضعين من الذاكرة قيمة ابتدائية : "المجموع" والذي سيتخدم لتخزين نتيجة الحساب كله، و "عد" الذي سيعرف الرقم الذي نبحث عنه الآن. الأسطر التي تستخدم "مقارنة" هي الأغرب. يريد البرنامج أن يعرف ما إذا كان "عد" مساوياً لـ 11 من أجل أن يعرف إذا كان عليه التوقف أو لا. لأن آلتنا الافتراضية بدائية، يمكنها فقط اختبار ما إذا كان العنصر صفراً لتتخذ قراراً مبنياً على على هذا الاختبار. ولذلك فهي تستخدم موضع الذاكرة المسمى "مقارنة" لحساب قيمة "عد" ناقصاً 11 وتتخذ القرار وفقاً لنتيجة هذه العملية الحسابية. السطران التاليان يضيفان قيمة "عد" إلى نتيجة الحساب ويزيدان قيمة "عد" واحداً كل مرة يقرر البرنامج أن قيمة "عد" لا تساوي 11 بعد.

وهذا هو البرنامج نفسه باستخدام جافاسكربت:

var total = 0, count = 1;
while(cout <= 0){
total += count;
count += 1;
}
console.log(total);
// -> 55

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

في نهاية البرنامج، بعد انتهاء تعليمة while، يتم تطبيق تعليمة console.log على النتيجة النهائية لـ "المجموع" لإخراجها على الشاشة.

أخيراً، سيبدو البرنامج هكذا لو تخيلنا وجود تعليمتين الاولى sum والتي تقوم بجمع الارقام التي نطبقها عليها، والثانية range والتي تنشأ أرقاماً متتالية ضمن مجال معين :

console.log(sum(range(1, 10)));

المغزى من هذه القصة أن البرنامج يمكن كتابته بطريقة طويلة او قصيرة، مقروءة او صعبة القراءة. النسخة الاولى من البرنامج كانت غامضةً جداً، بينما كانت الأخيرة قريبةً جداً من اللغة الانكليزية : اطبع مجموع الاعداد ضمن المجال 1 الى 10. (سنرى في فصول أخرى كيف نبني بأنفسنا عمليات مثل sum و range).

لغة البرمجة الجيدة تساعد المبرمج عن طريق السماح لهم بالتصريح عن الاجراءات التي يجب أن يفعلها الحاسوب بمستوى أعلى. كما أنها تساعد على حذف التفاصيل المملة، وتقدم تعليمات مناسبة لبناء البرامج مثل (while , console.log)، لتسمح لك ببناء تعليماتك الخاصة مثل (sum, range)، كما أنها تجعل هذه التعليمات سهلة الانشاء.

ما هي الـجافا سكربت JavaScript؟

قُدِّمت الجافا سكربت في عام ١٩٩٥ كطريقة لإضافة برامج لِصفحات الشَّبكة web في متصفِّح Netscape Navigator browser. ومنذ ذلك الحين تَمَّ تبنِّي اللُّغة من قبل كل متصفِّحات الشَّبكة الرُّسوميَّة. لقد جعلت لغة الجافا سكربت تطبيقات الشَّبكة الحديثة ممكنة—تطبيقاتٌ يمكنك التَّفاعل معها مباشرةً، دون الحاجة للقيام بإعادة تحميل الصَّفحة لكلِّ فعل. لكنَّها أيضًا مُستخدمة في العديد من المواقع التقليديَّة لتوفير أنماط مختلفة من التفاعليَّة والحذاقة.

من المهم ذِكر أنَّه ليسَ للجافا سكربت أيُّ علاقةٍ بلغةِ البرمجة المُسَمَّاة جافا Java. الإسمُ المُشابِهُ أُستُلهِمَ لإعتباراتٍ تسويقيَّة، أكثر مِمَّا هو قرارٌ صائب. عندما قُدِّمت الجافا سكربت، كانت لغة جافا مُسَوَّقة بقوَّة وحاصِلة على الشَّعبيَّة. إعتقدَ شخصٌ ما أنَّ رُكوب موجة النجاح هذه شيءٌ جيِّد. الآن نحن عالِقون مع الإسم.

بعد تبنِّيها خارج Netscape، كُتبت وثيقة مِعياريَّة لوصف الطَّريقة الَّتي يجب أن تعمل بها JavaScript لضمان دعم أجزاء البرمجيَّة software المختلفة الَّتي تزعُم دعمها للجافا سكربت والحديث هنا مازال قائمًا عن نفس اللُّغة. بعد قيام منظَّمة Ecma العالميَّة بالتقييس standardization، دُعيت ECMAScript standard. عمليًّا، يمكن إستخدام المصطلحين ECMAScript وَ JavaScript بشكل مُتبادَل—حيث أنَّهُما إسمان لِذاتِ اللُّغة. هنالك أشخاص سيقولن أشياءً فظيعة عن لغة الجافا سكربت، والعديد من هذه الأشياء صحيحة. فعندما تَطَلَّبَ منِّي كتابة شيء ما في الجافا سكربت للمرَّة الأُولى، سُرعانَ ما أصبحتُ أذدريها. حيثُ كانت تقبل كل شيء أكتبه تقريبًا لكن تفسِّره interpret بطريقة مختلفة عُمَّا أعنيه. ولهذا علاقة وثيقة بأنني لم أكن أعي ما أفعله، بالطبع، ولكن هناك قضيَّة حقيقيَّة هُنا: الجافا سكربت متحرِّرة للغاية بما تسمح به، والفكرة خلف هذا التصميم جعل البرمجة بلغة الجافا سكربت أسهل للمُبتدئين. في الواقع، غالبًا ذلك يجعل إيجاد المشاكل في برنامجك أصعب لأنَّ النظام لن يُشير لك إليها.

برغم ذلك، فإنّ لهذه المرونة فوائدها أيضًا. لأنها تترك مجالًا مفتوحًا للكثير من التقنيَّات المستحيلة في لغاتٍ جامدة أُخرى، وكما سترى (في الفصل ١٠ على سبيل المثال) يمكن إستخدامها للتغلُّب على بعض عيوب الجافا سكربت. بعد التعلُّم المُلائم للُّغة والعمل بها لفترة، تعلَّمتُ أن أُحِبَّ الجافا سكربت. كان هناك العديد من إصدارات الجافا سكربت. كان أكثرُها دعمًا في زمن عُلوِّها نحو الهيمنة الإصدار ECMAScript 3، تقريبًا بين عامي ٢٠٠٠ وَ ٢٠١٠. خلال هذا الوقت، كان العمل جاريًا على إصدارٍ واعِدٍ 4، الَّذي خَطَّ عددًا من التحسينات الجذريَّة والإمتدادات للُّغة. بانَت محاولة تغيير لغة حياتيَّة، واسعة الإستخدام بطريقة جذريَّة أنَّها صعبة سياسيًّا، وكان العمل على الإصدار 4 مهجورًا في ٢٠٠٨، مؤدِّيًا ذلك للإصدار 5 الأقل طموحًا الذي صدر في ٢٠٠٩. نحن الآن بصدد نقطة دعم كل المتصفِّحات الرَّئيسيَّة للإصدار 5، والذي هو الإصدار الذي سيركِّز عليه هذا الكتاب. الجديرُ بالذِّكرِ أنَّ العمل على تجهيز الإصدار 6 قد شارف على نهايته، وبدأت بعض المتصفِّحات بدعم ميِّزاتٍ جديدةٍ من هذا الإصدار.

وليست متصفِّحات الشَّبكة هي المِنَصَّة الوحيدة الَّتي تستخدم الجافا سكربت، فبعض قواعد البيانات مثل: MongoDB وَ CouchDB، تستخدم الجافا سكربت كلغتها الإستفساريَّة والسكربتيَّة. العديد من مِنَصَّات برمجة سطح المكتب والخوادم، وعلى نحوٍ خاص المشروع Node.js (وهو موضوع الفصل ٢٠) الذي يوفِّر بيئة قويَّة للبرمجة بالجافا سكربت خارج المُتَصَفِّحات.