تعرفنا في المقال السابق على مفهوم الذكاء الاصطناعي وناقشنا فكرة خطر الذكاء الاصطناعي ونكمل في هذه السلسلة برمجة الذكاء الاصطناعي الحديث عن البرمجة والتعرف عليها وعلى الخوارزميات المرتبطة بها ونبحث علاقتهما بالذكاء الاصطناعي.
ما هي البرمجة؟
إذا كنت تتوقع زيارة صديق لك، فقد تكتب له عنوانك بالكامل، وإذا كان العنوان صعب الوصول، فمن الممكن أن تكتب العنوان له على صورة مجموعة من التعليمات للوصول إلى منزلك مثل:
- عندما تصل إلى ناصية الشارع، اتجه إلى اليمين
- امش عشر خطوات، ثم اتجه إلى اليمين مرةً أخرى
- اُدخل أول منزل من جهة اليسار
- اصعد إلى الدور الثاني
فالبرمجة هي الشيء نفسه تمامًا مع الحاسوب، فبدلًا من الخطوات السابقة، تُكتب تعبيرات مشابهة تخاطب الحاسوب بلغة برمجة لتنفيذ مهمة مشابهة بدلًا من صديقك السابق.
تُعَدّ لغات البرمجة مجموعةً من المفردات والقواعد اللغوية التي تمثِّل لغةً وسيطةً للتخاطب مع الحاسوب وأمره بتنفيذ تعليمات وأمور محدَّدة، فلا الحاسوب يفهم لغة البشر، ولا البشر يفهمون لغة الحاسوب، إذ لا تخرج لغة الحاسوب في الأصل خارج حدود الصفر والواحد، وهي الشحنة الكهربائية الموجبة والشحنة الكهربائية السالبة، لكن لا أحد يستطيع التعامل مباشرةً مع تلك اللغة؛ لذا كانت هنالك حاجة ملحة لوجود لغة وسيطة يفهمها كلا البشر والآلة؛ ونتيجةً لذلك فقد اُخترعت لغات البرمجة، وهي نوعان منخفضة المستوى وعالية المستوى.
إذا أردنا أمر الحاسوب بالأمر "افعل كذا" بعبارة أخرى، فسنحتاج إلى لغة مشتركة بيننا وبينه ليفهم ما نبتغيه، وهنا يأتي دور لغات البرمجة، إذ يمكنك عَدّ لغات البرمجة بأنها الوسيط بين المبرمج والحاسوب، فوحدة المعالجة المركزية للحاسوب CPU غير قادرة على التحدث بأية لغة في الأصل غير لغتها لغة الآلة، وفيما يلي نموذج من تعليمة تعريف متغير يحوي القيمة 97 في لغة الآلة:
10110000 01100001
كان على المبرمجين كتابة برامج مباشرة بلغة الآلة عندما اختُرِعت أجهزة الحاسوب لأول مرة، وهو أمر صعب للغاية ويستغرق وقتًا طويلًا، فكيفية تنظيم هذه التعليمات هو أمر خارج نطاق هذه السلسلة، ولكن من المثير للاهتمام ملاحظة أمرين، أولًا هو أن تكون لغة الآلة كلها تسلسلًا من 1 و0 فقط، إذ يُطلق على كل رقم 0 أو 1 برقم ثنائي binary digit أو اختصارًا بت Bit، كما يختلف عدد وحدات البت Bit أو الأرقام الثنائية التي تكوِّن أمرًا واحدًا، فبعض وحدات المعالجة المركزية CPU مثلًا تعالِج تعليمات يبلغ طولها دائمًا 32 Bit، في حين تحتوي بعض وحدات المعالجة المركزية الأخرى على تعليمات يمكن أن يكون طولها متغيرًا؛ أما ثانيًا، فتُفسَّر كل مجموعة من الوحدات من وحدة المعالجة المركزية للحاسوب لأداء أمر دقيق جدًا فقط مثل موازنة عددين، أو تخزين عدد أو نص في الذاكرة …إلخ.
الجدير بالذكر أنّ كل شيفرة تنفيذية أو ثنائية -نسبة إلى الأرقام الثنائية- تعمل على وحدة معالجة مركزية ما ولا تعمل على غيره إلا إن كانت المعالجات تشترك بتعليمات التنفيذ نفسها منخفضة المستوى، ما يعني أنه ليعمل برنامجك المكتوب بلغة الآلة على حاسوب معالجه مختلفة، من المرجح أن يتطلب الأمر مجهودًا مضنيًا، وإعادة كتابة أجزاء كبيرة من الشيفرة لملاءمة حزمة التعليمات التي تفهمها وحدة المعالجة المركزية للحاسوب الآخر.
ونظرًا لصعوبة قراءة لغة الآلة وفهمها لأنها مكتوبة بأرقام ثنائية فقط أصفار وواحدات، فقد اختُرِِعت لغة التجميع Assembly Language، بحيث تُحدَّد كل تعليمة باختصار قصير بدلًا من مجموعة من الأرقام الثنائية، كما يمكن استخدام الأسماء والأرقام الأخرى، وإليك التعليمة السابقة المذكورة أعلاه بلغة الآلة مكتوبة بلغة التجميع:
mov al, 061h
يجعل هذا من لغة التجميع أسهل بكثير للقراءة والكتابة من لغة الآلة، ومع ذلك لا يمكن لوحدة المعالجة المركزية فهم لغة التجميع مباشرةً، حيث يجب ترجمتها إلى لغة الآلة بدلًا من ذلك وقبل تمكِّن الحاسوب من تنفيذه، وذلك باستخدام برنامج يسمى المُجمِّع Assembler، فالبرامج المكتوبة بلغات التجميع تكون سريعةً للغاية غالبًا، ولا تزال لغة التجميع مستخدَمةً إلى اليوم عندما تكون السرعة مطلوبةً ومهمةً في برمجة بعض البرامج.
تملك لغة التجميع مع ذلك بعض السلبيات، أولًا: لا تزال لغة التجميع تتطلب الكثير من التعليمات للقيام بمهام بسيطة، في حين أن التعليمات الفردية نفسها قابلة للقراءة إلى حد ما، إلا أنّ فهم ما يفعله البرنامج بأكمله يمكن أن يمثِّل تحديًا يشبه إلى حد ما محاولة فهم جملة من خلال النظر إلى كل حرف على حدة؛ أما ثانيًا، فلغة التجميع لا تزال غير متكيّفة، فمن المحتمل ألا يعمل برنامج مكتوب بلغة التجميع لوحدة معالجة مركزية معينة على وحدات معالجة مركزية أخرى، إذ يجب إعادة كتابة البرنامج أو تعديله على نطاق واسع.
طُوِّرت لغات برمجة جديدة مثل C ولغة C++ ولغة PascalK ولاحقًا لغات مثل جافا Java وجافاسكربت Javascript وبيرل Perl وبايثون Python لمعالجة مشكلات قابلية القراءة وإمكانية النقل والتنفيذ على وحدات معالجة مركزية مختلفة، حيث تسمى هذه اللغات بلغات عالية المستوى، وذلك لأنها مصممة للسماح للمبرمج بكتابة البرامج دون الحاجة إلى القلق بشأن نوع الحاسوب الذي سيُشغَّل البرنامج عليه، فتُكتب التعليمة السابقة بلغة C ومثلها في لغة بايثون:
a = 97
يجب تحويل البرامج المكتوبة بلغات عالية المستوى إلى لغة يمكن للحاسوب فهمها قبل تشغيل البرنامج مثل البرامج المكتوبة بلغة التجميع والآلة، وهناك طريقتان أساسيتان للقيام بذلك هما التصريف Compiling والتفسير Interpreting، فالمصرِّف Compiler هو برنامج يقرأ الشيفرة المصدرية وينتج برنامجًا منفصلًا قابلًا للتنفيذ يمكن تشغيله بعد ذلك بمجرد تحويل الشيفرة الخاصة بك إلى ملف قابل للتنفيذ، إذ لا تحتاج إلى المترجِم لتشغيل البرنامج، كما كانت برامج المصرِّفات Compilers رديئةً في البداية وتنتج برامجًا بطيئةً للغاية، ولكن على مر السنين أصبحت برامج المترجِمات سريعةً جدًا.
تستطيع التعرُّف في الصورة السابقة على خطوات إنتاج وتشغيل البرامج المُبرمَجة بلغات عالية المستوى والتي تستخدِم هذا النظام؛ أما المفسِّر Interpreter فهو برنامج ينفِّذ التعليمات الموجودة في الشيفرة البرمجية مباشرةً دون الحاجة إلى تجميعها في ملف تنفيذي أولًا، فبرامج التفسير غالبًا أكثر مرونةً من برامج المصرِّفات لكنها أقل كفاءة عند تشغيل البرامج، وذلك لأن عملية التفسير تحتاج إلى تنفيذ في كل مرة يُشغَّل فيها البرنامج، وهذا يعني أنّ المفسِّر مطلوب في كل مرة يُشغَّل فيها البرنامج.
يوضِّح الشكل السابق خطوات إنتاج وتشغيل البرامج المُبرمَجة بلغات عالية المستوى التي تستخدِم نظام التحويل للغات منخفضة المستوى.
علاقة البرمجة بالذكاء الاصطناعي وتعلم الآلة
لا تزيد نماذج الذكاء الاصطناعي وتعلّم الآلة عن كونها خوارزميات رياضية تستطيع كتابتها والتعبير عنها على الورق، لكن عندما يتعلق الأمر بتجربة تلك الخوارزميات على أرض الواقع، فإنّ البرمجة هي الوسيلة لتطبيق تلك الخوارزميات، فالمبرمج عادةً هو شخص مهمته صناعة برامج تحل مشكلةً ما بكتابة شيفرة تتكون من عدة خوارزميات، وقد لا يتطلب الأمر خوارزميةً ذكيةً في أغلب الأحيان، ولكن قد يتطلب العمل في بعض البرامج تنفيذ خوارزمية ذكية للتوقع كما يتوقع الإنسان مثلًا أو لأي مهمة أخرى تتطلب ذكاءً بشريًا، إذ يحتاج المبرمج في تلك الحالة إلى خوارزمية ذكاء اصطناعي للتوقُّع مثل الإنسان ليستطيع ترجمة رموزها الرياضية إلى شيفرة برمجية.
الجدير بالذكر أنّ الكثير من الشركات الناشئة التي تدَّعي أنها مدعومة ببرامج وخوارزميات ذكاء اصطناعي مبهرة ليست كذلك بالفعل، ولكنها فقط تدعي ذلك للحصول على التمويل ولأغراض تسويقية كما بيَّنا من قبل عن شركة Hanson Robotics مثلًا، وذلك بناءً على دراسة أجرتها شركة MMC Ventures، فغالبًا ما تكون خوارزميات الذكاء الاصطناعي مجموعةً من الخطوات، وكل خطوة فيها مجموعة من المعادلات الرياضية على بعض المدخلات التي تأتي من الحاسوب أو من البرنامج، وتختلف المعادلات كثيرًا في فحواها وهدفها، وبالتالي تُعَدّ البرمجة حلقة الوصل بين باحثي الذكاء الاصطناعي وبين تطبيق واختبار خوارزمياتهم ومعادلاتهم الرياضية على أرض الواقع.
الخوارزميات في علوم الحاسوب والبرمجة
الخوارزميات كما من اسمها مشتقة من اسم العالم المسلم أبو جعفر محمد بن موسى الخوارزمي، وهو من مدينة خوارزم المشتقة منها كنيته، وخوارزم حاليًا مكان مقسم بين ثلاث دول وهي: أوزباكستان، وكازاخستان، وتركمانستان.
يعتبر من أوائل علماء الرياضيات المسلمين، حيث ساهمت أعماله بدور كبير في تقدم الرياضيات في عصره. اتصل بالخليفة العباسي المأمون، وعمل في بيت الحكمة في بغداد، وكسب ثقة الخليفة إذ ولاه المأمون بيت الحكمة، كما عهد إليه برسم خارطة للأرض عمل فيها أكثر من سبعين جغرافيًا.
قبل وفاته في عام 850م/232هـ المُقدَّر كان الخوارزمي قد ترك العديد من المؤلفات في علوم الرياضيات والفلك والجغرافيا، ومن أهمها: كتاب المختصر في حساب الجبر، والمقابلة الذي يعد أهم كتبه. تُرجمت كتبه بعد ذلك من قبل علماء أوروبا، وتم ترجمة بعض المصطلحات التي كانت شبيهة بشكل كبير للعربية، مثل كلمة الجبر التي تُرجمت إلى Algebra.
يُعَدّ البرنامج الحاسوبي سلسلةً من التعليمات المكتوبة باستخدام لغة البرمجة لأداء مهمة محدَّدة بوساطة الحاسوب، ويوجد مصطلحان مهمان يجب إيضاحهما هما سلسلة التعليمات instructions ولغة البرمجة programming language، ففي المثال الذي ذكرناه في بداية هذا المقال الذي يقول إذا كنت تنتظر صديقًا لك ليزورك، فإنّ التعليمات التي ذكرناها من الممكن كتابتها على الصورة التالية:
عندما تصل إلى ناصية الشارع:
- اتجه إلى اليمين
- امش عشر خطوات
- اتجه إلى اليمين مرةً أخرى
- اُدخل أول منزل من جهة اليسار
- اصعد إلى الدور الثاني
تُعَدّ سلسلة التعليمات أعلاه في الواقع برنامجًا بشريًا مكتوبًا باللغة العربية، والذي يرشِد إلى كيفية الوصول إلى بيتك من نقطة بداية معينة، كما يمكن كتابة تلك السلسلة باللغة الإسبانية أو الهندية أو الإنجليزية أو أيّ لغة بشرية أخرى بشرط معرفة الشخص الذي يسعى للحصول على التوجيه أيًا من تلك اللغات، وكذلك هو الأمر في الحاسوب، فالبرنامج الحاسوبي هو مجموعة من التعليمات المكتوبة بلغة برمجية ينفِّذها الحاسوب، وفيما يلي مثال عن تعليمة مكتوبة بلغة بايثون، وهي أمر للحاسوب بطباعة جملة Hello World على الشاشة.
print("Hello World")
يمكن أن يتكون البرنامج الحاسوبي من سطر أو تعليمة واحدة إلى ملايين من السطور؛ أما سلسلة التعليمات المكتوبة بلغة برمجة معينة هي ما تُدعى الشيفرة المصدرية للبرنامج source code؛ أما من وجهة نظرالبرمجة الخوارزمية، فهي مجموعة من الخطوات لحل مشكلة ما، ويُعبِّر عنه على أساس مجموعة محدودة من التعليمات، كما أنّ كل تلك التعليمات يمكن تطبيقها والتعبير عنها بلغة البرمجة، كما لا ترتبط الخوارزمية بلغة برمجة معينة، فالخوارزمية هي خطوات مجرَّدة يمكن حتى كتابتها باللغة البشرية ومن ثم تطبيقها بأيّ لغة برمجة مع الأخذ في الحسبان بأنّ كلمة الخوارزمية في البرمجة لها بعض الشروط وهي:
- الخلو من الغموض: من المهم أن تكون كل خطوة أو كل تعليمة من تعليمات الخوارزمية واضحةً وضوحًا كبيرًا ولا تحمل أكثر من معنى مثل قولنا في تعليمة ما "اجمع س مع ص"، لا أن نقول في إحدى التعليمات "جرب تقريبًا جمع أو طرح س مع ص".
- المخرجات: من المهم أن تُنتج الخوارزمية على الأقل مخرجًا واحدًا نتيجةً واحدةً، فخوارزمية للتوقع مثلًا يجب عليها إنتاج ناتج ما لعملية التوقع في النهاية حتمًا.
- منتهية في نقطة ما: من الضروري انتهاء عمل الخوارزمية بعد إنتاج المخرجات المطلوبة، فلا خوارزمية تعمل بصورة مستمرة إلى الأبد.
- الجدوى/إمكانية التطبيق: يجب أن تعمل الخوارزمية بناءً على الموارد المتاحة، بمعنى أنه لا يمكننا تطبيق خوارزمية تتطلب ذاكرةً تخزينيةً لا يُمكن إنتاجها بالفعل مثل طلب تخزين عدد ذرات الكون.
- الاستقلالية: من الضروري أن تكون الخوارزمية مستقلة عن لغات البرمجة، أي يمكن تطبيقها بأيّ لغة برمجة، فلا يمكن مثلًا أن تعتمد الخوارزمية على مكتبة جاهزة للاستخدام موجودة في إحدى لغات البرمجة، إذ يؤدي ذلك إلى الاعتماد اعتمادًا كليًا على تلك المكتبة، فلا يمكن للخوارزمية أن تعمل على أية لغة برمجة أخرى.
تتكون الخوارزمية من خطوات عدة كما ذكرنا، وتتكون كل خطوة من تعليمة واضحة، كما توجد طرق محدَّدة لتقييم أداء الخوارزمية وتحليلها، وتلك الخطوات مهمة للغاية في حالة خوارزميات الذكاء الاصطناعي، لأن خوارزميات الذكاء الاصطناعي غالبًا ما تطلب في كل تعليمة عددًا ضخمًا جدًا من العمليات الرياضية التي تستهلك الكثير من موارد الحاسوب، ولذلك يلجأ الكثير من مبرمجي تعلّم الآلة والذكاء الاصطناعي إلى استئجار حاسوب فائق الإمكانات عبر الانترنت لتشغيل الخوارزميات، لذلك يُعَدّ تقييم وتحليل أداء الخوارزمية أمرًا مهمًا للباحثين.
توجد طريقتان لتحليل الخوارزميات وهما تحليل نظري مسبَق يفترض جميع العوامل ويفترض أداء الخوارزمية بناءً على الموارد المتاحة في الحاسوب، وتحليل متقدِّم وهو تحليل تجريبي، فبعد تنفيذ الخوارزمية على حاسوب معيَّن بإمكانات معينة، تُجمَّع بيانات حقيقية في تلك الحالة مثل الوقت الذي مرَّ منذ بدء تشغيل الخوارزمية والمساحة المستخدَمة من الذاكرة من قبلها أيضًا، كما يتم حساب وتحليل أداء الخوارزمية حسب عاملين رئيسيين كما ذكرنا وهما الوقت المُستهلك في تنفيذ الخوارزمية على الحاسوب ومساحة ذاكرة الوصول العشوائية RAM القصوى المطلوبة لتعمل الخوارزمية بكفاءة.
يهمنا مما سبق فهم أنّ خوارزميات الذكاء الاصطناعي مثلها مثل باقي الخوارزميات، فهي في الأساس مستقلة عن لغات البرمجة، وهي خوارزميات لديها مدخلات Inputs وتنتهي إلى استخراج مخرجات أو نتائج Outputs، كما تتكون كل تعليمة من تعليمات الخوارزمية من خطوات واضحة ويكون معظمها عمليات رياضية في الغالب، ويمكن تنفيذ جميعها بأيّ لغة برمجة، ومن الجدير بالذكر أنه بالرغم من إمكانية تطبيق أيّ خوارزمية بأيّ لغة برمجة، إلا أنّ ذلك يتطلب من المبرمج فهمًا دقيقًا وعميقًا لكل خطوة من خطوات الخوارزمية ليستطيع تطبيقها حسب اللغة التي يجيدها، لكن يتطلب ذلك من المبرمج فهمًا عميقًا للرياضيات المستخدَمة في معادلات الذكاء الاصطناعي أيضًا لكي يستطيع تطبيقها بلغة البرمجة التي يجيدها.
وليس كذلك هو الحال في جميع لغات البرمجة، إذ طوَّر مبرمجون كثر من مجتمع بايثون حول العالم مكتبات جاهزة للاستخدام تحتوي على دوال Functions جاهزة للاستدعاء فيها الكثير من خوارزميات تعلّم الآلة، أي أنه يمكن لمبرمج بايثون استخدام تلك المكتبات بدلًا من كتابة الخوارزميات بنفسه، لأن ذلك يتطلب كما أوردنا فهمًا عميقًا لكل خطوة من خطوات الخوارزمية التي تحتوي على الكثير من الرياضيات المعقَّدة، لذلك تستطيع تلك المكتبات توفير لك الكثير من المجهود في معظم الأحيان لكي تستطيع استخدام خوارزميات الذكاء الاصطناعي بسهولة دون الدخول في تفاصيل ما يحصل فيما وراء الأحداث.
مع ذلك تملك تلك الطريقة عيوبًا لا تخفى على أحد، فالمبرمج إذا لم يكن مدركًا إدراكًا قويًا لما يحدث وراء الأحداث -أي في الخوارزمية وخطواتها-، وقد تكون نتائج الخوارزمية غير مرضية له على الإطلاق، فخوارزميات الذكاء الاصطناعي وتعلّم الآلة عادةً لها الكثير من المتغيرات التي تتحكم تحكمًا كبيرًا في دقة عمل الخوارزمية ودقة استنتاجاتها، لذلك ينصح الخبراء المبرمجين والمطورين بدراسة الخوارزميات دراسةً عميقةً، ودراسة الرياضيات المطلوبة لذلك على قدر المستطاع حتى يتمكن المبرمج من فهم تلك المتغيرات التي تلعب دورًا مفصليًا في دقة برنامجه.
لماذا تعلم البرمجة مهم
تُعَدّ البرمجة حلقة الوصل بين باحثي الذكاء الاصطناعي وبين تطبيق أبحاثهم على أرض الواقع كما أوردنا، لذلك يلعب المبرمجون دورًا مفصليًا في مجال الذكاء الاصطناعي، كما أنّ البرمجة من أفضل المهن من النواحي المستقبلية، فلا يخفى على أحد التحوّل التقني السريع الذي يحدث حول العالم، فالتقنية المعتمدة على الحواسيب والحوسبة اليوم هي عصب حياتنا ودخلت في عمق تفاصيل يومياتنا ولا يخفى ذلك على الناس، فمهن البرمجة أصبحت من أكثر المهن طلبًا، وستصبح أكثر طلبًا بمرور الزمن بالطبع.
اقرأ أيضًا
- المقال السابق: الذكاء البشري مقابل الذكاء الاصطناعي
- تعلم البرمجة
- تعلم الذكاء الاصطناعي
- فوائد البرمجة
- المدخل الشامل لتعلم علوم الحاسوب
- النسخة الكاملة من كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.